Java集合是什么?
-
它是一个数据结构,用来存储和操作对象的
-
在早期的java版本中,虽然已经有了Dictonary,Vector,Stack和Properties这些类可以存储和操作对象,但是它们缺少统一的抽象,所以使用Vector的方式和使用Properties的方式有很大的不同,增加了开发的难度。
-
集合框架需要满足的几个目标
- 必须是高性能的,基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
- 允许不同类型的集合,以类似的方式工作,具有高度的互操作性(有高层的抽象(接口))
- 对一个集合的扩展和适应必须是简单的(数据结构的实现必须简单易于理解,有标准的实现)
两种容器类型
-
Collection
Collection是一个基本的集合接口,它可以容纳一组集合元素,它有三个子类型的接口:- List
有序、可重复
实现类- ArrayList
优点:底层数据结构是数组,查询快,增删慢,因为线程不安全,所以效率高
缺点:线程不安全 - Vector
优点:底层数据结构也是数组,查询快,增删慢,线程安全
缺点:线程安全,效率低 - LinkedList
优点:底层数据结构是链表,查询慢,增删快,因为线程不安全,所以效率高
缺点:线程不安全
- ArrayList
- Set
无序,唯一(不能重复)
实现类:- HashSet
底层数据结构是哈希表
通过hashCode()和equals()方法来保证元素唯一性。如果存储自定义对象,需重写hashCode()和equals() - LinkedHashSet
底层数据结构是链表和哈希表(FIFO插入有序,唯一)
由链表保证元素有序
哈希表保证元素唯一 - TreeSet
底层数据结构是红黑树(唯一、有序)
元素排序:自然排序,自定义比较器排序
根据比较的返回值是否是0来决定
- HashSet
- Queue
- List
-
Map
Map接口有三个比较重要的实现类- HashMap
线程不安全,效率较高
键值都可以为null
- HashMap
public static void testHashMap(){
HashMap<String,Object> map = new HashMap<>();
map.put(null,null);
map.forEach((k,v)-> System.out.println(k+"="+v));
}
结果:
null=null
无序的
public static void testHashMap(){
HashMap<String,Object> map = new HashMap<>();
map.put("one","one");
map.put("two","two");
map.put("three","three");
map.put("four","four");
map.put("five","five");
map.forEach((k,v)-> System.out.println(k+"="+v));
}
运行结果:
four=four
one=one
two=two
three=three
five=five
父类:AbstractMap
- TreeMap
有序的
键不可以为null,报空指针异常,值可以为null
public static void testTreeMap(){
TreeMap<String,Object> treeMap =new TreeMap<>();
treeMap.put(null,null);
treeMap.forEach((k,v)-> System.out.println(k+"="+v));
}
运行结果:
Exception in thread "main" java.lang.NullPointerException
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at com.pannk.demo.map.TreeMapTest.testTreeMap(TreeMapTest.java:16)
at com.pannk.demo.map.TreeMapTest.main(TreeMapTest.java:11)
public static void testTreeMap(){
TreeMap<String,Object> treeMap =new TreeMap<>();
treeMap.put("hello",null);
treeMap.forEach((k,v)-> System.out.println(k+"="+v));
}
运行结果:
hello=null
- HashTable