集合整理及基础操作

集合整理及基础操作

1、接口关系整理

集合顶层分为两大接口,collection,map
collection:单列元素集合的顶层接口。list 与 set 接口继承 collection 接口。
map:双列元素集合的顶层接口。
由此形成集合的三大类型。list、set、map。
Queen,使用较少,暂时不说有时间补上。

2、map 介绍

map 作为双列集合的跟接口,以键值对的形式存放元素。
java 中不提供对 map 接口的直接实现。使用其实现类构造对象。
主要使用的实现类有 HashMap 和 TreeMap。

2.1、HashMap

2.1.1、增删等操作

使用 put(),putAll()方法增加数据。put 方法将一个个键值对存放入 map 中,而 putAll 则将另一个集合添加进当前集合中。
putAll()方法添加的是集合的元素,会将一个集合中的元素添加到另一个集合中。

1
2
3
4
5
6
7
Map m = new HashMap();m.put("1", "1");
m.put("2", "2");
m.put("3", "3");
m.put("4", "4");
Map m1 = new HashMap();
m1.put("a","a");
m.putAll(m1);

使用 get()方法可以根据指定的键获相应的值。

1
Object o = m.get("1");

clear()方法则可以清空 map 集合中的数据。

1
m.clear();

使用 contansKey()和 cotainsValue()则可以分别根据 key 和 value 判断集合中是否包含该元素。

1
boolean b = m.containsKey("1");boolean b1 = m.containsValue("1");

使用 keySet()可以获取该 map 中所有 key 的集合。将其放入一个 set 集合中。

1
Set keyset = m.keySet();

使用 value()方法可以获取 map 中所有的值。不存在键值关系。

1
Collection values = m.values();

返回此映射中包含的映射关系的  Set  视图。不好理解,迭代时会用到。

1
Set entryset = m.entrySet();

2.1.2、源码和原理

HashMap 原理与源码解析

2.2、TreeMap

2.2.1、treemap 与 hashmap 的区别

treemap 追溯源头,treemap 不仅实现了 map 接口,也是实现了,sortedmap 接口。treemap 是有序的而 hashmap 无序。
treemap 是红黑树基于 sortedmap 接口的实现。而 hashmap 则根据键的 hashcode 存放数据。

2.2.2、增删等操作

因为实现了 map 接口,普通基础操作与 hashmap 相同。只是多了从 sortedmap 实现得来的排序能力。
插入 treemap 的键必须是可以比较的,即实现了 Comparable 接口,否则会抛出异常。
插入的键为自定义对象时需要实现 Comparable 接口,重写其中的方法。
同样可以自定义 treemap 的排序规则。

1
2
3
4
5
6
7
Map<Integer,Integer> m2 = new TreeMap(new Comparator() {    @Override
public int compare(Object o1, Object o2) {
Double a = (Double) o1;
Double b = (Double) o2;
return (a > b ? 1 : 0);
}
});

2.2.3、源码和原理

TreeMap 原理与源码解析

3、list 介绍

list 继承了 collection 接口,是 ArrayList,LinkedList 等 List 集合的跟接口。list 集合是单列集合。
因为 list 底层采用链表或数组实现,所以 list 是一种无序的集合。

3.1、ArrayList

3.1.1、增删改等操作

采用 add()方法添加元素添加为 list 的最后一个元素,也可以将元素添加到指定位置。添加指定位置时,按照索引地址添加,从 0 开始。
采用 addAll()方法可以将另一个集合(实现了 Collection)整体添加进来。也可以添加到指定位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
List l1 = new ArrayList();
l1.add("1");
l1.add(1,"2");
l1.add("3");
l1.add("4");
List l2 = new ArrayList();
l2.add("5");
l2.add("6");
List l3 = new ArrayList();
l3.add("7");
l3.add("8");
l1.addAll(l2);
l1.addAll(1,l3);

使用 get()方法根据元素的下标获取元素的值。

1
Object o = l1.get(1);

使用 clear()方法可以清楚集合中的元素。

1
l1.clear();

contains()方法和 containsAll()方法用于判断该集合中是否包含指定的元素,或集合。

1
2
boolean contains = l1.contains("1");
boolean b = l1.containsAll(l3);

isEmpty()方法用于判断该集合是否为空。

1
boolean empty = l1.isEmpty();

使用 remove()方法可以移除集合中的元素,可以直接移除也可以根据索引移除。

1
2
l1.remove(3);
l1.remove("7");

使用 set()方法可以为集合中指定位置的元素设置值。

1
l1.set(1,"a");

list 虽然无序,但是可以使用 sort()方法对其排序,需要传入自定义的比较器。会按照比较器规则排序。

1
2
3
4
5
l1.sort(new Comparator() {    @Override
public int compare(Object o1, Object o2) {
return 0;
}
});

3.1.2、源码和原理

ArrayList 原理与源码解析

3.2、LinkedList

3.2.1、与 ArrayList 区别

1、ArrayList 是实现了基于动态数组的数据结构,LinkedList 基于链表的数据结构。
2、对于随机访问 get 和 set,ArrayList 觉得优于 LinkedList,因为 LinkedList 要移动指针。 3.、对于新增和删除操作 add 和 remove,LinedList 比较占优势,因为 ArrayList 要移动数。

3.2.2、增删改等操作

普通基础操作与 ArrayList 基本相同,只是实现原理不同。
LinkedList 与 ArrayList 相比,多了一部分在链表头和尾操作的方法。
增加了增加,获取,移除的方法。

1
2
3
4
5
6
l1.addFirst("1");
l1.addLast("2");
l1.removeFirst();
l1.removeLast();
l1.getFirst();
l1.getLast();

使用 offer(),offerLast(),offerFirst()方法,添加元素,可以获取返回值绝对为 true。

1
2
3
l1.offer("1");
l1.offerFirst("2");
l1.offerLast("3");

使用 peek(),peekLast(),peekFirst()获取元素头节点尾节点的值,不会移除节点。

1
2
3
Object peek = l1.peek();
Object o1 = l1.peekFirst();
Object o = l1.peekLast();

使用 poll(),pollLast(),pollFirst()获取元素头节点尾节点的值,会移除节点。

1
2
3
Object poll = l1.poll();
Object o2 = l1.pollFirst();
Object o3 = l1.pollLast();

3.2.3、源码和原理

LinkedList 原理与源码解析

4、Set 介绍

4.1、HashSet

4.1.1、增删改等操作

使用 add()方法添加元素。

1
2
3
4
HashSet set = new HashSet();set.add("1");
set.add("2");
set.add("3");
set.add("4");

使用 contains()方法判断集合中是否存在该元素。

1
boolean contains = set.contains("1");

使用 remove()方法移除集合中的该元素。

1
boolean remove = set.remove("1");

使用 isEmpty()方法判断集合元素是否为空。

1
boolean empty = set.isEmpty();

使用 size()方法获取集合元素个数。

1
int size = set.size();

使用 clear()方法清空集合中的元素。

1
set.clear();

4.1.2、源码和原理

HashSet 原理与源码分析

4.2、TreeSet

4.2.1、与 HashSet 区别

与 HashSet 相似,TreeSet 底层同样采用 TreeMap 实现。同样具备 HashSet 不具备的排序能力。
底层使用 TreeMap 存放 key 的一列,而基于红黑树实现。

4.2.2、增删改等操作

TreeSet 实现了与 HashSet 相同的 Set 接口,其基础操作相同。
因为其具备排序能力,所以在 TreeSet 存储自定义对象时,自定义对象需要实现 Comparator 接口,重写其中的方法。
需要自定义排序规则。

1
2
3
4
TreeSet t = new TreeSet(new Comparator() {
@Override public int compare(Object o1, Object o2) {
return 0; }
});

4.2.3、源码和原理

TreeSet 原理与源码分析