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