集合
集合
Collection接口
来自java.util
用来存储数据和数组一样
和数组不同的是数组可以放任何类型,它只能放引用类型
并且可以自动扩充空间
下图体系结构:

Collection的其中几个方法演示
import java.util.ArrayList;import java.util.Collection;class Season{public static void main(String[] args) {Collection c1 = new ArrayList();// 注意接口不能创建对象,这里用多态的写法新建一个ArrayList对象c1.add("a");// add()往集合中添加元素,list都可以添加重复的元素。会有一个boolean返回值truec1.add("b");c1.add("c");c1.add(2);// 虽然写的时候可以写上基本类型,但实际上编译会对2会进行装箱操作还是引用类型Collection c2 = new ArrayList();c2.add("a");c2.add("b");System.out.println(c1);System.out.println(c1.contains("b"));// a中元素是否包含"b",返回一个booleanSystem.out.println(c1.size());// a集合的的元素个数Object[] obj = c1.toArray();// 转化为数组类型,并且是Object类型c1.remove("b");// 从集合a中移除元素"b"System.out.println(c1);c1.containsAll(c2);// 集合c1是否包含集合c2,返回boolean值c1.retainAll(c2);// 集合运算c1=c1交c2,返回boolean类型c1和以前相等就返回false变了就是true/*还有addAll(c)removeAll(c)iterator()*/}}结果:[]true3[]
集合的遍历
import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;class Season{public static void main(String[] args) {Collection c = new ArrayList();c.add("a");c.add("b");c.add("c");c.add("d");Object[] arr = c.toArray();// 第一种遍历是转化成数组for (Object i : arr) {System.out.println(i);}Iterator it = c.iterator();// 第二种是用迭代器打印游标指定的元素while(it.hasNext()) {// 判断游标指向是否为空System.out.println(it.next());// 游标后移,打打印当前}}}结果:abcdabcd
List接口
Collection的子接口,有序集合
特有方法其中几个演示
import java.util.List;import java.util.ArrayList;class Season{public static void main(String[] args) {List a = new ArrayList();a.add("a");a.add("b");a.add(1, "ss");// 插入值可以选择索引插入System.out.println(a);System.out.println(a.get(2));// 获取指定索引的值a.remove(1);// 移除指定索引对应的元素System.out.println(a);}}结果:[]b[]
迭代过程修改集合的并发异常
试例:迭代器遍历集合时改动
在迭代器中不能对来源集合直接修改需要用迭代器实现类中已经定义好的方法。对于例子用的ArrayList对象创建的集合来说,ArrayList中就有三个方法除了重写的terator(),还有ListIterator()还有一个重载的,ArrayList类中定义了内部类实现Iterator接口,重写实现接口中相关方法详情见源码。方法会新建对应的内部类对象返回,例子中的 Iterator it = c.iterator();c.iterator 就会得到一个ArraysList中的一个内部类对象class Season{public static void main(String[] args) {Collection c = new ArrayList();c.add("a");c.add("b");c.add("c");c.add("d");Iterator it = c.iterator();while(it.hasNext()) {String str = (String)it.next();if(str.equals("c")) {// 如果有"c"则给集合添加一个"f"c.add("f");}}System.out.println(c);}}// 报错 java.util.ConcurrentModificationException
ArrayList类
List接口的实现类
ArrayList中方法基本都是实现的List的方法没有特有方法
前面用的具体方法也都实际上是来自ArrayList
下面来用这些方法实现去掉集合中的重复元素
import java.util.ArrayList;import java.util.Iterator;class Season{public static void main(String[] args) {ArrayList c = new ArrayList();c.add("a");c.add("b");c.add("a");c.add("c");c.add("b");c.add("d");// 初始化有重复元素的目标集合cSystem.out.println(c);Iterator it = c.iterator();// 创建迭代器来遍历集合ArrayList newList = new ArrayList();// 创建新数组存放目标数组的过滤值while(it.hasNext()) {String s = (String) it.next();// 注意这里要用到两次当前游标值需要取一下当前值,不能在下面用两次next这样就不是一个值而且迭代器会越界if(!newList.contains(s)) {// 每次从c中取一个值,看newList是否包含newList.add(s);}}c = newList;// 最后把过滤的结果赋给c,从而达到去重的目的System.out.println(c);}}结果:[a, b, a, c, b, d][a, b, c, d]
linkedList类
List接口的实现类,与ArrayList不同的是它是链表结构
由于它是实现了List,所以它也是有索引添加删除等方法
但就不是像Array一样直接就定位到元素,链表只能不断找到下一个直到满足索引的次数
同时它有几个特有方法
import java.util.LinkedList;class Season{public static void main(String[] args) {LinkedList c = new LinkedList();c.add("a");c.add("b");System.out.println(c);c.addFirst("F");c.addLast("d");System.out.println(c);System.out.println(c.getFirst()+" "+c.getLast()+" "+c.pop());System.out.println(c);c.push("G");System.out.println(c);/*还有removeFirst()removeLast()pollFist();pollLast();peek这些等等*/}}结果:[a, b][F, a, b, d]F d F[a, b, d][G, a, b, d]
Vector类
1.2版本之后加入到Collection家族当中,实现List接口
它和ArrayList一样属于数组结构,不同的是它的很多方法前都加了锁,所以比起ArrayList线程更加安全但效率低

它在加入List之前有有些自己的添加移除等方法
import java.util.Vector;class Season{public static void main(String[] args) {Vector c = new Vector();c.add("a");c.add("b");c.addElement("c");// 在实现List之前用的添加方法c.removeElement("a");System.out.println(c);}}
总结
集合作用和特性
Collection接口的方法
Collection下的两个子接口List与Set的不同点
List中的特有方法
ArrayList类对方法的具体实现
LinkedList类的具体实现和它的特有方法
Vecotor的特点
快到碗里来
!
本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

浙公网安备 33010602011771号