赞
踩
package day14; import java.util.ArrayList; import java.util.Collection; public class Test01 { public static void main(String[] args) { Collection cal1 = new ArrayList(); cal1.add("a"); cal1.add("b"); cal1.add("c"); cal1.add("d"); Collection cal2 = new ArrayList(); cal2.add("a"); cal2.add("b"); cal2.add("e"); cal2.add("f"); cal2.add("g"); boolean flag =cal1.addAll(cal2);//添加 System.out.println(flag); // System.out.println(cal1.removeAll(cal2));//去除交集 /*System.out.println(cal1.retainAll(cal2));//获取交集,变成交集 System.out.println(cal2.containsAll(cal1));//是否包含*/ System.out.println(cal1); System.out.println(cal2); } }
1.将集合转换为数组来进行遍历
2.方法:Object[] toArray()
Collection cal = new ArrayList();
cal.add("张三");
cal.add("李四");
cal.add("王五");
cal.add("赵六");
cal.add("周七");
Object[] obj = cal.toArray();
//System.out.println(Arrays.toString(obj));
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
注意存储内容为对象时要重写toString方法
1.将集合转换为迭代器来进行遍历
2.方法:Iterator iterator()
Collection cal = new ArrayList();
cal.add("张三");
cal.add("李四");
cal.add("王五");
cal.add("赵六");
cal.add("周七");
Iterator it = cal.iterator();
while (it.hasNext()){
Object next = it.next();
System.out.println(next);
}
1.使用增强for循环
2.语法:
for(集合|数组元素的数据类型 变量名 : 需要遍历集合|数组) {
变量名 就是每次得到集合|数组中元素
}
3.注意点:
A.增强for循环遍历的方式也是使用迭代器来进行遍历
Collection cal = new ArrayList();
cal.add("张三");
cal.add("李四");
cal.add("王五");
cal.add("赵六");
cal.add("周七");
for (Object o : cal) {
System.out.println(o);
}
1.概念:所在包名是 java.util List是一个接口 不能实例化 只能实例化实现类即实例化子类
collection也是接口,且是集合的根接口,是list接口的父类
2.特点:有序的 存的顺序与取的顺序是一样的 可以重复 也是设置null元素
3.实现类:ArrayList LinkedList Vector
4.常用的方法 带索引的方法
5.list有索引值,collection无索引
package com.qf.demo03; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List li = new ArrayList(); li.add("张三"); li.add("李四"); li.add("王五"); li.add("赵六"); System.out.println(li); li.add(1,"吴"); System.out.println(li); li.set(2,"叶"); System.out.println(li); //根据索引来获取某一个元素 System.out.println(li.get(1)); li.remove(1); System.out.println(li); } }
package com.qf.demo03; import java.util.ArrayList; import java.util.List; public class Test01 { public static void main(String[] args) { List li = new ArrayList(); li.add("周"); li.add("潘"); li.add("张"); //使用第四种遍历方式 for (int i=0;i<li.size();i++){ //通过索引来获取元素 Object o = li.get(i); System.out.println(o); } } }
代码 存储对象的集合
package com.qf.demo04; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class Test { public static void main(String[] args) { //实例化集合 List li = new ArrayList(); //实例化学生对象 Student stu1 = new Student("张",18,"男"); Student stu2 = new Student("周",16,"男"); Student stu3 = new Student("潘",20,"女"); //将对象存入到集合中 li.add(stu1); li.add(stu2); li.add(stu3); //使用第四种方式进行遍历 for (int i=0;i<li.size();i++){ System.out.println(li.get(i)); } //使用循环遍历 int age= ((Student)(li.get(0))).getAge(); //定义一个变量来记录索引 int index =-1; for (int i=0;i<li.size();i++){ Student st = (Student) li.get(i); if (st.getAge() >age){ age =st.getAge(); //将索引记录 index =i; } } ((Student) (li.get(index))).setName("小猪佩奇"); System.out.println(li); } }
注意:将获得的集合对象进行向下转型,因为集合取出的对象自动向上转型为Object类,所以需要向下转为Student类才能调取Student类的方法
listIterator 有remove add set 三种常用方法 增删改
package com.qf.demo05; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class Test { public static void main(String[] args) { List li = new ArrayList(); li.add("张无忌"); li.add("张三丰"); li.add("张小龙"); li.add("张学友"); //将集合中转换为迭代器 ListIterator iterator = li.listIterator(); //将指针移动到最后 while (iterator.hasNext()){ iterator.next(); } while (iterator.hasPrevious()){ Object o = iterator.previous(); System.out.println(o); } } }
理解:就是转为特殊的ListIterator迭代器,可以避免并发异常
package com.qf.demo05; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class Test01 { public static void main(String[] args) { List li = new ArrayList(); li.add("小沈阳"); li.add("宋小宝"); li.add("赵四"); li.add("文松"); //将集合转换为迭代器 Iterator iter = li.iterator(); while (iter.hasNext()){ String s = (String) iter.next(); if (s.equals("赵四")){ li.add("小吴"); } } System.out.println(li); } }
问题
A.问题:
Exception in thread “main” java.util.ConcurrentModificationException
当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常 ==>并发异常
B.原因:
使用迭代器遍历数据 同时又在是集合在添加数据 添加数据 并没有通知迭代器已经修改集合数据了
就会出现并发异常
C.解决方法:
A.使用常规遍历方式 同时来操作集合
B.使用迭代器进行遍历 使用迭代器来添加数据
第一种 普通for
package com.qf.demo05; import java.util.ArrayList; import java.util.List; public class Test02 { public static void main(String[] args) { List li = new ArrayList(); li.add("小沈阳"); li.add("宋小宝"); li.add("赵四"); li.add("文松"); for (int i=0;i<li.size();i++){ String s = (String) li.get(i); if (s.equals("赵四")){ li.add("吴"); } } System.out.println(li); } }
第二种 listIteraor
package com.qf.demo05; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class Test03 { public static void main(String[] args) { List li = new ArrayList(); li.add("小沈阳"); li.add("宋小宝"); li.add("赵四"); li.add("文松"); //转换为迭代器 ListIterator iter = li.listIterator(); while (iter.hasNext()){ String s = (String) iter.next(); if (s.equals("赵四")){ iter.add("吴"); } } System.out.println(li); } }
1.ArrayList是List接口的实现类
2.ArrayList 底层实现是以数组的方式进行存储 特点:查询快 增删慢
3.此实现不是同步的 多线程中不安全的
4.数组存储方式的特点分析
1.是List接口实现类
2.以链表的方式来进行存储 特点:查询慢 增加删除快
3.此实现不是同步的 多线不安全
3.链表存储的特点分析
常用方法
两者比较
package day14; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class Test07 { public static void main(String[] args) { array();//增删link快 查找array快 link(); } public static void array(){ List li = new ArrayList(); //long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { li.add(i); } long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { li.get(i); } long end = System.currentTimeMillis(); System.out.println(end-start); } public static void link(){ LinkedList li = new LinkedList(); //long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { li.add(i); } long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { li.get(i); } long end = System.currentTimeMillis(); System.out.println(end-start); } }
1.Set接口的两个实现类 HashSet TreeSet
2.特点:
A.元素不能重复
B.无序 没有顺序
C.没有索引
package com.qf.demo08; import java.util.HashSet; import java.util.Set; public class Test01 { public static void main(String[] args) { //实例化集合 Set s = new HashSet(); s.add("李四"); s.add("王五"); s.add("赵六"); s.add("刘清"); s.add("吴"); s.add("a"); s.add("吴"); System.out.println(s); } }
注意add增加相同元素时,集合不会再增加此相同元素
list集合及其子类arraylist,linklist,四种方式都可以
set,map及其子类hashset,treeset,hashmap,hashlinkedmap,只能增强for循环,转换为迭代器两种方式,转换数组一般不用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。