ArrayList 允许快速随机存取,相比于LinkedList不适合拿来进行元素安插和移除操作。
LinkedList 提供最佳循序存取,适合安插和移除元素,随机存取操作比ArrayList缓慢。
HashSet 只存放唯一值,是把搜寻时间看得很重要,用hash方式作set,故Access time complexity = O(1)
TreeSet 同上,但是存入的元素都会经过排序,所以速度比HashSet慢一点
LinkedHashSet 此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。
Set 无序的,不可以重复元素
|--HashSet: 底层数据结构是哈希表, 线程不同步
hashSet是如何保证元素唯一性呢?
是通过元素的两个方法, hashCode 和 equals 来完成的
如果元素的hashCode值相同,才会判断equals 是否为true
如果元素的hashCode值不同,不会调用 equals.
注意: 对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法.
|--TreeSet: 可以对Set集合中的元素进行排序
底层数据结构式是二叉树
compareTo 方法 return 0 TreeSet 中就只会有一个 元素
如果我们自己定义的一个类的对象要加入到TreeSet当中,那么这个类必须要实现Comparable接口。
/**
* testTreeSet1自然排序 testTreeSet2自定义排序
*/
public class TreeSetTest {
public static void main(String[] args) {
TreeSetTest tst = new TreeSetTest();
tst.testTreeSet1();
tst.testTreeSet2();
}
public void testTreeSet1() {
Set set1 = new TreeSet();
set1.add( new BigDecimal( "3")) ;
set1.add( new BigDecimal( "5")) ;
set1.add( new BigDecimal( "1")) ;
set1.add( new BigDecimal( "9")) ;
//会报错java. lang.String cannot be cast to java.math.BigDecimal
//set1.add("1");
for (Iterator it = set1.iterator(); it.hasNext();) {
System. out .println(it.next());
}
//output:1 3 5 9
}
public void testTreeSet2() {
Set set1 = new TreeSet();
set1.add( new Customer( "Tom", 20)) ;
set1.add( new Customer( "Petter" , 22));
set1.add( new Customer( "Mike" , 19));
set1.add( new Customer( "Tom", 21)) ;
for (Iterator it = set1.iterator(); it.hasNext();) {
System. out .println(it.next());
}
//output:
//Mike 19
//Petter 22
//Tom 20
//Tom 21
}
//注:要实现equals,hashCode方法
class Customer implements Comparable{
public String name ;
public int age ;
public Customer(String name, int age) {
this .name = name;
this .age = age;
}
@Override
public String toString() {
return this .name + " " + this .age ;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true ;
if (!(obj instanceof Customer)) return false ;
Customer other = (Customer)obj;
if (this .name .equals(other. name) && this .age == other.age ) {
return true ;
} else {
return false ;
}
}
@Override
public int hashCode() {
int result;
result = ( name == null ? 0 : name.hashCode());
result = 29 * result + age ;
return result;
}
@Override
public int compareTo(Object o) {
Customer other = (Customer)o;
//先按name属性排序(如果想按倒序排序,则将下面依次改成返回-1/1)
if (this .name .compareTo(other. name) > 0) return 1;
if (this .name .compareTo(other. name) < 0) return -1;
//再按age属性排序
if (this .age > other. age) return 1;
if (this .age < other. age) return -1;
return 0;
}
}
}

被折叠的 条评论
为什么被折叠?



