目录
Java.util包的集合框架
List接口
Set接口
Map接口
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 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 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 set = new HashSet<>();
for (String s: str){
set.add(s);
}
System.out.println(set);
}
//输出结果:[吃饭, 起床, 睡觉]
如果想让插入顺序和存储顺序相同,我们就使用 linkedHashSet类:
public static void main(String[] args) {
String[] str = {"起床","吃饭","睡觉"};
Set set1 = new linkedHashSet<>();
for (String s: str){
set1.add(s);
}
System.out.println(set1);
}
//输出结果:[起床, 吃饭, 睡觉]
Map接口
Map接口是一个映射关系,一次存储两个元素,存储的是
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 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( )获取集合中所有的 value 集合: values( )获取集合中所有的键值对 : Map.Entry接口,将Map-->Set
代码示例:
Mapmap = new HashMap<>(); //key值为学号,value为姓名 map.put(1,"张三"); map.put(2,"李四"); map.put(8,"王五"); System.out.println(map.keySet()); System.out.println(map.values()); Set > entry = map.entrySet(); for(Map.Entry 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:此接口存储的就是一个个键值对对象,它认为
HashMap 、 TreeMap 、 LinedHashMap区别
HashMap是基于哈希表 + 红黑树的结构(JDK8之后),HashMap的元素保存顺序与插入顺序无关。
TreeMap是基于红黑树的结构,元素保存顺序与插入顺序无关。key不能为null,value可以为空。使用TreeMap保存元素时,元素必须是 Comparable 子类或者传入比较器。
LinedHashMa 就是在 HashMap 的基础上维护了一个链表来记录元素的插入先后,可以按照元素的插入顺序来保存元素。
写在最后:
Set和Map天然就是一个查找或者搜索语句。做题时如果要对第一次出现的元素做特殊处理,就可以利用Set集合的add方法的返回值来巧妙处理。我们做题最常遇到的就是Map接口,它的核心操作就是查找



