为什么用集合?
想象一下,当你要做一个公司职员薪水管理系统的时候,不先考虑数据库,这时候如果用数组的话,固然是可以的,但是数组很不方便,因为数组的大小把握不了,当有员工的增加或者删除的时候,可能会导致数组的大小不够或者数组浪费。
当然可以用链表来解决,但是链表还不是最佳选择,这就引出了集合。可以动态的添加和修改。
java 集合类
- List结构的集合类:ArrayList类、LinkedList类、Vector类、Stack类
- Map结构的集合类:HashMap类、HashTable类
- Set结构的集合类:HashSet类、TreeSet类
- Queue结构的集合:Queue接口
ArrayList
首先引入包
import java.util.*;
然后定义ArrayList对象
ArrayList a = new ArrayList();
a_size = a.size();//a_size = 0,此时的大小为0
//向a中添加数据,类型是Object,也就是说可以添加任意类型的数据
Clerk clerk1 = new Clerk("song",50);
a.add(clerk1);//将元素加到列表的尾部,此时a的大小就是1了
Clerk clerk2 = new Clerk("wu",20);
a.add(clerk2);
//如何访问a中的数据?
//Clerk temp = a.get(0);这句错误,因为get函数返回的是Object类型。把一个子类交给一个父类,可以自动转换,但是把一个父类交给一个子类就不行了,可以强制转换
Clerk temp = (Clerk)a.get(0);//取出第一个数据,这里和数组的下标差不多
//遍历所有的数据
for(int i =0;i < a.size();i++){
Clerk temp = (Clerk)a.get(i);
//.....
}
a.add(clerk1);//再次放一次也可以!
//删除元素
a.remove(1);
LinkedList
很多方法和ArrayList都差不多但是多了下列几个:
LinkedList ll = new LinkedList();
ll.addFirst(a1);//把a1加在最前面
ll.addLast(a2);//把a2加在最后面
ll.remove(1);
Vector 向量
多数方法和上面类似,但是区别是,
Stack 栈
HashMap
HashMap hm = new HashMap();
hm.put("01",emp1);
hm.put("02",emp2);
hm.put("02",emp3);//此时,“02”对应的值更新了,Key值不能相同!
if(hm.containKey("02")){
Emp emp = (Emp)hm.get("01");
}
Iterator it = hm.keySet().iterator();
while(it.hasNext()){
String key = it.next().toString();
Emp emp = (Emp)hm.get(key);
}
HashMap 和HashTable区别
- HashTable是同步的,这个类中的一些方法保证了HashTable中的对象是线程安全的,而HashMap则是异步的,因此HashMap中的对象不是线程安全的,因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。
- HashMap可以让你将一个空值作为一个表的条目的key或velue,但是HashTable是不能放入空值的。
ArrayList 和 Vector的区别
- Vector是同步的,Arraylist是异步的。
- 从内部机制来讲二者都是用数组来控制集合中的对象。如果长度增加超过了内部数组的长度,它们需要增加目前的长度来扩展内部数组的长度,Vector缺省情况下自动增长原来的一倍,ArrayList是原来的50%。
总结
- 如果考虑线程安全,考虑:Vector,HashTable
- 如果不要求线程安全:ArrayList、LinkedList、HashMap
- 如果要求键值对,则使用HashMap、HashTable
- 如果数据量很大,又要线程安全,则Vector
- 其实这些都可以用到java中的多态,这样更加灵活,比如:
List l = new ArrayList();