目录
HashMap 、 TreeMap 、 LinedHashMap区别
Java.util包的集合框架
集合类用来存储元素,集合类中若用到基本数据类型,必须使用包装类。
List接口
List接口是一个线性表接口, 常用的两个子类为:
ArrayList(动态数组) :要保存的元素个数不确定,动态变化时使用
LinkedList(链表)
List的常用方法:
boolean add(E e) | 尾插 e |
void add(int index, E e) | 将 e 插入到 index 位置 |
E remove(int index) | 删除 index 位置元素 |
E set(int index, E e) | 将下标 index 位置元素设置为 e |
boolean contains(Object o) | 判断 o 是否在线性表中 |
E get(int index) | 获取下标 index 位置元素 |
代码示例:
public static void main(String[] args) {
//将一个数组变成List集合
int[] data = {1,3,5,7,9,11,11,13};
List<Integer> list = new ArrayList<>();
for (int i = 0; i < data.length; i++) {
//增加
list.add(data[i]);
}
//删除
list.remove(1);
//将下标 0位置元素改为 666
list.set(0,666);
System.out.println(list);
//查找
System.out.println(list.contains(2));
System.out.println(list.get(2));
}
//输出结果:
[666, 5, 7, 9, 11, 11, 13]
false
7
若要遍历List集合,只需要使用 for-each 循环即可。若要打印集合内容,直接调用println方法传入对象即可,因为集合类都覆写了toString方法。
代码示例:
System.out.println(list);
//list的遍历
for (int num : list){
System.out.print(num + " ");
}
//输出结果:
[666, 5, 7, 9, 11, 11, 13]
666 5 7 9 11 11 13
Set接口
Set接口一次存储一个不重复元素,它是List的子接口,除了元素的插入有了不重复的限制,其他用法和List差不多。Set集合是没有修改元素的方法的,只能把这个元素删除再添加一个新元素。
常见方法:
boolean add(E e) | 添加元素,但重复元素不会被添加成功 |
boolean contains(Object o) | 判断 o 是否在集合中 |
代码示例:
public static void main(String[] args) {
int[] data = {1,1,2,3,3,4,4,5,5,6,6,7};
Set<Integer> set = new HashSet<>();
for (int i = 0; i < data.length; i++) {
set.add(data[i]);
}
System.out.println(set);
System.out.println(set.contains(7));
}
//输出结果:[1, 2, 3, 4, 5, 6, 7]
true
可以看到,集合中没有重复元素,但是我们在使用HashSet类时,元素的顺序与实际存储顺序无关,因为hash的值不一定是有序的,我们来看一个示例:
public static void main(String[] args) {
String[] str = {"起床","吃饭","睡觉"};
Set<String> set = new HashSet<>();
for (String s: str){
set.add(s);
}
System.out.println(set);
}
//输出结果:[吃饭, 起床, 睡觉]
如果想让插入顺序和存储顺序相同,我们就使用 LinkedHashSet类:
public static void main(String[] args) {
String[] str = {"起床","吃饭","睡觉"};
Set<String> set1 = new LinkedHashSet<>();
for (String s: str){
set1.add(s);
}
System.out.println(set1);
}
//输出结果:[起床, 吃饭, 睡觉]
Map接口
Map接口是一个映射关系,一次存储两个元素,存储的是 <key,value> 结构的键值对,并且key一定是唯一的,不能重复。在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空。
HashMap的插入顺序也是不一定和存储顺序不同的,要想一直就使用LinkedMap.。
常用方法:
V put(K key, V value) | 设置 key 对应的 value |
V get(Object key) | 返回 key 对应的 value,若key不存在,返回null |
V getOrDefault(Object key, V defaultValue) | 返回 key 对应的 value,key 不存在,返回默认值 |
V remove(Object key) | 删除 key 对应的映射关系,返回删除的 |
boolean containsKey(Object key) | 判断是否包含 key |
boolean containsValue(Object value) | 判断是否包含 value |
🔔使用put方法,将key和对应的value存储到Map中,若key已经存在,则更新value值为新插入的值。代码示例:
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
//key值为学号,value为姓名
map.put(1,"张三");
map.put(2,"李四");
map.put(8,"王五");
System.out.println(map);
//当key重复时,更新值
map.put(1,"李铁蛋");
System.out.println(map);
System.out.println(map.get(2));
System.out.println(map.getOrDefault(19,"0"));
System.out.println(map.remove(8));
System.out.println(map);
}
// 输出:{1=张三, 2=李四, 8=王五}
{1=李铁蛋, 2=李四, 8=王五}
李四
0
王五
{1=李铁蛋, 2=李四}
Map集合的遍历和List 、Set不同:
- 获取集合中所有的 key 集合 :keySet( )
for (Character key : map.keySet()) { ... }
- 获取集合中所有的 value 集合: values( )
- 获取集合中所有的键值对 : Map.Entry接口,将Map-->Set
代码示例:
Map<Integer,String> map = new HashMap<>();
//key值为学号,value为姓名
map.put(1,"张三");
map.put(2,"李四");
map.put(8,"王五");
System.out.println(map.keySet());
System.out.println(map.values());
Set<Map.Entry<Integer,String>> entry = map.entrySet();
for(Map.Entry<Integer,String> temp : entry){
System.out.print(temp.getKey() + "=" + temp.getValue()+ " ");
}
//输出结果:
[1, 2, 8]
[张三, 李四, 王五]
1=张三 2=李四 8=王五
这里之所以遍历key和value使用不同方法,就是因为key值是唯一的,keySet方法返回的是Set集合;value是可以重复的,values方法返回的是Collection接口(是List的父接口),可以看作就是返回了List。
而Map.Entry:此接口存储的就是一个个键值对对象,它认为<key,value>是一个对象,将key和value捆绑到一起
HashMap 、 TreeMap 、 LinedHashMap区别
HashMap是基于哈希表 + 红黑树的结构(JDK8之后),HashMap的元素保存顺序与插入顺序无关。
TreeMap是基于红黑树的结构,元素保存顺序与插入顺序无关。key不能为null,value可以为空。使用TreeMap保存元素时,元素必须是 Comparable 子类或者传入比较器。
LinedHashMa 就是在 HashMap 的基础上维护了一个链表来记录元素的插入先后,可以按照元素的插入顺序来保存元素。
写在最后:
- Set和Map天然就是一个查找或者搜索语句。
- 做题时如果要对第一次出现的元素做特殊处理,就可以利用Set集合的add方法的返回值来巧妙处理。
- 我们做题最常遇到的就是Map接口,它的核心操作就是查找