Java核心技术之容器
最后更新于:2022-04-01 09:58:30
软件中的数据可以说是非常重要的一部分,而我们组织和操作数据的一般都是java.util包中的一些集合类,这些集合我们称为容器。
### 一:数组与集合
数组其实也是我们经常用来组织和操作数据的类,但是数组与集合类的不同有二个不同的地方:
1. 数组的长度是固定不变的,集合的长度是可变的。
1. 数组用来存放基本的类型数据,集合用来存放对象的引用。
### 二:集合
Java容器类包含Collection, List(链表), ArrayList, LinkedList ,Vector(向量),Stack(堆栈), Set(集合), TreeSet, HashSet,Map(映射表), TreeMap, HashMap, Queue(队列), Deque(双队列)。
Collection
|----List
| |----ArrayList
| |----LinkedList
| |----Vector
| |----Stack
|----Set
| |----HashSet
| |----SortedSet
| |----TreeSet
|----Queue
| |----Deque
Map
|----HashMap
|----TreeMap
#### 2.1 Collection接口
Interface Collection<E>: Collection接口是一个根接口,它提供了对数据的add,remove,iterator()方法。
~~~
Collection list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
Iterator it = list.iterator();
while(it.hasNext()){
String str = (String) it.next();
System.out.println(str);
}
~~~
#### 2.2 List(链表), ArrayList,LinkedList,Vector,Stack
List接口相当于链表,是有序的Collection,其中的元素可重复,各元素的顺序是对象插入的顺序。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
Collection
|----List
|----LinkedList
|----ArrayList
|----Vector
|----Stack
ArrayList类:
ArrayList实现了可变的数组,允许所有元素,包括null.并可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入对象或删除对象的速度较慢。所以,它适合随机查找和遍历,不适合插入和删除。ArrayList是非同步的。
LinkList类:
LinkList类采用了链表的结构保存对象。所以便于向集合中插入和删除对象,需要向集合中插入和删除对象时,LinkList类效率较好,但是对于随机访问集合中的对象,LinkList效率慢。所以,它适合数据的动态插入和删除,不适合随机访问和遍历,LinkList也是非同步的。
Vector类:
Vector非常类似ArrayList,但是Vector是支持线程同步的。即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。所以,它适合对线程同步有要求的数据,但是效率比ArrayList要慢。
~~~
Vector vector = new Vector();
vector.addElement("one");
vector.addElement("two");
vector.addElement("three");
vector.insertElementAt("zero",0);
vector.insertElementAt("oop",3);
vector.setElementAt("three",3);
vector.setElementAt("four",4);
//vector.removeAllElements();
printData(vector.iterator());
~~~
~~~
private static void printData(Iterator it){
while(it.hasNext()){
String str = (String) it.next();
System.out.println(str);
}
}
~~~
Stack类:
Stack是Vector的一个子类,它实现标准的后进先出堆栈。
~~~
Stack stack = new Stack();
stack.push(new Integer(11111));
printStack(stack);
stack.push("absdder");
printStack(stack);
stack.push(new Double(29999.3));
printStack(stack);
stack.push(220.2);
printStack(stack);
String s = new String("absdder");
System.out.println("元素absdder在堆栈的位置"+stack.search(s));
System.out.println("元素11111在堆栈的位置"+stack.search(11111));
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
~~~
~~~
private static void printStack(Stack stack) {
// TODO Auto-generated method stub
if (stack.empty())
System.out.println("堆栈是空的,没有元素");
else {
System.out.print("堆栈中的元素:");
Enumeration items = stack.elements();
while (items.hasMoreElements())
System.out.print(items.nextElement()+" ");
}
System.out.println();
}
~~~
### 2.3 Set(集合),SortedSet(有序集合),HashSet,TreeSet,
Collection
|----Set
|----HashSet
|----SortedSet
|----TreeSet
Set集合:
Set接口,Set集合中的对象不按特定的方式排序,只是简单的把对象加入到集合中,但是Set集合中不能包含重复对象。
SortedSet(有序集合):
SortedSet接口扩展了Set并说明了按升序排列的集合的特性
HashSet:
HashSet,由哈希表(实际是一个HashMap实例)。它不保证Set的迭代顺序,特别是不保证此顺序不变。
TreeSet:
TreeSet类实现了Set和SortedSet接口,因此,能对集合的元素进行排序。
~~~
Set set = new TreeSet();
set.add("first_item");
set.add("second_item");
set.add("third_item");
Iterator it = set.iterator();
while(it.hasNext()){
String str = (String) it.next();
System.out.println(str);
}
~~~
### 2.4 Map,HashMap,TreeMap
|----Map
| |----HashMap
| |----TreeMap
Map:
Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
HashMap:
HashMap类实现了Map集合,是基于哈希表的Map接口实现,允许使用null值和null键。它实现的Map集合对于添加和删除映射关系效率比较高,所以用的比较多。但是HashMap不能保证映射的顺序。
TreeMap:
TreeMap类实现了Map和SortedMap接口,因此映射的关系有一定的顺序,但是添加,删除和定位映射关系时,性能比HashMap差。由于TreeMap映射有一定的顺序,所以不允许键对象是null。
~~~
HashMap hashmap = new HashMap();
hashmap.put("key_Item0","Value0");
hashmap.put("key_Item1","Value1");
hashmap.put("key_Item2","Value2");
hashmap.put("key_Item3","Value3");
Set set = hashmap.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext())
{
Map.Entry mapentry = (Map.Entry) iterator.next();
System.out.println(mapentry.getKey()+"/"+mapentry.getValue());
}
set = hashmap.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
String str = (String) it.next();
System.out.println(str);
}
Collection collection = hashmap.values();
it = collection.iterator();
while(it.hasNext()){
String str = (String) it.next();
System.out.println(str);
}
~~~
### 2.5 queue(队列), Deque(双队列)
|----Collection
| |----Queue
| |----Deque
queue(队列):
队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素就是说,队列以一种先进先出的方式管理数据。
~~~
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("element="+queue.element()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("peek="+queue.peek()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
~~~
Deque(双队列):
Deque(双队列),或双端队列,是需要在队列的二端都能插入和删除数据,但是不需要在中队列的中间插入和删除数据的场合所使用的一种数据结构。
### 三.参考资料:
(1)Java 从入门到精通 第二版 清华大学出版社 李钟尉,周小彤编著 第14章 集合类
(2)java api
[http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4](http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4)
(3)Java容器——JSTL学习笔记
[http://www.cnblogs.com/viviman/archive/2013/01/14/2860198.html](http://www.cnblogs.com/viviman/archive/2013/01/14/2860198.html)
(4)Java容器集合类的区别用法
[http://www.cnblogs.com/sunliming/archive/2011/04/05/2005957.html](http://www.cnblogs.com/sunliming/archive/2011/04/05/2005957.html)
(5)游戏编程精粹1 1.4 在游戏编程中使用STL