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;
}
}
}