首先看图对java集合框架有个大致认识
1.JDK提供一系列类,这些类可以存储任意类型的对象,并且长度可变,统称为集合。
2.集合按存储结构可分为单链集合(Collection)和双链集合类(Map)
Collection(根接口)有两个接口List,Set(子接口)
Map接口用于存储具有键(Key)、值(Value)映射关系的元素。主要实现类又HashMap和TreeMap
3.常用类有ArrayList LinkedList HashSet HashMap
Collection
List:
所有的元素线性存储,可以重复,通过索引访问,元素有序
- ArrayList:
- 前面的博客已经写过不在举例(自定义队列:https://blog.csdn.net/weixin_42621338/article/details/82080167)
- 优点:查找快,通过索引方式访问元素
- 缺点:增删慢,增删元素会需要创建新的数组,效率低
- LinkedList:
- 前面的博客已经写过不在举例(自定义链表:https://blog.csdn.net/weixin_42621338/article/details/82180021)
- 优点:增删快,链表中都用引用或者地址(指针)的方式和前后元素实现连接,增删的时候只需要改变元素之间的地址引用
- 缺点:查找慢,要从头节点通过引用或者地址一个个访问
set:
- HashSet:
- set中的元素不能重复的
public void demo1() {
HashSet<String> hs = new HashSet<String>();
hs.add("AAA");
System.out.println(hs+"first");
hs.add("AAA");
System.out.println(hs+"second");
}
输出: [AAA]first
[AAA]second
2.Set中的元素,没有顺序,严格的说,是没有按照元素的插入顺序排列。实际上里面的顺序会受到很多因素的印象,比如说JDK版本。但总是不是插入顺序就对了。
public void demo2() {
HashSet<String> hs = new HashSet<String>();
hs.add("AAA");
hs.add("BBB");
hs.add("CCC");
System.out.println(hs);
}
输出 [AAA, CCC, BBB]
3.Set不提供get()来获取指定位置的元素,所以遍历需要用到迭代器,或者增强型for循环
- TreeSet
- TreeSet可以确保集合元素处于排序状态
public static void main(String[] args) {
TreeSet nums=new TreeSet();
nums.add(5);
nums.add(2);
nums.add(3);
nums.add(8);
//输出集合元素,可以看到集合元素已经处于排序状态,输出【2,3,5,8】
System.out.println(nums);
//输出集合里的第一个元素,为2
System.out.println(nums.first());
//输出集合里最后一个元素,为8
System.out.println(nums.last());
}
2.TreeSet也不提供get()来获取指定位置的元素,所以遍历需要用到迭代器,或者增强型for循环
3.TreeSet支持两种排序方式,自然排序 和定制排序
如果要将自定义对象存入treeset中需要重新定义Comparable接口
Map:
-
hashmap
- HashMap储存数据的方式是键值对(key——value),通过key找到value
public class Test {
public static void main(String[] args) {
HashMap<String,String> dictionary = new HashMap<>();
dictionary.put("adc", "物理英雄");
dictionary.put("apc", "魔法英雄");
dictionary.put("t", "坦克");
System.out.println(dictionary.get("t"));
}
}
- 对于HashMap而言,key是唯一的,不可以重复
public class Test {
public static void main(String[] args) {
HashMap<String,Hero> heroMap = new HashMap<String,Hero>();
heroMap.put("gareen", new Hero("gareen1"));
System.out.println(heroMap);
//key为gareen已经有value了,再以gareen作为key放入数据,会导致原英雄,被覆盖
//不会增加新的元素到Map中
heroMap.put("gareen", new Hero("gareen2"));
System.out.println(heroMap);
//清空map
heroMap.clear();
Hero gareen = new Hero("gareen");
//同一个对象可以作为值插入到map中,只要对应的key不一样
heroMap.put("hero1", gareen);
heroMap.put("hero2", gareen);
System.out.println(heroMap);
}
}
- TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。