The World Best ST.

List-Set-Map

字数统计: 821阅读时长: 3 min
2019/04/12 Share

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
68
public 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

@Override
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
+ "]";
}

@Override
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
53
public 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;
}

@Override
public String toString() {
return "Book [name=" + name + ", price=" + price + "]";
}

}

List和Set对比

  1. List:元素可重复,即可使用for也可使用迭代器;
  2. Set:元素不可重复,重复元素会覆盖掉,只能用迭代器,无法用下标
  3. 区别:
    List:可以动态增长,查找元素效率高,插入删除效率低
    Set:查找元素效率低,插入删除效率高

Map家族

List,Set都是继承自Collection接口,Map则不是
Map适合储存键值对的数据

HashMap原理
https://www.cnblogs.com/xingzc/p/5765572.html

CATALOG
  1. 1. List、Set、Map
    1. 1.1. List家族
      1. 1.1.1. 1)ArrayList
      2. 1.1.2. 2)LinkedList
    2. 1.2. Set家族
    3. 1.3. List和Set对比
    4. 1.4. Map家族