集合
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返回值true
c1.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",返回一个boolean
System.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()
*/
}
}
结果:
[a, b, c,2]
true
3
[a, c]
集合的遍历
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());// 游标后移,打打印当前
}
}
}
结果:
a
b
c
d
a
b
c
d
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);
}
}
结果:
[a, ss, b]
b
[a, b]
迭代过程修改集合的并发异常
试例:迭代器遍历集合时改动
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对象创建的集合来说,ArrayList中就有三个方法除了重写的terator(),还有ListIterator()还有一个重载的,ArrayList类中定义了内部类实现Iterator接口,重写实现接口中相关方法详情见源码。方法会新建对应的内部类对象返回,例子中的Iterator it = c.iterator();c.iterator就会得到一个ArraysList中的一个内部类对象
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");// 初始化有重复元素的目标集合c
System.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的特点
快到碗里来
!