List、Set、Map
List、Set都是Collection的子类
List家族
有两种List,一种是ArrayList,另一种是LinkedList
1)ArrayList
用于经常使用索引进行访问,即随机访问
随机访问:数组在内存中按顺序排放,使用通过下标进行任意一个位置的访问
在List中间增加元素时会比较耗时
2)LinkedList
用链表进行存储,读取数据时是顺序访问,如果需要频繁的添加删除数据,用LinkedList比较合适
顺序访问:数据不是按照顺序进行排放的,是通过指针连在一起,访问元素时需要从链头开始访问
Set家族
有三种Set:HashSet、TreeSet、LinkedHashSet
Set不保存重复的元素
HashSet:首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法,如果equals为true,则视为同一个元素。HashSet可以去除重复,但是无序
TreeSet:TreeSet可以排序,其实现集合排序的两种方式
①让元素自身具备比较性,自定义类的话需要实现Comparable接口,并重写compareTo方法
例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68public class Demo4 {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person("aa", 20, "男"));
ts.add(new Person("bb", 18, "女"));
ts.add(new Person("cc", 17, "男"));
ts.add(new Person("dd", 17, "女"));
ts.add(new Person("dd", 15, "女"));
ts.add(new Person("dd", 15, "女"));
System.out.println(ts);
System.out.println(ts.size()); // 5
}
class Person implements Comparable {
private String name;
private int age;
private String gender;
public Person() {
}
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
//getter,setter
public int hashCode() {
return name.hashCode() + age * 37;
}
public boolean equals(Object obj) {
System.err.println(this + "equals :" + obj);
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender
+ "]";
}
public int compareTo(Object obj) {
Person p = (Person) obj;
System.out.println(this+" compareTo:"+p);
if (this.age > p.age) {
return 1;
}
if (this.age < p.age) {
return -1;
}
return this.name.compareTo(p.name);
}
}
②让容器自身具备比较性,自定义比较器,需要实现Comparator接口,并重写compare方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53public class Demo5 {
public static void main(String[] args) {
TreeSet ts = new TreeSet(new MyComparator());
ts.add(new Book("think in java", 100));
ts.add(new Book("java 核心技术", 75));
ts.add(new Book("现代操作系统", 50));
ts.add(new Book("java就业教程", 35));
ts.add(new Book("think in java", 100));
ts.add(new Book("ccc in java", 100));
System.out.println(ts);
}
}
class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
Book b1 = (Book) o1;
Book b2 = (Book) o2;
System.out.println(b1+" comparator "+b2);
if (b1.getPrice() > b2.getPrice()) {
return 1;
}
if (b1.getPrice() < b2.getPrice()) {
return -1;
}
return b1.getName().compareTo(b2.getName());
}
}
class Book {
private String name;
private double price;
public Book() {
}
//getter,setter
public Book(String name, double price) {
this.name = name;
this.price = price;
}
public String toString() {
return "Book [name=" + name + ", price=" + price + "]";
}
}
List和Set对比
- List:元素可重复,即可使用for也可使用迭代器;
- Set:元素不可重复,重复元素会覆盖掉,只能用迭代器,无法用下标
- 区别:
List:可以动态增长,查找元素效率高,插入删除效率低
Set:查找元素效率低,插入删除效率高
Map家族
List,Set都是继承自Collection接口,Map则不是
Map适合储存键值对的数据