set集合(重中之重)

  • 基本概念

    java.util.Set集合是Collection集合的子集合,与List集合以及Queue集合属于平级

    该集合与List集合相比元素没有先后放入次序,并且不允许有重复的元素。

    该集合的主要实现类有:HashSet类 和 TreeSet类。

    其中HashSet类的底层是采用哈希表进行数据管理的。

    其中TreeSet类的底层是采用二叉树进行数据管理的。

  • 常用的方法

    参考Collection集合中的方法即可;

    Iterator iterator() - 用于获取当前集合中的迭代器对象,可以取出每个元素。

    其中Iterator是个接口类型,该接口的常用方法有:

    boolean hasNext() - 用于判断集合中是否有可以访问的元素。

    E next() - 用于获取集合中一个元素并指向下一个元素。

    void remove() - 用于删除迭代器获取到的元素。

    思考:

    为啥要保证hashCode方法和equals方法的一致性???

    解析:

    只要equals方法相等则要求hashCode相同,而哈希码值相同时使用同一个哈希算法算出来的索引位置就相同,从而避免同一个元素所在索引位置不同引发的错误。

  • 增强版的for循环(for each结构)

    语法格式

    1
    2
    3
    for(元素类型 变量名 : 数组/集合的名称) {
    循环体;
    }

    执行流程

    不断地从数组/集合中取出一个元素赋值给变量后执行循环体,直到所有元素取完为止.

    总结:

    遍历Set集合中所有元素的方式有3种:toString方法、for each结构、迭代器

    遍历List集合中所有元素的方式有4种:除了上述3种外还有get方法。

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetTest {
public static void main(String[] args) {
// 1.声明Set类型的引用指向实现类的对象
Set<String> s1 = new HashSet<String>();
// 2.向集合中添加元素 元素没有先后放入次序
boolean b1 = s1.add("two");
System.out.println("b1 = " + b1); // true
System.out.println("s1 = " + s1); // [two]

b1 = s1.add("one");
System.out.println("b1 = " + b1); // true
System.out.println("s1 = " + s1); // [one, two]

b1 = s1.add("three");
System.out.println("b1 = " + b1); // true
System.out.println("s1 = " + s1); // [one, two, three]
// 集合中不允许有重复的元素
b1 = s1.add("three");
System.out.println("b1 = " + b1); // false
// 方式一:自动调用toString方法打印所有元素 String类型的整体
System.out.println("s1 = " + s1); // [one, two, three]

System.out.println("-------------------------------------");
// 方式二:使用迭代器的方式获取 比toString方式更加灵活
// 3.1 获取集合中的迭代器对象
Iterator<String> it = s1.iterator();
while(it.hasNext()) {
System.out.println("获取到的元素是:" + it.next());
}
/*
// 3.2 判断集合中是否有可以访问的元素
System.out.println(it.hasNext()); // true
// 3.3 取出集合中的元素并指向下一个元素
System.out.println("获取到的元素是:" + it.next()); // one

System.out.println(it.hasNext()); // true
System.out.println("获取到的元素是:" + it.next()); // two

System.out.println(it.hasNext()); // true
System.out.println("获取到的元素是:" + it.next()); // three

System.out.println(it.hasNext()); // false
// java.util.NoSuchElementException 没有这样的元素异常
// System.out.println("获取到的元素是:" + it.next()); //
*/

System.out.println("-------------------------------------");
// 练习:使用迭代器实现toString方法的效果
StringBuilder sb1 = new StringBuilder();
sb1.append("[");
// 重新获取一下集合中的迭代器
it = s1.iterator();
while(it.hasNext()) {
String ts = it.next();
// 若该元素不是最后一个元素则拼接元素值、逗号、空格
if(it.hasNext()) {
sb1.append(ts).append(",").append(" ");
}
// 若该元素是最后一个元素则拼接元素值、]
else {
sb1.append(ts).append("]");
}
}
System.out.println("s1 = " + sb1); // [one, two, three]

System.out.println("-------------------------------------");
// 4.使用迭代器访问集合中的元素,若遇到元素"two"则删除该元素
// 重新获取一下集合中的迭代器
it = s1.iterator();
while(it.hasNext()) {
String ts = it.next();
if("two".equals(ts)) {
it.remove(); // 删除刚刚获取到的元素 ok
// ConcurrentModificationException 并发修改异常
//s1.remove(ts); // error
}
}
System.out.println("删除后集合中的元素有:" + s1); // [one, three]

System.out.println("-------------------------------------");
// 方式三:使用增强版的for循环,也就是for each结构实现打印
for(String ts : s1) {
System.out.println(ts);
}

System.out.println("-------------------------------------");
int[] arr = {11, 22, 33, 44, 55};
for(int ti : arr) {
System.out.println(ti);
}
}
}

Map集合(重点)

  • 基本概念

    java.util.Map<K,V>集合中存取元素的基本单位是:单对元素,具体类型参数如下:

    K - 此映射所维护的键(Key)的类型

    V - 映射值(Value)的类型

    该集合中不能包含重复的键;每个键最多只能映射到一个值。

    该集合的主要实现类有:HashMap类 和 TreeMap类。

  • 常用方法

    V put(K key,V value)
    将Key-Value对存入Map,若集合中已经包含该Key,则替换该Key所对应的Value,返回值为该Key原来所对应的Value,若没有则返回null.

    V get(Object Key)
    返回与参数Key所对应的Value对象,如果不存在则返回null.

    boolean containsKey(Object Key)
    判断集合中是否包含指定的key.

    boolean containsValue(Object value)
    判断集合中是否包含指定的value.

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
69
70
71
72
73
74
75
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
// 1.声明Map集合的引用指向实现类的对象
Map<Integer, String> m1 = new HashMap<Integer, String>();
// 2.实现集合中元素的增加和修改的功能
String str1 = m1.put(1, "one");
System.out.println("str1 = " + str1); // null
// 自动调用toString方法,格式:{key1=value1, key2=value2, ...}
System.out.println("m1 = " + m1); // {1=one}

str1 = m1.put(2, "two");
System.out.println("str1 = " + str1); // null
System.out.println("m1 = " + m1); // {1=one, 2=two}

str1 = m1.put(3, "three");
System.out.println("str1 = " + str1); // null
System.out.println("m1 = " + m1); // {1=one, 2=two, 3=three}

str1 = m1.put(4, "four");
System.out.println("str1 = " + str1); // null
System.out.println("m1 = " + m1); // {1=one, 2=two, 3=three, 4=four}
// 实现修改的功能
str1 = m1.put(1, "eleven");
System.out.println("str1 = " + str1); // one
System.out.println("m1 = " + m1); // {1=eleven, 2=two, 3=three, 4=four}
System.out.println("----------------------------------");

// 3.实现集合中元素的查找行为
// 用于判断当前集合中是否包含参数指定的key
boolean b1 = m1.containsKey(11);
System.out.println("b1 = " + b1); // false
b1 = m1.containsKey(1);
System.out.println("b1 = " + b1); // true
// 用于判断当前集合中是否包含参数指定的value
b1 = m1.containsValue("one");
System.out.println("b1 = " + b1); // false
b1 = m1.containsValue("eleven");
System.out.println("b1 = " + b1); // true
// 根据参数指定的key来获取对应的value
String str2 = m1.get(4);
System.out.println("获取到的值是:" + str2); // four
str2 = m1.get(5);
System.out.println("获取到的值是:" + str2); // null
System.out.println("----------------------------------");

// 3.实现集合中元素的删除行为
String str3 = m1.remove(4);
System.out.println("被删除键值对中的值是:" + str3); // four
System.out.println("m1 = " + m1); // {1=eleven, 2=two, 3=three}
str3 = m1.remove(5);
System.out.println("被删除键值对中的值是:" + str3); // null
// 遍历Map集合中所有元素的方式一:调用toString方法
System.out.println("m1 = " + m1); // {1=eleven, 2=two, 3=three}
System.out.println("----------------------------------");

// 遍历Map集合中所有元素的方式二:获取Map集合中所有的key,调用keySet方法
Set<Integer> s1 = m1.keySet();
// 使用for each结构来遍历Set集合中的所有元素 灵活
for(Integer it : s1) {
System.out.println(it + "=" + m1.get(it));
}
System.out.println("----------------------------------");

// 遍历Map集合中所有元素的方式三:获取Map集合中所有的键值对
Set<Map.Entry<Integer, String>> s2 = m1.entrySet();
// 使用for each结构来遍历Set集合中的所有元素 灵活
for(Map.Entry<Integer, String> me : s2) {
//System.out.println(me);
System.out.println(me.getKey() + "=" + me.getValue());
}
}
}