Java编程思想 -持有对象
当我们创建有限个对象时,可以使用数组存储,但是当我们存储不去定数量的对象时,就需要新的策略来解决这个问题。持有对象,就是通过Java的容器类来保存对象。
1、基本概念
1:Collection,一个独立元素序列,包含三类:List(按照插入顺序保存元素),Set(不能有重复的元素,不按照插入序列保存元素),Queue(按照排队的方式来确定对象的顺序)。这一类属于线性表。
2:Map,一组成对的“键值”对象,其实用字典来称呼更合适,因为字典上有字(key)以及其对应的解释(value)。
在对容器使用的过程中,建议构造子类的实例对象然后向上转型为接口对象。这样的话,修改所使用的容器会比较方便。如:
List<Apple> list = new ArrayList<>();
2、添加一组元素
在java.util包的Arrays类和Collections类中有比较多的实用方法。添加一组数据的方法有:(注意以下方法的参数)
- Collections.addAll()
- Arrays.asList(数组参数); #该方式产生的List的尺寸不可调节,否则它将修改原来的数组。
- Arrays.asList();//避免因参数只是存在共同父类而无法统一List的类型。
- Collections.sort(); //对数据排序
- Collections.shuffle(); //打乱数据顺序
3、容器的打印
打印容器中的数据,可以直接使用System.out.print(Collection/Map)。常用的还是使用迭代器对容器中的数据进行读取。
4、List
主要有两个子类:ArrayList,LinkedList。
ArrayList:线性存储数据,数据按照插入次序进行排列。底层是通过数组实现,当数据量增加时,则创建更大容量的数组来装配元素。随机访问比较快,从中间插入和移除效率比较低。
LinkedList:底层是通过链表实现的,对于插入和删除操作效率较高。可以使用该容器实现Stack(堆栈)和Queue (队列)的功能。
5、迭代器
迭代器(Iterator):便利并且选择序列中的对象。它只能单向移动。它统一了容器的访问方式。
- 使用iterator()方法让容器返回一个Iterator对象;
- 使用next()返回下一个元素,内部使用的是return get(index++)的方式;
- 使用hasNext()判断是否还有元素;
- 使用remove()删除容器中的元素。(之前必须使用next()方法)
ListIterator类是只能用于List类中,这是一个可以双向移动迭代器。
6、Stack(堆栈)
堆栈:先进先出的线性表。定义方式如下:
Stack<Apple> stack = new Stack<>();
stack.push(new Apple()); //入栈
stack.pop(); //出栈
7、Set
Set:存放不可重复的元素。其主要有两个子类HashSet和TreeSet。Set数据集合主要用来数据的查找。
- HashSet是通过散列表的形式存储数据;
- TreeSet是通过红黑树的方式存储数据。
8、Map
通过键值的方式存储数据,容器中存储容器可以实现数据的多维存储。Map的keySet()方法返回一个key的集合,可用于对Map的遍历。当然还有可以使用Map.Entry来实现对Map的遍历,这个类似于List中的Iterator。使用方式如下:
for(Map.Entry entry : map.entrySet()){
entry.getKey();
entry,getValue();
}
Map内有个entrySet()方法返回一个Set集合(元素为Entry对象)。
9、Queue和PriorityQueue
队列:先进先出的线性表。LinkedList也实现了Queue的队列,因此可以使用LinkedList.
使用peek()返回队头元素(不删除),poll()返回队头元素(删除),offer()方法插入元素到队尾。
PriorityQueue可以确保peek(),poll(),remove()时,获取的都是队列中优先级最高的元素。默认是按照自然顺序排列。
10、Foreach和迭代器
Foreach可以用于数组,也可以用于任何Collection对象。同样可以用于实现了Iterable的接口类容器。在实现Iterable接口的类中要实现三个hasNext(),next()和remove()方法。
11、总结
1:数组将数字与对象联系在一起。
2:Collection保存单一元素,Map保存键值对。
3:大量随机访问使用ArrayList,经常插入和删除则使用LinkedList。
4:各种Queue以及栈的行为,可使用LinkedList提供支持。
5:HashMap设计用来快速访问;TreeMap保持键处于排序状态;LinkedHashMap保持元素插入有序,通过散列提供快速访问。
6:HashSet提供最快的查询速度,而TreeSet保持元素的排序状态,LinkedHashSet以插入顺序保存元素。
7:保持Map和Collection联系的就是Map的entrySet()方法和values()产生Collection。