List、Set和Map接口

List接口:

  List接口继承自Collection接口,是有序集合,可以允许重复的对象。

  List接口的常见实现类:ArrayList,Vector,LinkedList

  ArrayList:底层实现是数组,线程不安全,效率高。查询快,插入、删除慢

  Vector:线程安全,效率低

  LinkedList:底层实现是链表,线程不安全,效率高。查询慢,插入、删除快

简单实现一下ArrayList类里的方法:

 1 public class MyArrayList {
 2 
 3     Object[] elementData;
 4     private int size;  
 5 
 6     public MyArrayList() {
 7         this(10); // 默认10个长度
 8     }
 9 
10     public MyArrayList(int initialCapacity) { // 初始化容器大小
11         if (initialCapacity > 0) {
12             this.elementData = new Object[initialCapacity];
13       }
14     }      
15 
16     public int size() {
17       return size;
18     }
19 
20     public boolean isEmpty() { // 判断容器是否为空
21       if(elementData.length==0) {
22             return true;
23       }else {
24           return false;
25       }
26     }
27 
28     public void capacity() { // 数组扩容
29         if(size==elementData.length) {
30             Object[] new_elementData = new Object[size*2]; // 溢出后新建一个数组
31             // 把老数组的元素copy到新数组中
32             System.arraycopy(elementData, 0, new_elementData, 0, elementData.length);
33             // 使用新数组
34             elementData = new_elementData;
35         }
36     }
37 
38     public void rangeCheck(int index) { // 判断索引是否在数组范围内(不在我就直接停掉了..)
39         if(index<0 || index>=size) {
40             System.out.println(index+"号元素不存在!");
41             System.exit(0);
42         }
43     }
44 
45     public void add(Object obj) { // 添加对象
46         capacity();
47         elementData[size] = obj;
48         size++;
49     }
50 
51     public Object get(int index) { // 根据索引查找对象
52         rangeCheck(index);
53         return elementData[index];
54     }
55 
56     public void remove(int index) { // 根据索引移除对象
57         rangeCheck(index);
58         int moveNum = size - index - 1;
59         if(moveNum>=0) {
60             // 其实还是数组copy,把要移除的后半段复制到移除的位置
61             System.arraycopy(elementData, index+1, elementData, index, moveNum);
62             // 数组最后一个元素赋值为Null
63             elementData[--size] = null;
64         }
65     }
66 
67     public void remove(Object obj) { // 移除指定对象
68         for(int i=0;i<=size;i++) {
69             if(get(i).equals(obj)) {
70                 remove(i);
71                 return; // 只移除第一个匹配的对象
72             }
73         }
74     }
75 
76     public void set(int index,Object obj) { // 根据索引修改对象
77         rangeCheck(index);
78         elementData[index] = obj;
79     }
80 
81     public void insert(int index,Object obj) { // 根据索引插入对象
82       rangeCheck(index);
83       capacity(); // 改变数组大小就判断是否需要扩容
84       System.arraycopy(elementData, index, elementData, index+1, size-index);
85       elementData[index] = obj;
86       size++;
87     }
88 
89 }

LinkedList类是双向链表,链表中的每个节点都包含了对前一个和后一个元素的引用:

原理和底层实现参考:https://www.cnblogs.com/LiaHon/p/11107245.html

====================================================================

Set接口:

  Set接口是Collection接口的子接口,其特性是容器类中的元素是没有顺序的

  元素不可以重复,只允许一个null元素(使用equals()方法进行比较)

  Set 接口常见的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet

  HashSet:传入元素时,调用HashCode方法获取hash值,然后决定存储位置

  LinkedHashSet:HashSet的子类,使用HashCode确定在集合中的位置,使用链表的方式确定位置(有序,按照输入的顺序输出)

  TreeSet:既实现Set接口,同时也实现了SortedSet接口,具有排序功能,存入TreeSet中的对象元素需要实现Comparable接口

Set接口常用方法:

  1.add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false

  2.size() :返回Set集合中的元素个数

  3.remove(Object  obj) : 删除Set集合中的元素,删除成功返回true,否则返回false。

  4.isEmpty() :如果Set不包含元素,则返回 true ,否则返回false

  5.clear() : 移除此Set中的所有元素

  6.contains(Object o):如果Set包含指定的元素,则返回 true,否则返回false

原理和底层实现参考:https://blog.csdn.net/tsyj810883979/article/details/6892575

====================================================================

Map接口:

  Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value

  Map 中的 key 和value 都可以是任何引用类型的数据

  Map 中的 key 用Set来存放,不允许重复

  key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value

  Map接口的常用实现类:HashMap、LinkedHashMap 、Hashtable和TreeMap

  HashMap:

    HashMap 是 Map 接口使用频率最高的实现类

    HashMap 是基于哈希表的 Map 接口的非同步实现

    HashMap 线程不安全,底层是数组+链表+红黑树实现的

    数组里放链表,链表里放键值对。通过查找数组来循环链表提高效率

    允许使用 null 值和 null 键,与HashSet一样,不保证映射的顺序,特别是它不保证该顺序恒久不变

    HashMap 判断两个 key 相等的标准是两个 key 通过 equals() 方法返回 true

  LinkedHashMap:

    LinkedHashMap 是 HashMap 的子类

    类似LinkedHashSet,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致

  TreeMap:

    TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序

    TreeMap 可以保证所有的 Key-Value 对处于有序状态

  Hashtable:

    Hashtable是个古老的 Map 实现类,线程安全

    与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value

    与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序

原理和底层实现参考:https://blog.csdn.net/jiguquan3839/article/details/84546835

猜你喜欢

转载自www.cnblogs.com/zhou-xian-sheng/p/12521374.html