Java实用类库还提供了一套相当完整的容器类来解决这个问题,其中基本的类型是List、Set、Queue和Map。这些对象类型也称为集合类,但由于Java的类库中使用了Collection这个名字来指代该类库的一个特殊子集。
1.泛型和类型安全的容器
1.泛型:参数化类型(泛型类,泛型接口,泛型方法)
2.使用泛型类,容器可以在编译器检测对象的类型(如果不使用泛型类,那么将错误对象加入容器,将会在运行时报错)
3.泛型类同样支持向上转型(子类对象可以加入父类的容器中)
2.基本概念
Java容器类类库的用途:保存对象。可以分为两个不同概念:
1)Collection:符合规定的独立元素序列(List按照插入顺序保存数据,Set不能有重复元素;Queue先进先出)
2)Map:Key-Value对象,允许使用Key查找Value(ArrayList允许使用数字查找值,某种意义上将数字和对相关联;映射表(关联数组);字典)
向上转型:
List<Apple> list = new ArrayList<>();
List<Apple> list2 = new LinkedList<>();
List是一个接口,ArrayList和LinkedList分别都继承和实现了List接口。上述两条语句将这两个类的对象转型成对应的接口.接口不能被实例化,但是可以创建一个指向实现类对象的引用)
Collection支持foreach语句
3.添加一组元素
①Arrays.asList()
方法接受一个数组 或是用逗号分隔的元素列表,并将其转换为List对象;
②Collections.addAll()
方法接受一个Collection对象,数组或者是逗号分隔的列表,并添加到Collection中
举例:
Collection<Integer> collection = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Integer[] moreInts ={6,7,8,9,10};
Collections.addAll(collection , moreInts);
Collections.addAll(collection , 6,7,8,9,10);
(Colltction.addAll只能接受一个Collection对象作为参数;不如Collections.addAll灵活)
4.容器的打印
Arrays.toString()
5.List
List承诺将元素维护在特定序列。(继承Collection接口)。区别于数组,List允许列表在被创建之后进行添加删除以及自我调整长度。(List是一种可修改的序列)
List的两种类型:
①ArrayList:适用于随机访问。插入和删除元素较慢
②LinkedList:适用于插入,删除以及优划的顺序访问。随机访问很慢
常用方法:
1)contains(对象)
确定某个对象是否存在列表中;
2)remove(对象)
移除元素
3)indexOf(对象)
确定对象所在的索引编号
6.迭代器
迭代器(也是一种设计模式)。迭代器是一个对象,工作是遍历并选择序列中的对象,而客户端程序员不需要知道序列底层的结构。(由于创建代价小,通常被称为轻量级对象)
Java中的Iterator:
1)使用方法iterator()
返回一个Iterator.Iterator将准备好返回序列的第一个元素。
2)next()
获取序列中下一个元素
3)hasNext()
检查序列中是否还有元素
4)remove()
将迭代器新返回的元素删除
使用迭代器完成一个遍历(String)
while(it.hasNext()) {
String s =it.next();
System.out.println(s);
}
6.1ListIterator
是Iterator的子类。Iterator只能向前移动,ListIterator可以双向移动。
listIterator()
:产生一个指向List开头的迭代器
listIterator(n)
:创建一个指向索引为n的元素处 的迭代器
hasPrevious()
和previous()
.
方法被对象所调用,所以应该
ListIterator<Generic Class> it =new listIterator<>();
it.hasPrevious();
7.LinkedList
相比于ArrayList添加了用作栈,队列或者双端队列的方法
8.Stack
后进先出的容器(LIFO)。可通过LinkedList实现:
public class Stack<T>{
private LinkedList<T> storage = new LinkedList<T>();
public void push(T v){storage.addFirst(v);}
public T peek(){return storage.getFirst();}
public T pop(){return storage.removeFirst();}
public boolean empty(){return storage.isEmpty();}
public String toString(){return storage.toString();}
}
9.Set
Set不保存重复的元素。 在Set中会阻止重复元素的操作,Set中做常被使用的是测试归属性:可以很容易地询问某个对象是否在Set中。在Set中最重要的操作是查找。(HashSet的实现对快速查找进行了优化)
Set本质上就是Collection,只是行为不同,其拥有和collection完全一样的接口。Set基于对象的值来确定归属性。
TreeSet的元素存储在红黑树数据结构中;HashSet使用散列函数。