Java集合就像一种容器,我们可以将多个对象(实际上是对象的引用,但习惯上都称为对象)“丢进”容器。
集合框架图(所画为常用关系)[img]http://dl.iteye.com/upload/attachment/431433/b41eaef1-6123-3d7a-882b-b2b06394120a.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/431435/e65bd724-b657-32dc-bbe0-938ba14a0e75.jpg[/img]
HashSet :
1、不能保证元素的排列顺序,顺序有可能发生改变;
2、HashSet不是同步的,多个线程访问一个HashSet时,必须通过代码来保证其同步;
3、集合元素可以是null;
当向HashSet中存入元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode(),然后根据HashCode值决定对象在HashSet中存储位置。如果有两个元素通过equals方法比较返回true,但他们的hashCode()方法返回值不相等,HashSet会将它们放在不同的位置;
简单的说,两个元素相等的标准是:equals相等、hashCode()相等;
测试
ArrayList,Vector都是基于数组实现的List的类,它们最显著的区别是:ArrayList是线程不安全的,而Vector是线程安全的,所以性能上要比ArrayList低。Vector还提供了一个Stack子类,它用于模拟“栈”这个数据结构;
LinkedList是基于链表实现的List类,可以根据索引随机访问集合中的元素,可以当作List使用,另外它也实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,根据Deque中的方法,它中以当作双向队列和“栈”使用;与前两种实现类相比而言,它更适合插入、删除元素(只要改变指针所指的地址即可),基于数组实现ArrayList,Vector则更适合随机访问;数组在实现机制上是以连续内存区保存元素;
HashMap,Hashtable
Hashtable是一个线程安全的Map实现类,HashMap是线程不安全的实现类,所以性能上要比Hashtable高,Hashtable不允许null作为key、value,如果试图插入null时会报NullPointException异常,但是HashMap则可以;
操作集合的工具类Collections,该工具类提供了大量的方法对集合元素进行排序、查找和修改等操作,还提供了将集合对象设置为不可变,对集合对象实现同步控制等方法。
集合框架图(所画为常用关系)[img]http://dl.iteye.com/upload/attachment/431433/b41eaef1-6123-3d7a-882b-b2b06394120a.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/431435/e65bd724-b657-32dc-bbe0-938ba14a0e75.jpg[/img]
HashSet :
1、不能保证元素的排列顺序,顺序有可能发生改变;
2、HashSet不是同步的,多个线程访问一个HashSet时,必须通过代码来保证其同步;
3、集合元素可以是null;
当向HashSet中存入元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode(),然后根据HashCode值决定对象在HashSet中存储位置。如果有两个元素通过equals方法比较返回true,但他们的hashCode()方法返回值不相等,HashSet会将它们放在不同的位置;
简单的说,两个元素相等的标准是:equals相等、hashCode()相等;
测试
public class A {
public boolean equals(Object obj) {
return true;
}
}
public class B {
public int hashCode() {
return 1;
}
}
public class C {
public int hashCode() {
return 2;
}
public boolean equals(Object obj) {
return true;
}
}
public class Test {
public static void main(String args[]) {
HashSet set = new HashSet();
// set中添加对象
set.add(new A());
set.add(new A());
set.add(new B());
set.add(new B());
set.add(new C());
set.add(new C());
System.out.println(set);
}
}
结果:[testSet.B@1, testSet.B@1, testSet.C@2, testSet.A@1fb8ee3, testSet.A@c17164]
ArrayList,Vector,LinkedList
ArrayList,Vector都是基于数组实现的List的类,它们最显著的区别是:ArrayList是线程不安全的,而Vector是线程安全的,所以性能上要比ArrayList低。Vector还提供了一个Stack子类,它用于模拟“栈”这个数据结构;
LinkedList是基于链表实现的List类,可以根据索引随机访问集合中的元素,可以当作List使用,另外它也实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,根据Deque中的方法,它中以当作双向队列和“栈”使用;与前两种实现类相比而言,它更适合插入、删除元素(只要改变指针所指的地址即可),基于数组实现ArrayList,Vector则更适合随机访问;数组在实现机制上是以连续内存区保存元素;
HashMap,Hashtable
Hashtable是一个线程安全的Map实现类,HashMap是线程不安全的实现类,所以性能上要比Hashtable高,Hashtable不允许null作为key、value,如果试图插入null时会报NullPointException异常,但是HashMap则可以;
操作集合的工具类Collections,该工具类提供了大量的方法对集合元素进行排序、查找和修改等操作,还提供了将集合对象设置为不可变,对集合对象实现同步控制等方法。