Java进阶之路04-(常用类2.集合1)

文中关键字:对象数组   Calendar类    Date类    Math类    正则表达式    Collection 集合    List集合    Character类

对象数组:存储对象的一个数组



Student[] student = new Student[5] ;建立一个名为student的Student数组,数组容量为5;


Arrays:针对数组操作的工具类  (提供了一些针对数组排序和二分搜索法)
public static String toString(int[] a):可以将int类型的数组转换成字符串 ([元素1,元素2,元素3...])
public static void sort(int[] a)对指定的 int 型数组按数字升序进行排序
public static int binarySearch(int[] a,int key):二分搜索法: 在int类型的数组中查找key元素的索引
***************************************************************************************************************
Calendar类:日历类
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,
 并为操作日历字段(例如获得下星期的日期)提供了一些方法

是一个抽象类,如何实例化?
public static Calendar getInstance() :通过一个静态功能来创建日历了对象
 --------------------------------------------------------------------------------------------------------------
Calendar中的两个常用方法:
public abstract void add(int field,int amount)根据日历的规则,为给定的日历字段添加或减去指定的时间量 
(这个方法常用)

public final void set(int year, int month,int date)设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
 ---------------------------------------------------------------------------------------------------------------
 需求:获取任意一年的二月有多少天  (改进:键盘录入一个年份)


分析:
1)键盘录入任意一个年份
2)创建日历类对象
3)设置年月日
set(录入year,2,1) ; //实际是3月1日
4)再利用add(int field,int amount) : 在这里只需要将日期往前退一天即可
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
import java.util.Calendar;//导包
 
public static void main(String[] args) {//程序只包含了main部分和方法部分

//算出当前时间
Calendar c = Calendar.getInstance() ;

//年
int year = c.get(Calendar.YEAR) ;

//月
int month = c.get(Calendar.MONTH) ;

//日
int date =  c.get(Calendar.DATE) ;

System.out.println(year+"年"+(month+1)+"月"+date+"日");

//需求:3年前的今天
/* c.add(Calendar.YEAR, -3);
//获取年
year = c.get(Calendar.YEAR) ;
System.out.println(year+"年"+(month+1)+"月"+date+"日");*/

//需求:5年后的10天前
c.add(Calendar.YEAR, 5); 
c.add(Calendar.DATE, -10);

//获取年
year = c.get(Calendar.YEAR) ;
date = c.get(Calendar.DATE) ;
System.out.println(year+"年"+(month+1)+"月"+date+"日");

System.out.println("------------------------------");
//public final void set(int year, int month,int date)设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
c.set(2018, 5,20);
// 获取年
year = c.get(Calendar.YEAR);
// 获取月
month = c.get(Calendar.MONTH);
// 获取日
date = c.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
}
*************************************************************************************************************
System 类包含一些有用的类字段和方法。它不能被实例化。 
常用的方法:
public static void gc()运行垃圾回收器。 
public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;  一般情况,需要终止
Jvm,那么参数0
public static long currentTimeMillis()返回以毫秒为单位的当前时间
public static void arraycopy(Object src,int srcPos, Object dest,int destPos, int length)
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束
src:原数组
dest:目标数组
srcPos :从原数组的哪个位置开始
destPos:到目标数组的哪个位置结束
length:长度

final,finally,finalize的区别
之前的文章中有提到过,有需要可查看之前的文章
 -----------------------------------------------------------------------------------------------------------
Date类:(重点)
  类 Date 表示特定的瞬间,精确到毫秒
 
构造方法:
  public Date()表示分配它的时间(精确到毫秒)。
  public Date(long date):创建一个日期对象,指定毫秒值 (需要将long 时间毫秒值转换成Date对象)


public void setTime(long time):设置毫秒值
public long getTime():将Date--->long的毫秒值
 ----------------------------------------------------------------------------------------------------------
 重点:Date的日期格式和日期的文本格式:String类型 之间进行转换


Date---->String(格式化)
 


String-->Date(解析)


中间的转换:使用中一个中间类:DateFormat,并且DateFormat是一个抽象类,抽象意味着不能实例化,所以应该考虑用它的子类:
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。


SimpelDateFormat的构造方法:
public SimpleDateFormat(String pattern) :构造一个SimpleDateFormat对象,根据pattern(模式:规则)

SimpleDateFormat sdf = new SimpleDateFormat("xxx年xx月xx日") ;


日期和时间模式
 
*   年: yyyy
*   月: MM
*   日: dd
*  
*   时: hh
*   分: mm
*   秒: ss


实际开发中:牵扯时间的东西,经常Date--String  String--Date
 ----------------------------------------------------------------------------------------------------------
 *例题:
 键盘录入你的出生年月日,算一下你来到这个世界多少天? 


分析:
1)创建键盘录入对象,录入一个数据出生年月日
2)1990-xx-xx
3)将文本格式的数据解析成日期对象
4)getTime() ; 获取出生所在日期的时间毫秒值
5)获取当前系统时间毫秒值
(6) 5)-4) =  long time


6)换算
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
import java.text.ParseException;//导包


public static void main(String[] args) throws ParseException {
//创建键盘录入对象

/*try {   //捕获异常(IO流异常类说到)

} catch (ParseException e) {
e.printStackTrace(); //将代码出现的原因以及多少行会打印在控制台上,try catch方法是一种捕获异常的方法
}*/

Scanner sc = new Scanner(System.in) ;

//录入数据
System.out.println("请输入您的出生年月日:");
String str = sc.nextLine() ; //yyyy-MM-dd

//创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
Date date = sdf.parse(str) ;

//获取出生年月所在的系统时间
long oldTime = date.getTime() ;

//在获取当前系统时间的毫秒值
long newTime = System.currentTimeMillis() ;

long time = newTime - oldTime ;

long day = time/1000 /60 /60 /24 ;
System.out.println("您来到世间已经有:"+day+"天");
}
----------------------------------------------------------------------------------------------------------
Date和Stirng文本格式进行相互转换的工具类


import java.text.ParseException;//导包
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)


//无参构造私有化
private DateUtil() {

}

/**
* 这是一个将Date的日期格式转换成日期的文本格式
* @param format  模式
* @param d      需要被格式化的Date格式
* @return 返回的就是日期的文本格式
*/
public static String dateToString(String format,Date d) {
//最简单的写法
/*SimpleDateFormat sdf = new SimpleDateFormat(format) ;
String s = sdf.format(d) ;
return s ;*/
//链式编程
return new SimpleDateFormat(format).format(d) ;
}

/**
* 这是一个将字符串文本日期格式转换Date的日期格式的功能
* @param format  模式
* @param s  需要被解析的日期文本格式
* @return 返回的就Date日期格式
* @throws ParseException 解析如果出问题了,就会有这个异常
*/
public static Date stringToDate(String format,String s) throws ParseException {

return new SimpleDateFormat(format).parse(s) ;
}
  *********************************************************************************************************
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。  
常用的方法:
public static int abs(int a):绝对值
public static double ceil(double a):向上取整
public static double floor(double a):向下取整
public static int max(int a,int b):求最大值
public static int min(int a,int b):求最小值
public static double pow(double a,double b):a的b次幂
public static double random()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0
public static int round(float a):四射五入
public static double sqrt(double a):一个数的正平方根


JDK5的特性:静态导入(导入方法的级别)
----------------------------------------------------------------------------------------------------------
Random:是一个可以获取随机数的类

public Random():无参构造方法
public Random(long seed) :指定long类型的数据进行构造随机数类对象 
public int nextInt():获取随机数,它的范围是在int类型范围之内
public int nextInt(int n):获取随机数,它的范围是在[0,n)之间
 ---------------------------------------------------------------------------------------------------------
/**
 *需求:键盘录入一个qq号码,需要校验QQ号码
 * 要求: 1)5~15的数字组成
 * 2)不能以0开头
 *分析:
 * 1)键盘录入一个QQ号码
 * 2)写一个校验的功能  ,返回值是boolean
 * 3)在里面针对进行判断
 *
 *
 *邮箱校验非常复杂的校验
 *
 *引入正则表达式
 */
import java.util.Scanner;//导包


代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;

//接收数据
System.out.println("请输入一个QQ号码:");
String QQ = sc.nextLine() ;

//调用校验的功能
boolean flag = checkQQ(QQ) ;
System.out.println(flag);
}

public static boolean checkQQ(String qq) {
//假设 :返回值是true
boolean flag = true ;

//进行判断
//1) 5-15的
if(qq.length()>=5 && qq.length()<=15) {
//符合了长度之后,并且不能以0开头
if(!qq.startsWith("0")) {

//符合了之后,但是数字
//将字符串转换成字符数组
char[] chs = qq.toCharArray() ;
//遍历出来
for(int x = 0 ; x <chs.length ; x ++) {
//获取到每一个字符
char ch = chs[x] ;
//在for循环来判断是否是数字:Character 有一个方法:isDigit()
if(!Character.isDigit(ch)) {
flag = false ;
break ;
}
}
}else {
flag = false ;
}
}else {
flag  = false ;
}

return flag ;
}
************************************************************************************************************
字符


x x字符
\\ 反斜线字符
\t 制表符 
\n 换行符
\r 回车符 


字符类:
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) 

预定义字符类:
. 任何字符 如果本身就是. \. qq.com 写正则表达式(\\.) 
\d 数字:[0-9] 写正则表达式 :\\d
\w 单词字符:[a-zA-Z_0-9]:字母大小写,数字字符 \\w


边界匹配器:
^ 行的开头 
$ 行的结尾 
\b 单词边界 尾 (helloword?haha:world)


Greedy 数量词(重点)
X? X,一次或一次也没有 
X* X,零次或多次 
X+ X,一次或多次 
X{n} X字符恰好出现n次
X{n,} X字符至少出现n次
X{n,m} X字符至少出现n次,但不超过m次

***********************************************************************************************************
/**
 * 自己校验:手机号码
 * 定义规则:
 * 136....
 * 13689257284
 * 13688886666
 * 16586898586
 * ....
 *
 *
 */
import java.util.Scanner;//导包
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)


public static void main(String[] args) {

//创建键盘录入对象

Scanner sc = new Scanner(System.in) ;

//接收数据
System.out.println("请输入一个手机号码:");
String phone = sc.nextLine() ;


//定义正则规则
String regex = "1[36]\\d{9}" ;
//1为开头[36]:3或者6占一位,后面\\d表示数字0-9,{9}:占9位;

boolean flag = phone.matches(regex) ;
System.out.println(flag);
}
-----------------------------------------------------------------------------------------------------------
public String replaceAll(String regex,String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 
需求:
/**
 *关于模式和匹配器典型调用基本顺序
 *
 * Pattern和Matcher
 *
 */


import java.util.regex.Matcher;//导包
import java.util.regex.Pattern;//导包
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)


public static void main(String[] args) {
//1)将正则表达式编译成一个模式对象
//public static Pattern compile(String regex)将给定的正则表达式编译到模式中
Pattern p = Pattern.compile("a*b") ;
//2)通过模式对象,构造一个匹配器对象(Matcher对象)
// Matcher matcher(String input)  :模式对象转换成匹配器对象
Matcher m = p.matcher("aaaaaab") ;
 
//3)匹配器对象有一个方法:machers() ; 直接对当前字符串数据进行校验,返回boolean
//public boolean matches()
boolean flag = m.matches() ;
System.out.println("flag:"+flag);
 
System.out.println("-------------------------");
 
//如果单纯的判断字符串是否符合正则规则,上述代码非常麻烦,
String regex = "a*b" ;
String str = "aaaaab" ;
 
boolean flag2 = str.matches(regex) ;
System.out.println("flag2:"+flag2);
}
----------------------------------------------------------------------------------------------------------
/**
 *键盘录入邮箱,校验邮箱
 * 邮箱:
 * qq邮箱
 * 126邮箱
 * 163邮箱
 * 新浪微博邮箱
 * 企业邮箱 
 * [email protected]
 * [email protected]
 * [email protected]
 *
 */
import java.util.Scanner;//导包
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)


public static void main(String[] args) {

//创建键盘录入对象
Scanner sc =new Scanner(System.in) ;

//接收数据
System.out.println("请输入一个邮箱:");
String email = sc.nextLine() ;

//定义正则规则
//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]+){1,4}" ;
String regex = "\\w+@\\w{2,6}(\\.\\w+){1,4}";
boolean flag = email.matches(regex) ;
System.out.println("flag:"+flag);
}


--------------------------------------------------------------------------------------------------------------------
/**
 *  需求:我有如下一个字符串:"91 27 46 38 50"
 *  请写代码实现最终输出结果是:"27 38 46 50 91" 
 *  
 *  分析:
 *   1)定义这样一个字符串
 *   2)将字符串进行分割,返回字符串数组
 *   3)将字符串数组变成int类型的数组
 *   4)将int类型中的元素拼成字符串类型
 *   5)输出即可
 *
 */
import java.util.Arrays;//导包
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)

public static void main(String[] args) {

//定义一个字符串:
String s = "91 27 46 38 50" ;

//将字符串进行分割,返回一个字符串数组
String[] strArray = s.split(" ") ;

//将字符串变成int类型数组
int[] arr = new int[strArray.length] ;

//遍历arr数组
for(int x = 0 ; x <arr.length ;x ++) {
arr[x] = Integer.parseInt(strArray[x]) ;
}

//排序:直接用Arrays工具类
Arrays.sort(arr); 

//创建一个字符串缓冲区:
//StringBuilder
StringBuilder sb = new StringBuilder() ;
//遍历int类型数组
for(int x = 0 ; x < arr.length ; x ++) {
sb.append(arr[x]).append(" ") ;
}

//还需将StringBulider转换字符串
String result = sb.toString().trim() ;
System.out.println("result:"+result);
}
*********************************************************************************************************
集合的由来?
学生的面向对象语言,面向对象语言对事物的描述是通过对象体现的,需求:需要来存储多个对象.
要存储多个对象,不能使用基本类型的变量,需要使用容器类型的变量? 学习过哪些容器变量? 数组 ,字符串缓冲区(StringBuffer)
对于字符串缓冲区来说,在内存中始终存储的是字符串,不能满足要求;数组呢,数组的长度是固定的,不符合长度编号的要求,所有Java提供了一个
Collection 集合;


面试题:
数组和集合的区别?
1)长度区别:
数组长度固定
集合长度可变
2)内容的区别
数组可以存储同一种类型的元素 String[] str = {"hello","world","java",100} ; 错误的
  集合可以存储多种类型的元素
3)存储类型的区别
数组:可以存储基本类型,也可以存储引用类型
集合:只能存储引用类型


集合:Collection:
子接口有两个,两个子接口分别对应多个子实现类,多个集合数据结构不同,但是他们有共性内容,将共性内容抽取出来,就可以集合继承体系图!
interface extends Collection{//集合接口的实现类
  就可以使用Collection集合的功能
}
 
Collection有两个子接口:
List Set


迭代器:Iterator iterator() ;
存储字符串数据,并遍历


Collection:
Collection 层次结构 中的根接口。
Collection 表示一组对象,这些对象也称为 collection 的元素。
一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
JDK 不提供此接口的任何直接实现:它提供更具体的子接口,更具体的实现类
基本功能:
添加功能:
boolean add(Object e)
删除功能:
void clear() :删除集合中所有元素(暴力删除)
boolean remove(Object o):删除集合中的指定元素
判断功能:
boolean contains(Object o):集合中是否包含指定的元素
获取功能:
int size() :获取集合中的元素数


交集功能:
boolean retainAll(Collection c) :A集合对B集合取交集元素  
思考:boolean 表达的是什么意思,交集的元素是去A集合还是去B集合中
结论:A集合对B集合取交集,交集的元素要去A集合中.
boolean返回值表达的A集合的元素是否发生变化,如果发生变化,则返回true,否则,返回false.
删除一个集合中所有元素:
boolean removeAll(Collection c):删除一个集合中所有元素: 
思考: 删除一个元素算是删除还是删除所有算是删除?
结论:删除一个算是删除...


转换功能:
Object[] toArray() :将集合转换成数组


Colleciton的集合的高级功能:
boolean addAll(Collection c)  :添加一个集合中的所有元素
boolean containsAll(Collection c):包含所有元素算是包含,还是包含一个算是包含
结论:包含所有算是包含
 --------------------------------------------------------------------------------------------------------------
List集合的特点:
有序的 (存储和取出一致),可以允许重复元素
Set集合的特点:
无序性(不能保证迭代的顺序,基于hashMap),并且元素不能重复
重点说一下List;
--------------------------------------------------------------------------------------------------------------
List集合的特有功能:
添加功能
void add(int index,Object element):在指定位置处添加指定元素
获取功能
Object get(int index)返回列表中指定位置的元素。
ListIterator listIterator():列表迭代器
删除功能:
Object remove(int index):删除指定位置处的元素
修改功能:
Object set(int index, Object element):用指定element元素替换掉指定位置处的元素
--------------------------------------------------------------------------------------------------------------
List集合有三个子实现类:
ArrayList
底层数据结构式数组结构,查询块,增删慢
从内存角度考虑:线程不安全的,不同步的,执行效率高

多线程:synchronized :同步的意思 解决线程安全问题
sychronized(锁对象){ 同步代码 
共享数据;
}

解决线程安全问题,通过同步可以解决,但是效率低了...
LinkedList
:底层数据结构式链表结构,查询慢,增删块
从内存角度考虑:线程不安全,不同步,执行效率高
Vector:
这是一个线程安全的类,
底层数据结构是数组:查询快,增删慢
线程安全的,同步,执行效率低!
-------------------------------------------------------------------------------------------------------------
ListIterator listIterator():列表迭代器 (List集合的专有迭代遍历:列表迭代器)
ListIterator接口中:
boolean hasNext()  :判断是否有下一个可以迭代的元素(正向遍历)
Object next():获取下一个元素
boolean hasPrevious():判断是否有上一个可以迭代 元素(逆向遍历)
Object previous():返回上一个元素


*逆向迭代(遍历),单独使用没意义,前提,要先正向遍历
--------------------------------------------------------------------------------------------------------------
 存储自定义对象并遍历,两种方式
方式1:Iterator iterator();
方式2:size()和get()方法相结合
--------------------------------------------------------------------------------------------------------------

Iterator iterator() :集合的迭代器方法(获取集合的迭代器)

集合的专有遍历方式:迭代器遍历

Iterator :接口中有以下的方法:
boolean hasNext() :如果有元素可以迭代,那么返回true,否则返回false
Object next()返回迭代的下一个元素。 
存储String类型的元素
 --------------------------------------------------------------------------------------------------------------
 注意: 
  1)it.next(),只使用一次即可,使用多次,会出现问题(it.next(),每次使用的时候都是返回一个对象)
2)遍历的时候使用的while循环,可不可以使用for循环呢?
while循环针对的是没有准确的循环次数,而for循环特指有准确的循环次数
--------------------------------------------------------------------------------------------------------------
转换功能:
Object[] toArray():将集合转换成数组
 需求:要给集合中存储字符串类型的数据,并遍历
import java.util.ArrayList;//导包
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
public static void main(String[] args) {

//创建一个集合对象
Collection c = new ArrayList() ;

//给集合中添加元素
c.add("hello") ;
c.add("world") ;
c.add("java") ;
c.add("JavaEE") ;

//需要使用Object[] toArray()去转换
//将集合转成数组
Object[] objs = c.toArray();
for(int x =0 ; x < objs.length ; x ++) {
//System.out.println(objs[x]);
//需求:输出不同的元素的同时,还需要输出字符串元素的长度
//System.out.println(objs[x]+"----"+objs[x].length());
/**
*上面代码有问题
* length():属于String类型的特有功能,可以获取字符串长度
*/
String str = (String) objs[x] ;  //相当于:向下转型
System.out.println(str+"----"+str.length());
}
}
 --------------------------------------------------------------------------------------------------------------
/**
 *需求:存储自定义对象并遍历
 *
 *有5个学生,学生有姓名,年龄,遍历5个学生,输出5个学生对应的信息(集合改进)
 *
 *1)创建一个学生类
 *2)在测试类中,创建集合对象
 *3)创建5个具体学生对象,并且添加集合中
 *4)将集合转换数组
 *5)遍历
 *6)输出
 */
import java.util.ArrayList;//导包
import java.util.Collection;//导包
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)



public static void main(String[] args) {

//创建一个集合对象
Collection c = new ArrayList() ;

//创建5个具体学生对象
Student s1 = new Student("高圆圆", 27) ;
Student s2 = new Student("杨桃", 28) ;
Student s3 = new Student("王力宏", 35) ;
Student s4 = new Student("周星驰", 60) ;
Student s5 = new Student("成龙", 55) ;

//添加到集合中
c.add(s1) ;
c.add(s2) ;
c.add(s3) ;
c.add(s4) ;
c.add(s5) ;

//转换数组
Object[] objs = c.toArray() ;
//遍历
for(int x = 0 ; x < objs.length ;x ++) {
//System.out.println(objs[x]);

//需求:需要的通过getXXX方法获取学生信息

Student s = (Student) objs[x] ; //向下转型
System.out.println(s.getName()+"----"+s.getAge());
}
}


student类:
public class Student {

private String name ;
private int age ;

public Student() {
super();
}


public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}


 --------------------------------------------------------------------------------------------------------------
 需求:
我有一个集合,如下List,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现
假设:List集合 的元素:"hello","world","java"

按照正常的思路:完成了需求,发现出现异常:
java.util.ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
 
产生的原因:按照正常的需求,给集合添加元素,遍历,遍历同时,判断集合中是否有需要的元素,有就添加新元素,
遍历的时候,使用迭代器遍历,但是添加元素,使用集合添加元素.
集合添加了一个新的元素,迭代器不知道...

使用迭代器遍历元素,不能使用集合添加元素!

解决方案:
方式1:要么使用迭代器遍历,使用迭代器添加元素!
方式2:要么使用集合遍历,使用集合添加元素!
并发.并行区别?
并发是指一个处理器同时处理多个任务。 
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。 
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。 
来个比喻:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。

 import java.util.ArrayList;//导包
 代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行) 

 public static void main(String[] args) {

//创建一个集合对象
List list = new ArrayList() ;

//添加元素
list.add("hello") ;
list.add("world") ;
list.add("java") ;

//获取迭代器
/*Iterator it = list.iterator() ;
while(it.hasNext()) {
String s = (String)it.next() ;
//判断集合是否有"world"元素,有就添加一个新的元素
if("world".equals(s)) {
//添加元素
list.add("javaee") ;
}
}*/

//方式1:使用迭代器遍历,迭代器添加元素解决并发修改异常
//Iterator接口没有添加功能
//ListIterator:列表迭代器中有add(object e):方法
/*最开始的思路方法:
ListIterator it = list.listIterator() ;
while(it.hasNext()) {
String s = (String)it.next() ;
if("world".equals(s)) {
//迭代器添加
it.add("javaee"); //指定元素后面插入元素
}
}*/

//方式2:使用集合遍历,使用集合添加元素(普通for循环)
for(int x =0 ;x < list.size() ; x ++) {
String s = (String)list.get(x) ;
//判断
if("world".equals(s)) {
list.add("javaee") ;
}
}

System.out.println("list:"+list);

/*int a = 10 ;
System.out.println(a/0);*/

}
 --------------------------------------------------------------------------------------------------------------




 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/mulinghanxue/article/details/80191820
今日推荐