集合
数组和集合类同样都是容器,有什么不同?
1、数组长度是固定的,一旦定义,就无法改变 ;
2、集合长度是可变的 ;
3、数组中可以存储基本数据类型,也可以是对象(实际上是对象的引用);
4、集合只能存储对象的引用 集合中的元素都是引用数据类型,基本数据类型也要转成包装类对象后才能放入集合。
java集合体系
collection接口
Collection有两个派生出来的子接口:Set,List :
Set: 特点是:元素无序,不可重复 ;
List: 特点是:元素有序,可以重复。
接口
保存的是具有映射关系“key-value对”的集合 ;
Map里面保存的每项数据都是key-value对,也就是由key和value两个值组成,就像学生的成绩,姓名是key,成绩是value,每个key对应着一个value。
三种集合对比
1、Set和List都属于Collection的子接口,Set里面的元素没有顺序,但是不能重复;
2、List接口里的元素是有顺序的,所以可以重复;
3、Map里存放的元素都是成对出现的,一个key对应着一个value,通过key可以找到对应的value值。
collection 常用方法 :
1、boolean add(Object o):向集合中添加一个元素,如果添加成功,则返回true,否则返回false
2、boolean addAll(Collection c):把另一个集合中的所有元素添加到当前集合中,如果添加成功,返回true,否则false
3、void clear():清除集合里的所有元素,将集合长度变成0
4、boolean contains(Object o):返回集合里是否包含指定元素
5、boolean containsAll(Collection c):返回集合里是否包含集合c里包含的所有元素
6、boolean isEmpty():返回当前集合是否为空
7、Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素
8、boolean remove(Object o):删除集合中的指定元素c,当集合中包含一个或者多个元素c时,该方法只删除第一个符合条件的元素,成功删除返回true
9、boolean removeAll(Collection c):从集合中删除集合c中包含的素有元素,相当于用当前集合减去集合c,如果删除了一个或者一个以上的元素,该方法返回true
10、int size():返回集合中元素的个数
11、Object[] toArray():将集合转换成一个数组,转换后的数组是Object类型
迭代器Iterator
Iterator也是集合框架中的成员,但是它不能用来盛装元素,只能用来遍历(即迭代)Collection中的元素,Iterator对象也被称为迭代器
所有集合对象有一个获得本集合对象的迭代器的方法.iterator(),可以返回一个迭代器,用来遍历这个集合的所有元素
常用的迭代器方法有:
1、boolean hasNext():查看集合是否还有元素,如果集合被遍历完了,则返回false,否则返回true
2、Object next():返回集合中的下一个元素,注意返回值类型是Object
3、boolean remove():将上一次返回的元素删除,删除成功返回true,否则false
在使用迭代器遍历的时候,不可将判断条件改成it.next()!=null;
Collection al = new ArrayList(); al.add("javaSE"); al.add("javaEE"); Iterator iterator = al.iterator(); Object obj; while ((obj = iterator.next()) != null) { System.out.println(obj); }
分析: it.next()返回值是引用数据类型,所以可以用来和null进行判断。 但.next()方法的含义是去取下一个元素,当迭代器已经遍历完集合的时候,已经没有下一个元素了,这时再去取元素,就会报错。所以,这样遍历集合是不行的。必须在取元素之前,先进行“有无”的判断,而不能直接去取。 另外:
1 public void test2(){ 2 Collection coll = new ArrayList(); 3 coll.add(123); 4 coll.add(new String("A")); 5 coll.add("B"); 6 7 Iterator i = coll.iterator(); 8 //判断一下执行的流程 9 while((i.next())!= null){ 10 System.out.println(i.next()); 11 } 12 }
结果为A;
注意在while循环条件判断及打印条件中的.next()都进行了集合元素的跳转。
遍历集合的另一个方式:增强for循环
每次循环都把数组/集合中的元素拿出来赋值给一个变量;用来遍历集合和数组。
增强for在遍历时,采用的是值传递,不论在循环中对变量进行怎样的更改,都不会影响到真正的集合元素,但是可以改变引用的对象的变量值,
1 Collection al = new ArrayList();// 2 al.add("java"); 3 al.add("javaSE"); 4 al.add("javaEE"); 5 for (Object obj : al) {//集合中的元素取出来都是Object类型 6 String name = (String)obj;//强转为String类型 7 name = "String: " + name;//在字符串前面加上String字样 8 } 9 System.out.println(al);
结果不会对集合元素进行修改;
1 import java.util.*; 2 class Student{ 3 String name; 4 int age; 5 public Student(){} 6 public Student(String name,int age){ 7 this.name = name; 8 this.age = age; 9 } 10 } 11 class StudentDemo{ 12 public static void main(String[] args){ 13 Student s1 = new Student("s1",11); 14 Student s2 = new Student("s2",12); 15 Student s3 = new Student("s3",13); 16 //创建集合 17 Collection coll = new ArrayList(); 18 //添加元素 19 coll.add(s1); 20 coll.add(s2); 21 coll.add(s3); 22 //在增强for中改变引用的对象的成员变量的值 23 for(Object obj : coll){ 24 Student stu = (Student)obj; 25 stu.name = "tom"; 26 } 27 //使用增强for遍历集合,看元素的成员变量是否发生了变化 28 for(Object obj : coll){ 29 Student stu = (Student)obj; 30 System.out.println(stu.name+"-----"+stu.age); 31 } 32 } 33 }
集合元素是应用对象,对其进行修改都会体现在堆内存中的对象上,结果会改变。 增强for循环中的变量用来接收数组/集合中的元素,属于值传递,在增强for循环中对迭代变量进行的修改无法体现到真实的数组/集合上
遍历时删除集合元素
迭代器在迭代过程中,不可以使用集合的remove方法对集合作出修改。 迭代器也有一个remove方法,可以用其方法能对集合元素进行删除。如下:
1 public class ForEachDemo { 2 public static void main(String[] args) { 3 Collection coll = new ArrayList(); 4 coll.add("java"); 5 coll.add("javaSE"); 6 coll.add("javaEE"); 7 //对集合进行遍历 8 Iterator it = coll.iterator(); 9 while(it.hasNext()){ 10 String str = (String)it.next(); 11 if(str.equals("java")){ //判断取出的元素是否和指定字符串相等 12 it.remove(); //是迭代器的remove()方法;如果相等,则从集合中删除 13 } 14 } 15 System.out.println(coll);//打印出集合元素 16 } 17 18 19 }
Collection接口中定义的remove和迭代器中的remove方法都能对集合中的元素进行删除,但是两者不能同时使用,即:在使用迭代器遍历集合时,不能使用Collection中的remove方法,只能使用迭代器中的remove方法来删除元素。
如何利用Iterator删除集合中的第一个元素?
Iterator的remove方法删除的是next方法返回的元素,也就是说,再调用remove方法之前,必须先调用一次next方法才行,这样才能保证remove方法有删除的东西,否则找不到要删除的元素:
it.next(); //skip the first element
it.remove(); //remove the element returned by next() function
利用iterator来删除元素的话,需要使用next方法跨过这个元素 这也就意味着,不能连续两次调用remove方法,例如:
it.remove();
it.remove();//error