1
、
Java
集合框架是什么
?
说出集合框架的⼀些优点
?
答:每种编程语⾔中都有集合,最初的
Java
版本包含⼏种集合类:
Vector
、
Stack
、
HashTable
和
Arrays
。随着集合的⼴泛使⽤,Java1.2
提出了囊括所有集合接⼝和实现类、算法的集合框架。
在保证线程安全的情况下使⽤泛型和并发集合类,Java
已经经历了很久。集合框架的部分优点如下:
(1)使⽤核⼼集合类降低开发成本,⽽⾮实现我们⾃⼰的集合类。
(2)使⽤经过严格测试的集合框架类,代码质量会得到提⾼。
(3)通过使⽤
JDK
附带的集合类,可以降低代码维护成本。
(4)复⽤性和可操作性。
2
、集合接⼝的常⻅实现类
1
、
List
接⼝的实现类
List接⼝的实现类最常⽤的有
ArrayList
和
LinkedList
、
Vector
ArrayList类实现了可变的数组,可以根据索引位置对集合进⾏快速的随机访问。
LinkedList类采⽤链表结构保存对象,便于向集合中插⼊和删除对象,但是如果将元素插⼊到集合的尾部,其实ArrayList
原⽐
LinkedList
快。
Vector:也是
List
的⼀个常⻅实现类,但是在该类中的⼤多数⽅法都加了
synchronized
关键字,因此相⽐ ArrayList、
LinkedList
集合在多线程访问时是线程的安全的。
2
、
Set
接⼝的实现类
Set
接⼝的实现类常⽤的有
HashSet
和
TreeSet
、
LinkedHashSet
。它们的元素都不可重复。
HashSet:底层是哈希表,遍历元素和添加顺序、⼤⼩顺序⽆关。
TreeSet:底层是红⿊树,元素按照⼤⼩顺序存储和遍历。
LinkedHashSet:底层是哈希表
+
双链表,遍历元素可以体现添加时顺序。顺序性是体现和
HashSet
不同之 处。
3
、
Map
接⼝的实现类
Map
接⼝的实现类常⽤的有
HashMap
、
LinkedHashMap
和
TreeMap
。它们的
key
都不可重复。这⾥⾯的
key
不 可重复,指的是容器中对于同⼀个
Key
只会存在⼀个。
HashMap:哈希表,底层是数组
+
链表
+
红⿊树。遍历元素和添加顺序、⼤⼩顺序⽆关。
LinkedHashMap:哈希表
+
双链表,遍历元素可以体现添加顺序。
TreeMap:红⿊树,元素按照
key
⼤⼩顺序存储和遍历。
例⼦(
example
):
package se.collect.map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class MapDemo1 {
public static void main(String[] args) {
System.out.println("input 1 : 1 3 : 3 2 : 2 4 : 4 5 :
5");
//HashMap
Map<String, String> hashMap = new HashMap<String, String>();
hashMap.put("1", "1");
hashMap.put("3", "3");
hashMap.put("2", "2");
hashMap.put("4", "4");
hashMap.put("5", "5");
System.out.print("HashMap ");
for (String key : hashMap.keySet()) {
System.out.print(key + " : " + hashMap.get(key) + " ");
}
System.out.println();
//LinkedHashMap
Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();
linkedHashMap.put("1", "1");
linkedHashMap.put("3", "3");
linkedHashMap.put("2", "2");
linkedHashMap.put("4", "4");
linkedHashMap.put("5", "5");
System.out.print("LinkedHashMap ");
for (String key : linkedHashMap.keySet()) {
System.out.print(key + " : " + linkedHashMap.get(key) + " ");
}
System.out.println();
//TreeMap
Map<String, String> treeMap = new TreeMap<String, String>();
treeMap.put("1", "1");
treeMap.put("3", "3");
treeMap.put("2", "2");
treeMap.put("4", "4");
treeMap.put("5", "5");
System.out.print("TreeMap ");
for (String key : treeMap.keySet()) {
System.out.print(key + " : " + treeMap.get(key) + " ");
}
System.out.println();
}
}
3
、
List
和
Map
区别
?
答:在数据结构⽅⾯,
List
存储的是单列数据的集合,⽽
Map
存储的是
key
、
value
类型的数据集合。在数据 存储⽅⾯,List
存储的数据是有序且可以重复的,⽽
Map
中存储的数据是⽆序(不同的⼦类也可以保证有序)且 key值不会重复
(value
值可以重复
)。
4
、
List
、
Map
、
Set
三个接⼝,存取元素时,各有什么特点
?
List与
Set
具有相似性,它们都是单列元素的集合,所以,它们有⼀个共同的⽗接⼝,叫
Collection
。
Set⾥⾯不允许有重复(即相等)的元素。
Set
取元素时,没法说取第⼏个,只能通过
for
循环或者迭代器逐 ⼀遍历各个元素。
List表示有先后顺序的集合, 注意,不是那种按年龄、按⼤⼩、按价格之类的排序。当我们多次调⽤ add(Object e)⽅法时,每次加⼊的对象就像⽕⻋站买票有排队顺序⼀样,按先来后到的顺序排序。有时候,也 可以插队,即调⽤add(int index,Object e)
⽅法,就可以指定当前对象在集合中的存放位置。⼀个对象可以被反 复存储进List
中,每调⽤⼀次
add
⽅法,这个对象就被插⼊进集合中⼀次,其实,并不是把这个对象本身存储进 了集合中,⽽是在集合中⽤⼀个索引变量指向这个对象,当这个对象被add
多次时,即相当于集合中有多个索 引指向了这个对象。List
除了通过迭代器逐⼀遍历各个元素,还可以调⽤
get(index i)
来明确说明取第⼏个。
Map与
List
和
Set
不同,它是双列的集合,⽤
put
⽅法存储⼀对
key/value
,不能存储重复的
key
。取则可以根 据key
获得相应的
value
,即
get(Object key)
返回值为
key
所对应的
value
。另外,也可以获得所有的
key
的集合 (map.keySet()),还可以获得所有的
value
的结合
(map.values())
,还可以获得
key
和
value
组合成的
Map.Entry
对象的 集合(map.entrySet())
。
5
、为什么
Map
接⼝不继承
Collection
接⼝
?
⾸先
Map
提供的是键值对映射(即
Key
和
value
的映射),⽽
collection
提供的是⼀组数据(并不是键值对映射)。
其次如果
map
继承了
collection
接⼝,那么所有实现了
map
接⼝的类到底是⽤
map
的键值对映射数据还是⽤ collection的⼀组数据呢(就我们平常所⽤的
hashMap
、
hashTable
、
treeMap
等都是键值对,所以它继承 collection完全没意义),⽽且
map
如果继承了
collection
接⼝的话还违反了⾯向对象的
接⼝分离原则。