Java中的集合类-详解 (2)

案例学习:

import java.util.LinkedList; public class c6_2 { public static void main(String[] args) { LinkedList link=new LinkedList();//创建集合 link.add("stu1");//添加元素 link.add("s2"); link.add("s3"); link.add("s4"); System.out.println(link.toString()); link.add(3, "add3");//指定位置插入元素,第一个索引位置为0 link.addFirst(1);//集合第一个位置插入元素 System.out.println(link); System.out.println(link.getFirst());//取出集合中第一个元素 link.remove(3);//移除指定位置元素 link.removeFirst();//移除第一个元素 System.out.println(link); } }

输出如下:

[stu1, s2, s3, s4] [1, stu1, s2, s3, add3, s4] 1 [stu1, s2, add3, s4] Iterator接口

Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被成为迭代器。
参考案例:

import java.util.ArrayList; import java.util.Iterator; public class c6_3 { public static void main(String[] args) { ArrayList list=new ArrayList(); list.add("data1"); list.add("data2"); list.add("data3"); list.add("data4"); Iterator it=list.iterator();//获取iterator对象 while(it.hasNext()) {//判断是否存在下一个元素 Object obj=it.next();//取出集合中的元素 System.out.println(obj); } } } DK5.0新特性-foreach循环

虽然Iterator可以用来遍历集合中的元素,但写法上比较繁琐,为了简化书写,从JDK5.0开始提供了foreach循环,是一种更加简洁的for循环,也叫增强for循环,具体语法格式如下:

for(容器元素类型 临时变量:容器变量){执行语句}

案例如下:

import java.util.ArrayList; public class c6_4 { public static void main(String[] args) { ArrayList list=new ArrayList(); list.add("data1"); list.add("data2"); list.add("data3"); for(Object obj:list) { System.out.println(obj); } } }

注1:foreach只能遍历集合或数组中的元素,并不能对其进行修改,在上述的基础上我们对其进行修改:

public static void main(String[] args) { ArrayList list=new ArrayList(); list.add("data1"); list.add("data2"); list.add("data3"); for(Object obj:list) { obj="tom"; } System.out.println(list.get(0));////foreach循环只能遍历数组或者集合,不能对其中的元素进行修改 }

运行结果不是tom,而是data1
原因是临时变量obj指向了一个心字符串tom,这和集合中的元素没有一点关系
注2:使用Iterator迭代器对集合中的元素进行迭代时,如果调用集合对象的remove()删除元素之后,继续使用迭代器会出现异常,如下面案例所示:

import java.util.ArrayList; import java.util.Iterator; public class c6_6 { public static void main(String[] args) { ArrayList list=new ArrayList(); list.add("data1"); list.add("data2"); list.add("data3"); list.add("data4"); Iterator it=list.iterator(); while(it.hasNext()){ Object obj=it.next(); if("data2".equals(obj)) { list.remove(obj); } } System.out.println(list); } }

抛出异常如下:

Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at chapter6.c6_6.main(c6_6.java:15)

原因是删除了集合中删除了元素会导致迭代器预期的迭代次数发生改变导致迭代器结果不准
为了解决上述问题,我们可以使用以下两种方式

第一种方式
在如下位置添加break:

if("data2"equals(obj)){ list.remove(obj); break; }

第二种方式
使用迭代器本身的删除方法,如下:

if("data2".equals(obj)){ it.remove(); }

思考:
其实在该述案例中,不使用上述两种方式,如果添加的元素是三个,会正常运行,是不会抛出异常的,有读者知道是为什么吗?欢迎在评论区留言

Set接口

Set集合特点:元素无序,且以某种规则保证存入的元素不会重复

HashSet

HashSet集合添加一个对象时,会调用hashCode()方法来计算对象的哈希值,从而确定元素位置,如果哈希值相同,再调用对象的equals()方法来确保该位置没有重复元素
直接上案例:

import java.util.HashSet; import java.util.Iterator; public class c6_9 { public static void main(String[] args) { HashSet set =new HashSet(); set.add("data1"); set.add("data1");//重复元素会被舍弃,遍历时只会输出一个data1 set.add("data2"); set.add("data3"); set.add("data4"); Iterator it=set.iterator(); while(it.hasNext()) { Object obj=it.next(); System.out.println(obj); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpgss.html