原文地址:https://www.cloudcrossing.xyz/post/43/
1 Map集合
1.1 Map集合概述
Map是将键和值一 一映射的对象,可以通过键来获取值。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map和Collection的区别?
- A:Map存储的是键值对形式的元素,键唯一,值可以重复
- B:Collection存储的是单独出现的元素
- 子接口Set元素唯一
- 子接口List元素可以重复
- C:数据结构
- Map集合的数据结构只针对键有效,跟值无关
- Collection集合的数据结构是针对元素有效
1.2 Map集合功能
- A:添加功能
- V put(K key, V value):添加元素
- 如果键是第一次存储,就直接存储元素,返回NULL
- 如果键不是第一次存储,就用值把以前的值替换掉,返回被替换的值
- V put(K key, V value):添加元素
- B:删除功能
- void clear():移除所有的键值对元素
- V remove(Object key):根据指定键删除键值对元素,返回被删除的值
- C:判断功能
- boolean containsKey(Object key):判断集合是否包含指定的键
- boolean containsValue(Objecy value):判断集合是否包含指定的值
- boolean isEmpty():判断集合是否为空
- D:获取功能
- Set<Map.Entry<K, V>> entrySet():返回的是键值对对象的集合
- V get(Object key):获取指定键的值
- Set<K> keySet():获取集合中所有键的集合
- Collection<V> values():获取集合中所有值的集合
- int size():返回集合中键值对的对数
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 添加元素
// V put(K key,V value):添加元素
// System.out.println("put:" + map.put("文章", "马伊俐")); //NULL
// System.out.println("put:" + map.put("文章", "姚笛")); //马伊俐
map.put("邓超", "孙俪");
map.put("黄晓明", "杨颖");
map.put("周杰伦", "蔡依林");
// void clear():移除所有的键值对元素
// map.clear();
// V remove(Object key):根据键删除键值对元素,并把值返回
// System.out.println("remove:" + map.remove("黄晓明")); //杨颖
// System.out.println("remove:" + map.remove("黄晓波")); //null
// boolean containsKey(Object key):判断集合是否包含指定的键
// System.out.println("containsKey:" + map.containsKey("黄晓明")); //true
// System.out.println("containsKey:" + map.containsKey("黄晓波")); //false
// boolean isEmpty():判断集合是否为空
// System.out.println("isEmpty:"+map.isEmpty());
//int size():返回集合中的键值对的对数
System.out.println("size:"+map.size());
// 输出集合名称
System.out.println("map:" + map);
}
}
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo2 {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 创建元素并添加元素
map.put("邓超", "孙俪");
map.put("黄晓明", "杨颖");
map.put("周杰伦", "蔡依林");
// V get(Object key):根据键获取值
System.out.println("get:" + map.get("周杰伦")); //蔡依林
System.out.println("get:" + map.get("周杰")); // null
System.out.println("----------------------");
// Set<K> keySet():获取集合中所有键的集合
Set<String> set = map.keySet();
for (String key : set) {
System.out.println(key);//输出所有键
}
System.out.println("----------------------");
// Collection<V> values():获取集合中所有值的集合
Collection<String> con = map.values();
for (String value : con) {
System.out.println(value);//输出所有值
}
}
}
1.3 Map集合遍历
A:通过键找值:
- a:获取所有键的集合
- b:遍历键的集合,得到每一个值
- c:根据键到集合中去找值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo3 {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 创建元素并添加到集合
map.put("杨过", "小龙女");
map.put("郭靖", "黄蓉");
map.put("杨康", "穆念慈");
// 遍历
// 获取所有的键
Set<String> set = map.keySet();
// 遍历键的集合,获取得到每一个键
for (String key : set) {
// 根据键去找值
String value = map.get(key);
System.out.println(key + "---" + value);
}
}
}
B:通过键值对对象找键和值:
- a:获取所有键值对对象的集合
- b:遍历键值对对象的集合,获取每一个键值对对象
- c:根据键值对对象去获取键和值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo4 {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 创建元素并添加到集合
map.put("杨过", "小龙女");
map.put("郭靖", "黄蓉");
map.put("杨康", "穆念慈");
// 获取所有键值对对象的集合
Set<Map.Entry<String, String>> set = map.entrySet();
// 遍历键值对对象的集合,得到每一个键值对对象
for (Map.Entry<String, String> me : set) {
// 根据键值对对象获取键和值
String key = me.getKey();
String value = me.getValue();
System.out.println(key + "---" + value);
}
}
}
![](https://img.haomeiwen.com/i9578471/078a94b77125a27d.png)
1.4 HashMap集合
HashMap基于哈希表(保证键的唯一性)的 Map 接口的实现,允许使用 null 值和 null 键(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同)。
HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。
import java.util.HashMap;
import java.util.Set;
/*
* HashMap<String,Student>
* 键:String 学号
* 值:Student 学生对象
*/
public class HashMapDemo3 {
public static void main(String[] args) {
// 创建集合对象
HashMap<String, Student> hm = new HashMap<String, Student>();
// 创建学生对象
Student s1 = new Student("周星驰", 58);
Student s2 = new Student("刘德华", 55);
Student s3 = new Student("梁朝伟", 54);
Student s4 = new Student("刘嘉玲", 50);
// 添加元素
hm.put("9527", s1);
hm.put("9522", s2);
hm.put("9524", s3);
hm.put("9529", s4);
// 遍历
Set<String> set = hm.keySet();
for (String key : set) {
Student value = hm.get(key);
System.out.println(key + "---" + value.getName() + "---"
+ value.getAge());
}
}
}
和HashSet一样,HashMap依赖 hashCode() 和 equals() 来保证键的唯一性。所以需要根据情况重写 作为键值的自定义类的 这两个方法。
import java.util.HashMap;
import java.util.Set;
/*
* HashMap<Student,String>
* 键:Student
* 要求:如果两个对象的成员变量值都相同,则为同一个对象。
* 值:String
*/
public class HashMapDemo4 {
public static void main(String[] args) {
// 创建集合对象
HashMap<Student, String> hm = new HashMap<Student, String>();
// 创建学生对象
Student s1 = new Student("貂蝉", 27);
Student s2 = new Student("王昭君", 30);
Student s3 = new Student("西施", 33);
Student s4 = new Student("杨玉环", 35);
Student s5 = new Student("貂蝉", 27);
// 添加元素
hm.put(s1, "8888");
hm.put(s2, "6666");
hm.put(s3, "5555");
hm.put(s4, "7777");
hm.put(s5, "9999");
// 遍历
Set<Student> set = hm.keySet();
for (Student key : set) {
String value = hm.get(key);
System.out.println(key.getName() + "---" + key.getAge() + "---"
+ value);
}
}
}
class Student {
...
public int hashCode() {...}
public boolean equals(Object obj) {...}
}
/*运行结果:
王昭君---30---6666
貂蝉---27---9999
杨玉环---35---7777
西施---33---5555*/
1.5 LinkedHashMap集合
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
import java.util.LinkedHashMap;
import java.util.Set;
public class demo {
public static void main(String[] args) {
// 创建集合对象
LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();
// 创建并添加元素
hm.put("2345", "hello");
hm.put("1234", "world");
hm.put("3456", "java");
hm.put("1234", "javaee");
hm.put("3456", "android");
// 遍历
Set<String> set = hm.keySet();
for (String key : set) {
String value = hm.get(key);
System.out.println(key + "---" + value);
}
}
}
/*运行结果:
2345---hello
1234---javaee
3456---android*/
1.6 TreeMap集合
TreeMap是基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
自然排序的遍历实现:
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
// 创建集合对象
TreeMap<String, String> tm = new TreeMap<String, String>();
// 创建元素并添加元素
tm.put("hello", "你好");
tm.put("world", "世界");
tm.put("java", "爪哇");
tm.put("world", "世界2");
tm.put("javaee", "爪哇EE");
// 遍历集合
Set<String> set = tm.keySet();
for (String key : set) {
String value = tm.get(key);
System.out.println(key + "---" + value);
}
}
}
/*运行结果:
hello---你好
java---爪哇
javaee---爪哇EE
world---世界2*/
比较器排序遍历的实现:
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo2 {
public static void main(String[] args) {
// 创建集合对象
TreeMap<Student, String> tm = new TreeMap<Student, String>(
new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// 主要条件
int num = s1.getAge() - s2.getAge();
// 次要条件
int num2 = num == 0 ? s1.getName().compareTo(
s2.getName()) : num;
return num2;
}
});
// 创建学生对象
Student s1 = new Student("潘安", 30);
Student s2 = new Student("柳下惠", 35);
Student s3 = new Student("唐伯虎", 33);
Student s4 = new Student("燕青", 32);
Student s5 = new Student("唐伯虎", 33);
// 存储元素
tm.put(s1, "宋朝");
tm.put(s2, "元朝");
tm.put(s3, "明朝");
tm.put(s4, "清朝");
tm.put(s5, "汉朝");
// 遍历
Set<Student> set = tm.keySet();
for (Student key : set) {
String value = tm.get(key);
System.out.println(key.getName() + "---" + key.getAge() + "---"
+ value);
}
}
}
/*运行结果:
潘安---30---宋朝
燕青---32---清朝
唐伯虎---33---汉朝
柳下惠---35---元朝*/
1.7 Map集合练习
1.Hashtable和HashMap的区别?
- Hashtable:线程安全,效率低。不允许null键和null值
- HashMap:线程不安全,效率高。允许null键和null值
import java.util.Hashtable;
public class HashtableDemo {
public static void main(String[] args) {
Hashtable<String, String> hm = new Hashtable<String, String>();
hm.put("it001", "hello");
// hm.put(null, "world"); //报错NullPointerException
// hm.put("java", null); // 报错NullPointerException
System.out.println(hm);
}
}
2.List,Set,Map等接口是否都继承子Map接口?
- List,Set不是继承自Map接口,它们继承自Collection接口
- Map接口本身就是一个顶层接口
3.有一个字符串"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)。
分析:
- A:定义一个字符串(可以改进为键盘录入)
- B:定义一个TreeMap集合
- 键:Character
- 值:Integer
- C:把字符串转换为字符数组
- D:遍历字符数组,得到每一个字符
- E:拿刚才得到的字符作为键到集合中去找值,看返回值
- 是null:说明该键不存在,就把该字符作为键,1作为值存储
- 不是null:说明该键存在,就把值加1,然后重写存储该键和值
- F:定义字符串缓冲区变量
- G:遍历集合,得到键和值,进行按照要求拼接
- H:把字符串缓冲区转换为字符串输出
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
// 定义一个字符串
String line = "aababcabcdabcde";
// 定义一个TreeMap集合
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
//把字符串转换为字符数组
char[] chs = line.toCharArray();
//遍历字符数组,得到每一个字符
for(char ch : chs){
//拿刚才得到的字符作为键到集合中去找值,看返回值
Integer i = tm.get(ch);
//是null:说明该键不存在,就把该字符作为键,1作为值存储
if(i == null){
tm.put(ch, 1);
}else {
//不是null:说明该键存在,就把值加1,然后重写存储该键和值
i++;
tm.put(ch,i);
}
}
//定义字符串缓冲区变量
StringBuilder sb= new StringBuilder();
//遍历集合,得到键和值,进行按照要求拼接
Set<Character> set = tm.keySet();
for(Character key : set){
Integer value = tm.get(key);
sb.append(key).append("(").append(value).append(")");
}
//把字符串缓冲区转换为字符串输出
String result = sb.toString();
System.out.println("result:"+result);
}
}
4.HashMap嵌套HashMap
import java.util.HashMap;
import java.util.Set;
public class HashMapDemo2 {
public static void main(String[] args) {
// 创建集合对象
HashMap<String, HashMap<String, Integer>> czbkMap = new HashMap<String, HashMap<String, Integer>>();
// 创建基础班集合对象
HashMap<String, Integer> jcMap = new HashMap<String, Integer>();
// 添加元素
jcMap.put("陈玉楼", 20);
jcMap.put("高跃", 22);
// 把基础班添加到大集合
czbkMap.put("jc", jcMap);
// 创建就业班集合对象
HashMap<String, Integer> jyMap = new HashMap<String, Integer>();
// 添加元素
jyMap.put("李杰", 21);
jyMap.put("曹石磊", 23);
// 把基础班添加到大集合
czbkMap.put("jy", jyMap);
//遍历集合
Set<String> czbkMapSet = czbkMap.keySet();
for(String czbkMapKey : czbkMapSet){
System.out.println(czbkMapKey);
HashMap<String, Integer> czbkMapValue = czbkMap.get(czbkMapKey);
Set<String> czbkMapValueSet = czbkMapValue.keySet();
for(String czbkMapValueKey : czbkMapValueSet){
Integer czbkMapValueValue = czbkMapValue.get(czbkMapValueKey);
System.out.println("\t"+czbkMapValueKey+"---"+czbkMapValueValue);
}
}
}
}
5.HashMap嵌套ArrayList
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
public class HashMapIncludeArrayListDemo {
public static void main(String[] args) {
// 创建集合对象
HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>();
// 创建元素集合1
ArrayList<String> array1 = new ArrayList<String>();
array1.add("吕布");
array1.add("周瑜");
hm.put("三国演义", array1);
// 创建元素集合2
ArrayList<String> array2 = new ArrayList<String>();
array2.add("令狐冲");
array2.add("林平之");
hm.put("笑傲江湖", array2);
// 创建元素集合3
ArrayList<String> array3 = new ArrayList<String>();
array3.add("郭靖");
array3.add("杨过");
hm.put("神雕侠侣", array3);
//遍历集合
Set<String> set = hm.keySet();
for(String key : set){
System.out.println(key);
ArrayList<String> value = hm.get(key);
for(String s : value){
System.out.println("\t"+s);
}
}
}
}
6.ArrayList嵌套HashMap
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
public class ArrayListIncludeHashMapDemo {
public static void main(String[] args) {
// 创建集合对象
ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>();
// 创建元素1
HashMap<String, String> hm1 = new HashMap<String, String>();
hm1.put("周瑜", "小乔");
hm1.put("吕布", "貂蝉");
// 把元素添加到array里面
array.add(hm1);
// 创建元素1
HashMap<String, String> hm2 = new HashMap<String, String>();
hm2.put("郭靖", "黄蓉");
hm2.put("杨过", "小龙女");
// 把元素添加到array里面
array.add(hm2);
// 创建元素1
HashMap<String, String> hm3 = new HashMap<String, String>();
hm3.put("令狐冲", "任盈盈");
hm3.put("林平之", "岳灵珊");
// 把元素添加到array里面
array.add(hm3);
// 遍历
for (HashMap<String, String> hm : array) {
Set<String> set = hm.keySet();
for (String key : set) {
String value = hm.get(key);
System.out.println(key + "---" + value);
}
}
}
}
2 Collections类
2.1 Collections类概述
Collections类是针对集合进行操作的工具类,其成员方法都是静态方法。
Collection和Collections的区别?
- Collection:是单列集合的顶层接口,有子接口List和Set。
- Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法
2.2 常见方法
- public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
- public static <T> int binarySearch(List<?> list,T key):二分查找
- public static <T> T max(Collection<?> coll):最大值
- public static void reverse(List<?> list):反转
- public static void shuffle(List<?> list):随机置换
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
public class CollectionsDemo {
public static void main(String[] args) {
// 创建集合对象
List<Integer> list = new ArrayList<Integer>();
// 添加元素
list.add(30); list.add(20); list.add(50); list.add(10); list.add(40);
System.out.println("list:" + list);
// public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
// Collections.sort(list);
// System.out.println("list:" + list);
// [10, 20, 30, 40, 50]
// public static <T> int binarySearch(List<?> list,T key):二分查找
// System.out.println("binarySearch:" + Collections.binarySearch(list, 30));
// System.out.println("binarySearch:" + Collections.binarySearch(list, 300)); //-6
// public static <T> T max(Collection<?> coll):最大值
// System.out.println("max:"+Collections.max(list));
// public static void reverse(List<?> list):反转
// Collections.reverse(list);
// System.out.println("list:" + list);
//public static void shuffle(List<?> list):随机置换
Collections.shuffle(list);
System.out.println("list:" + list);
}
}
2.3 Collections类练习
1.Collections可以针对ArrayList存储基本包装类的元素排序,存储自定义对象可不可以排序呢?
- 可以。自然排序直接调用Collections.sort(),比较器排序则使用匿名内部类作为参数传入Collections.sort()中进行实现
- 如果同时有自然排序和比较器排序,以比较器排序为主
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CollectionsDemo {
public static void main(String[] args) {
// 创建集合对象
List<Student> list = new ArrayList<Student>();
// 创建学生对象
Student s1 = new Student("林青霞", 27);
Student s2 = new Student("风清扬", 30);
Student s3 = new Student("刘晓曲", 28);
Student s4 = new Student("武鑫", 29);
// 添加元素对象
list.add(s1); list.add(s2); list.add(s3); list.add(s4);
// 自然排序
// Collections.sort(list);
// 比较器排序(如果同时有自然排序和比较器排序,以比较器排序为主)
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num = s2.getAge() - s1.getAge();
int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
: num;
return num2;
}
});
// 遍历集合
for (Student s : list) {
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
2.模拟斗地主洗牌发牌并对牌进行排序
分析:
- A:创建一个HashMap集合
- B:创建一个ArrayList集合
- C:创建花色数组和点数数组
- D:从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可
- E:洗牌(洗的是编号)
- F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
- G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class PokerDemo {
public static void main(String[] args) {
// 创建一个HashMap集合
HashMap<Integer, String> hm = new HashMap<Integer, String>();
// 创建一个ArrayList集合
ArrayList<Integer> array = new ArrayList<Integer>();
// 创建花色数组和点数数组
// 定义一个花色数组
String[] colors = { "♠", "♥", "♣", "♦" };
// 定义一个点数数组
String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", };
// 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。
int index = 0;
for (String number : numbers) {
for (String color : colors) {
String poker = color.concat(number);
hm.put(index, poker);
array.add(index);
index++;
}
}
hm.put(index, "小王");
array.add(index);
index++;
hm.put(index, "大王");
array.add(index);
// 洗牌(洗的是编号)
Collections.shuffle(array);
// 发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
TreeSet<Integer> fengQingYang = new TreeSet<Integer>();
TreeSet<Integer> linQingXia = new TreeSet<Integer>();
TreeSet<Integer> liuYi = new TreeSet<Integer>();
TreeSet<Integer> diPai = new TreeSet<Integer>();
for (int x = 0; x < array.size(); x++) {
if (x >= array.size() - 3) {
diPai.add(array.get(x));
} else if (x % 3 == 0) {
fengQingYang.add(array.get(x));
} else if (x % 3 == 1) {
linQingXia.add(array.get(x));
} else if (x % 3 == 2) {
liuYi.add(array.get(x));
}
}
// 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
lookPoker("风清扬", fengQingYang, hm);
lookPoker("林青霞", linQingXia, hm);
lookPoker("刘意", liuYi, hm);
lookPoker("底牌", diPai, hm);
}
// 写看牌的功能
public static void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {
System.out.print(name + "的牌是:");
for (Integer key : ts) {
String value = hm.get(key);
System.out.print(value + " ");
}
System.out.println();
}
}
3 集合总结
3.1 Collection和Map
Collection(单列集合)
- List(有序,可重复)
- ArrayList:底层数据结构为数组,查询快,增删慢,线程不安全,效率高
- Vector:底层数据结构为数组,查询快,增删慢,线程安全,效率低
- LinkedList:底层数据结构为链表,查询慢,增删快,线程不安全,效率高
- Set(无序,唯一)
- HashSet:底层数据为哈希表,依赖 hashCode() 和 equals() (可由IDE自动生成)
- 执行顺序:
- 首先判断 hashCode() 是否相同
- 如果是,继续执行 equals() 。返回 true 说明元素重复,不添加;返回 false 直接添加到集合
- 如果否,则直接添加到集合
- LinkedHashSet:底层数据结构为链表和哈希表。由链表保证元素有序,由哈希表保证元素唯一
- 执行顺序:
- TreeSet:底层数据结构是红黑树(自平衡二叉树)
- 根据比较的返回值是否为0来保证元素的唯一性
- 元素的排序
- 自然排序(元素具备比较性):让元素所属类实现 Comparable 接口
- 比较器排序(集合具备比较性):让集合接受一个 Comparator 的实现类对象
- HashSet:底层数据为哈希表,依赖 hashCode() 和 equals() (可由IDE自动生成)
Map(双列集合)
- A:Map集合的数据结构只针对键有效,与值无关
- B:Map集合存储的是键值对形式的元素,键唯一,值可重复
- HashMap:底层数据结构为哈希表。线程不安全,效率高
- 哈希表依赖 hashCode() 和 equals()(可由IDE自动生成)
- 执行顺序:
- 首先判断 hashCode() 是否相同
- 如果是,继续执行 equals() 。返回 true 说明元素重复,不添加;返回 false 直接添加到集合
- 如果否,则直接添加到集合
- LinkedHashMap:底层数据结构为链表和哈希表。由链表保证元素有序,由哈希表保证元素唯一
- Hashtable:底层数据结构是哈希表。线程安全,效率低
- 哈希表依赖 hashCode() 和 equals()(可由IDE自动生成)
- 执行顺序:
- 首先判断 hashCode() 是否相同
- 如果是,继续执行 equals() 。返回 true 说明元素重复,不添加;返回 false 直接添加到集合
- 如果否,则直接添加到集合
- TreeMap:底层数据结构是红黑树。(自平衡的二叉树)
+ 根据比较的返回值是否为0来保证元素的唯一性
+ 元素的排序
+ 自然排序(元素具备比较性):让元素所属类实现 Comparable 接口
+ 比较器排序(集合具备比较性):让集合接受一个 Comparator 的实现类对象
3.2 集合使用场景
- 是否是键值对象形式:
- 是:Map
- 键是否需要排序:
- 是:TreeMap
- 否:HashMap
- 不知道,就使用HashMap
- 键是否需要排序:
- 否:Collection
- 元素是否唯一:
- 是:Set
- 元素是否需要排序:
- 是:TreeSet
- 否:HashSet
- 不知道,就使用HashSet
- 元素是否需要排序:
- 否:List
- 要安全吗:
- 是:Vector
- 否:ArrayList或者LinkedList
- 增删多:LinkedList
- 查询多:ArrayList
- 不知道,就使用ArrayList
- 不知道,就使用ArrayList
- 要安全吗:
- 是:Set
- 元素是否唯一:
- 是:Map
3.3 集合常见方法及遍历方式
- Collection:
- add()
- remove()
- contains()
- iterator()
- size()
- 遍历:
- 增强for
- 迭代器
- List
- get()
- 遍历:
- 普通for
- Set
- Map:
- put()
- remove()
- containskey()、containsValue()
- keySet()
- get()
- value()
- entrySet()
- size()
- 遍历:
- 根据键找值
- 根据键值对对象分别找键和值
网友评论