1.集合的概念

什么是集合

  • 概念: 对象的容器,定义了对多个对象进行操作的常用方法,可以实现数组的常见操作。

    和数组的区别

    • 数组长度固定,集合长度不固定
    • 数组可以存储基本类型和引用类型,集合只能存储引用类型
    • 基本类型(8大),引用类型(除了8大类型以外)
  • java.util.*下面

    2.Collection接口

    image.png
  • Collection,List,Set都是接口需要下面的实现类进行实现之后才可调用。
  • Collection 父接口:
    • 特点:代表一组任意类型的对象,无序,无下标,不能重复
      • image.png ```java /*
        • @Descripttion: 针对集合框架进行复习
        • @version:
        • @Author: Addicated
        • @Date: 2020-11-03 21:46:41
        • @LastEditors: Addicated
        • @LastEditTime: 2020-11-03 22:10:00 */ package review.Day07;

import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;

public class CollectionTest {

  1. public static void main(String[] args) {
  2. // 创建集合
  3. // 父类引用指向子类对象 arrayList--AbstractList--AbstractCollection--Collection
  4. Collection collection = new ArrayList();
  5. // 添加元素
  6. collection.add("addicated");
  7. collection.add("xtzg123");
  8. collection.add("zhuoyi");
  9. collection.add("sb");
  10. System.out.println(collection.size());
  11. System.out.println(collection);
  12. // 删除元素
  13. collection.remove("addicated");
  14. System.out.println(collection);
  15. // 遍历元素 重点
  16. // 1,使用增强for循环进行遍历
  17. for (Object object : collection) {
  18. System.out.println(object);
  19. }
  20. // 2,使用迭代器进行遍历 专门用来遍历集合的一种方式
  21. Iterator it = collection.iterator();
  22. // hasNext() 有没有下一个元素
  23. // next() 获取下一个元素
  24. // remove() 删除一个元素
  25. while (it.hasNext()) {
  26. System.out.println(it.next());
  27. // collection 在遍历的时候是不允许修改元素的
  28. it.remove(); // 使用迭代器的删除方法可以执行
  29. }
  30. // 判断
  31. collection.contains(o); // 包含
  32. }

} ————-对象类型操作 /*

  • @Descripttion: 针对集合框架进行复习
  • @version:
  • @Author: Addicated
  • @Date: 2020-11-03 21:46:41
  • @LastEditors: Addicated
  • @LastEditTime: 2020-11-03 22:23:15 */ package review.Day07;

import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;

public class CollectionTest {

  1. public static void main(String[] args) {
  2. Collection collection = new ArrayList<>();
  3. // 添加学生数据
  4. Student s1 =new Student("阿迪",12);
  5. Student s2 =new Student("阿迪",12);
  6. Student s3 =new Student("阿迪",12);
  7. Student s4 =new Student("阿迪",12);
  8. // 1 添加元素到collection
  9. collection.add(s1);
  10. collection.add(s2);
  11. collection.add(s3);
  12. collection.add(s4);
  13. System.out.println(collection);
  14. // TODO 2 删除 ,使用remove方法
  15. collection.remove(s1);
  16. // 遍历,
  17. // 增强for,或者 迭代器 iterator()
  18. }

}

class Student{ int age; String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return “Student [age=” + age + “, name=” + name + “]”; } public Student( String name,int age) { this.age = age; this.name = name; }

}

  1. <a name="3gisO"></a>
  2. # 3.List接口与实现类
  3. <a name="i171B"></a>
  4. ## List子接口
  5. - 特点:有序,有下标(可用for循环),元素可以重复
  6. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1608527/1604444296848-db90428f-07d9-4bf8-ba69-fc9e47694d93.png#align=left&display=inline&height=328&margin=%5Bobject%20Object%5D&name=image.png&originHeight=328&originWidth=1048&size=104418&status=done&style=none&width=1048)
  7. ```java
  8. /*
  9. * @Descripttion:
  10. * @version:
  11. * @Author: Addicated
  12. * @Date: 2020-11-04 08:24:34
  13. * @LastEditors: Addicated
  14. * @LastEditTime: 2020-11-04 08:38:55
  15. */
  16. package review.Day07;
  17. import java.util.ArrayList;
  18. import java.util.Iterator;
  19. import java.util.List;
  20. import java.util.ListIterator;
  21. // List子接口的使用
  22. // 有序有下标,元素可重复
  23. public class ListTest {
  24. // 创建
  25. public static void main(String[] args) {
  26. List list = new ArrayList<>();
  27. // 添加元素
  28. list.add("huawei");
  29. list.add(1);
  30. list.add("ali");
  31. list.add("niubi");
  32. System.out.println("元素个数" + list.size());
  33. System.out.println(list.toString());
  34. // 元素删除
  35. list.remove(1);
  36. System.out.println(list.toString());
  37. // 遍历 传统for循环可遍历
  38. for (int i = 0; i < list.size(); i++) {
  39. System.out.println(list.get(i));
  40. }
  41. // 增强for循环可遍历
  42. for (Object object : list) {
  43. System.out.println(object);
  44. }
  45. // 迭代器 同样可以
  46. Iterator it = list.iterator();
  47. while (it.hasNext()) {
  48. System.out.println(it.next());
  49. }
  50. // 使用列表迭代器
  51. // listIterator 可以向前或者向后遍历,添加删除元素
  52. ListIterator listIterator = list.listIterator();
  53. while (listIterator.hasNext()) {
  54. System.out.println(listIterator.nextIndex());
  55. System.out.println(listIterator.next());
  56. }
  57. // 从后向前进行遍历
  58. while (listIterator.hasPrevious()) {
  59. System.out.println(listIterator.previousIndex() + "+" + listIterator.previous());
  60. }
  61. // 判断
  62. list.contains("o");
  63. list.isEmpty();
  64. // 获取位置下标
  65. list.indexOf("huawei");
  66. }
  67. }
  68. // 往list添加数据的时候实际上是完成了一个自动装箱的操作
  69. // 删除元素
  70. List lsit = new ArrayList<>();
  71. list.add(20);
  72. list.remove(new Integer(20));// 转换为装箱之后的integer类型可以删除 可以使用new Integer的方式删除
  73. // 是因为整数缓冲 todo+1 后续调查 https://blog.csdn.net/w372426096/article/details/80660851
  74. list.remove((object)20); // 强制转换为obj类型
  75. // 补充方法subList 含头不含尾 返回为一个list
  76. list.subList(1,3);

ArrayList(重点)

  • 底层是数组结构实现,查询快,增删慢
  • JDK1.2版本加入,运行效率快,线程不安全
  • 原码分析

    • DEFAULT_CAPACITY=10 默认容量为10 注意:如果没有向集合中添加任何元素时,容量为0,添加一个元素则通过原码中的一系列操作变为10
    • 10之后每次扩容大小是1.5倍

      1. /**
      2. * Constructs an empty list with an initial capacity of ten.
      3. 这里是ArrayList的无参构造方法
      4. */
      5. public ArrayList() {
      6. this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
      7. }
    • elementData 用来存放元素的数组

    • SIZE 实际的元素个数
    • add的原码分析 ```java /**

      • Appends the specified element to the end of this list. *
      • @param e element to be appended to this list
      • @return true (as specified by {@link Collection#add}) */ public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } // 首先判断数组中数据是否为空,为空,返回 默认容量与最小容量中的max值 // 不为空则返回最小值 private static int calculateCapacity(Object[] elementData, int minCapacity) { // 恒成立, if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // 取default_capcity=10 而minCapacity=1 return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; } // 调用上面的方法对数组内部数据量进行判断 private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); // minCapacity=1传入 } // minCapacity =10 private void ensureExplicitCapacity(int minCapacity) { modCount++;

      // overflow-conscious code if (minCapacity - elementData.length > 0)

      1. grow(minCapacity);

      } // add代码扩容数组容量的核心 /**

      • Increases the capacity to ensure that it can hold at least the
      • number of elements specified by the minimum capacity argument. *
      • @param minCapacity the desired minimum capacity */ private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }

    private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow

    1. throw new OutOfMemoryError();

    return (minCapacity > MAX_ARRAY_SIZE) ?

    1. Integer.MAX_VALUE :
    2. MAX_ARRAY_SIZE;

    } ```

    Vector

  • 数组结构实现,查询快,增删慢

  • JDK 1.0 运行效率慢,线程安全
  • 遍历方法有些不同
    • image.png
  • 其他方法如 firstElement,lastElement,elementAt()

    LinkedList:(重点)

  • 链表结构实现,增删快,查询慢

    ArrayList 与LinkedList之间的区别

  • 不同结构实现方式

  • image.png
  • ArrayList,必须开辟连续空间,查询快,增删慢
  • LinkedList,无序开辟连续空间,查询慢,增删快。

    4.泛型和工具类

  • Java 泛型是JDK1.5 中引入的一个新特性,其本质是参数化类型,将类型作为参数传递
  • 常见形式有 泛型类,泛型接口,泛型方法
  • 语法
    • T 称为类型占位符,表示一种引用类型
  • 好处

    • 提高代码复用率
    • 防止类型转换异常,提高代码安全性

      泛型集合

  • 概念:参数化类型,类型安全的集合,强制集合元素的类型必须一致。

  • 特点:
    • 编译时即可检查,而非运行时抛出异常
    • 访问时,不必类型转换(拆箱)
    • 不同泛型之间引用不能相互赋值,不存在多态

5.Set接口与实现类

  • 特点:无序,无下标,元素不可重复
  • 方法:全部继承自collection中的方法
  • Set的实现类
    • HashSet (重点)
      • 基于hashCode实现元素不重复
      • 当存入元素的哈希吗相同时,会调用equals进行确认,如结果为true,则拒绝后者存入 ```java /*
        • @Descripttion: 泛型集合
        • @version:
        • @Author: Addicated
        • @Date: 2020-11-04 12:35:03
        • @LastEditors: Addicated
        • @LastEditTime: 2020-11-04 15:56:55 */ package review.Day08;

import java.util.HashSet; import java.util.Set;

public class Demo1 { public static void main(String[] args) { // 创建集合 特点,无序,没有下标,不能重复 Set set = new HashSet<>(); // 1,添加 set.add(“huawei”); set.add(“adi”); set.add(“bb”); set.add(“gg”); System.out.println(set.size()); System.out.println(set.toString()); // 删除数据 set.remove(“huawei”);

  1. // 遍历
  2. // 增强for 因为没有下标所以不能使用普通for循环
  3. // 迭代器进行迭代
  4. // 判断
  5. // contains()
  6. // isEmpty()
  7. }

}

  1. /*
  • @Descripttion:
  • @version:
  • @Author: Addicated
  • @Date: 2020-11-04 16:10:05
  • @LastEditors: Addicated
  • @LastEditTime: 2020-11-04 16:17:28 */ package review.Day08;

import java.util.HashSet;

// hashSet的使用 // 存储结构为 hash表 (数组+链表+红黑树) public class Demo2 { public static void main(String[] args) { // 新建集合 HashSet hashSet = new HashSet<>();

  1. hashSet.add("add");
  2. hashSet.add("22");
  3. hashSet.add("3");
  4. hashSet.add("4");
  5. System.out.println(hashSet.size());
  6. System.out.println(hashSet.toString());
  7. // 删除数据
  8. hashSet.remove("add");
  9. // 遍历
  10. // 增强for
  11. // 迭代器
  12. // 判断
  13. // contains,isEmpty
  14. }

}

  1. - 存储过程
  2. - 存储结构 哈希表(数组 + 链表 + 红黑树)
  3. - 1,根据hashCode 计算保存的位置。如果此位置为空,则直接保存,如果不为空,则执行第二部
  4. - 2,再执行euqals方法,如果equals方法为true,则认为是重复,否则,形成链表
  5. - TreeSet---红黑树,二叉查找树
  6. - 基于排列顺序实现,元素不重复
  7. - 实现了SortedSet接口,对集合元素自动排序
  8. - 元素对象的类型必须实现Comparable接口,指定排序规则。
  9. - 通过CompareTo 方法确定是否为重复元素
  10. ```java
  11. /*
  12. * @Descripttion:
  13. * @version:
  14. * @Author: Addicated
  15. * @Date: 2020-11-04 18:01:31
  16. * @LastEditors: Addicated
  17. * @LastEditTime: 2020-11-04 18:04:17
  18. */
  19. package review.Day08;
  20. import java.util.TreeSet;
  21. // 存储结构:红黑树
  22. public class Demo4 {
  23. public static void main(String[] args) {
  24. // 创建集合
  25. TreeSet<String> treeSet = new TreeSet<>();
  26. // 添加元素
  27. treeSet.add("addicated");
  28. treeSet.add("addicated2");
  29. treeSet.add("addicated3");
  30. treeSet.add("addicated");
  31. treeSet.add("addicated");
  32. System.out.println(treeSet.size());
  33. System.out.println(treeSet.toString());
  34. // 删除
  35. treeSet.remove("addicated");
  36. // 使用增强for
  37. // 使用迭代器
  38. // 判断
  39. // contains,isEmpty
  40. }
  41. }
  42. -------复杂类型添加
  43. /*
  44. * @Descripttion:
  45. * @version:
  46. * @Author: Addicated
  47. * @Date: 2020-11-04 18:01:31
  48. * @LastEditors: Addicated
  49. * @LastEditTime: 2020-11-04 21:49:17
  50. */
  51. package review.Day08;
  52. import java.util.TreeSet;
  53. // 存储结构:红黑树
  54. // 元素必须要实现Comparable 接口不然的话TreeSet内部无法对其进行比较,进而无法遍历
  55. // compareTo()方法返回值为0,认为是重复元素
  56. public class Demo4 {
  57. public static void main(String[] args) {
  58. // 创建集合
  59. TreeSet<Person> treeSet = new TreeSet<>();
  60. // 添加元素
  61. Person p1 = new Person(11, "adu");
  62. Person p2 = new Person(12, "adu1");
  63. Person p3 = new Person(13, "adu2");
  64. Person p4 = new Person(12, "adu5");
  65. treeSet.add(p1);
  66. treeSet.add(p2);
  67. treeSet.add(p3);
  68. treeSet.add(p4);
  69. System.out.println(treeSet.size());
  70. System.out.println(treeSet.toString());
  71. // 删除 remove
  72. // 遍历
  73. // 增强for循环
  74. // 迭代器
  75. // 判断
  76. // contains
  77. // isEmpty
  78. }
  79. }
  80. class Person implements Comparable<Person> {
  81. int age;
  82. String name;
  83. @Override
  84. public int compareTo(Person o) {
  85. // 实现比较的规则
  86. // 先姓名比,后年龄比
  87. int n1 = this.getName().compareTo(o.getName());
  88. int n2 = this.age-o.getAge();
  89. return n1==0?n2:n1;
  90. }
  91. @Override
  92. public String toString() {
  93. return "Person [age=" + age + ", name=" + name + "]";
  94. }
  95. public Person(int age, String name) {
  96. this.age = age;
  97. this.name = name;
  98. }
  99. public int getAge() {
  100. return age;
  101. }
  102. public void setAge(int age) {
  103. this.age = age;
  104. }
  105. public String getName() {
  106. return name;
  107. }
  108. public void setName(String name) {
  109. this.name = name;
  110. }
  111. }
  112. 通过实现compartor接口,实现compare方法的方式来进行比较规则设定
  113. // TreeSet集合的使用
  114. // Comparator 实现定制比较(比较器)
  115. // comparable 可比较的,涉及到的实体类需要对其进行实现之后才可以进行正常的
  116. // TreeSet遍历
  117. public class Demo5 {
  118. public static void main(String[] args) {
  119. // 创建集合的时候调用接口并实现,指定比较规则
  120. TreeSet<Person> persons=new TreeSet<>(new Comparator<Person>(){
  121. @Override
  122. public int compare(Person o1, Person o2) {
  123. int n1=o1.getAge()-o2.getAge();
  124. int n2=o1.getName().compareTo(o2.getName());
  125. return n1==0?n2:n1;
  126. }
  127. });
  128. }
  129. }

6.Map接口与实现类

image.png

  • Map父接口
    • 特点:kv键值对进行存储,无序,无下标,键不可重复,值可以重复
  • 方法
    • V put(k,v) // 对象存入至集合中,关联键值key重复则覆盖原值
    • Object get(object key) // 根据键获取对应的值
    • Set // 返回所有的key
    • Collection values() // 返回包含所有值的collection集合
    • Set> // 键值匹配的Set集合

image.png

  • keySet返回的是key的集合,entrySet()返回的是映射对儿,映射对儿本质还是map类型, ```java /*
    • @Descripttion: 针对Map接口开始学习
    • @version:
    • @Author: Addicated
    • @Date: 2020-11-07 11:11:48
    • @LastEditors: Addicated
    • @LastEditTime: 2020-11-07 13:06:33 */ package review.Day08;

import java.util.HashMap; import java.util.Map; import java.util.Set;

// 存储键值对,键不可重复,值可重复,无序 public class Demo6 { public static void main(String[] args) { // 1 创建map集合 Map map = new HashMap<>();

  1. // 2 添加元素
  2. map.put("cn", "china");
  3. // 键唯一,值可不唯一,后面在进行更新的时候会把第一次设定的值给覆盖掉
  4. map.put("cn", "china1");
  5. map.put("jp", "japan");
  6. map.put("us", "america ");
  7. System.out.println(map.size());
  8. System.out.println(map.toString());
  9. //3 删除元素内容
  10. map.remove("cn");
  11. System.out.println(map.toString());
  12. //4 map集合的遍历
  13. // 使用keySet() 进行遍历 拿到的事所有的键 方法返回的是key的Set集合
  14. // 通过这个原理来通过key去取对应的值
  15. Set<String> keySet = map.keySet();
  16. for (String string : keySet) {
  17. // for (String string : map.keySet()) {
  18. System.out.println(string + "-------- " + map.get(string));
  19. }
  20. // 使用entrySet()方法来进行遍历,返回的是
  21. Set<Map.Entry<String, String>> entries = map.entrySet();
  22. // for (Map.Entry<String,String> entry : entries) {
  23. // 可以直接替换成下面的写法
  24. for (Map.Entry<String,String> entry : map.entrySet()) {
  25. System.out.println(entry.getKey()+"---------"+entry.getValue());
  26. }
  27. // 4判断 contains
  28. map.containsKey("cn");
  29. map.containsValue("cn");
  30. }

}

  1. <a name="sRkzi"></a>
  2. ## HashMap原码分析
  3. <a name="imR4Q"></a>
  4. ### hashmap源码中的属性定义
  5. ```java
  6. /**
  7. * The default initial capacity - MUST be a power of two.
  8. */
  9. // 1<< 4,1左移4位,2的4次方
  10. // 位移的运算效率高,是为了运行效率考虑
  11. // DEFAULT_INITAL_CAPACITY 默认容器初始大小为16
  12. static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
  13. /**
  14. * The maximum capacity, used if a higher value is implicitly specified
  15. * by either of the constructors with arguments.
  16. * MUST be a power of two <= 1<<30.
  17. */
  18. // 容器的最大大小 2的30次方
  19. static final int MAXIMUM_CAPACITY = 1 << 30;
  20. /**
  21. * The load factor used when none specified in constructor.
  22. */
  23. // 大于 75%的时候要对容易容量进行扩容
  24. // 假如当前容量为100 ,当添加元素到75个以上的时候就会对其进行扩容
  25. static final float DEFAULT_LOAD_FACTOR = 0.75f;
  26. /**
  27. * The bin count threshold for using a tree rather than list for a
  28. * bin. Bins are converted to trees when adding an element to a
  29. * bin with at least this many nodes. The value must be greater
  30. * than 2 and should be at least 8 to mesh with assumptions in
  31. * tree removal about conversion back to plain bins upon
  32. * shrinkage.
  33. */
  34. // jdk1.8之后新增
  35. // 当链表长度大于8时,调整为红黑树
  36. static final int TREEIFY_THRESHOLD = 8;
  37. /**
  38. * The bin count threshold for untreeifying a (split) bin during a
  39. * resize operation. Should be less than TREEIFY_THRESHOLD, and at
  40. * most 6 to mesh with shrinkage detection under removal.
  41. */
  42. // 链表长度小于6时,调整成链表
  43. static final int UNTREEIFY_THRESHOLD = 6;
  44. /**
  45. * The smallest table capacity for which bins may be treeified.
  46. * (Otherwise the table is resized if too many nodes in a bin.)
  47. * Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
  48. * between resizing and treeification thresholds.
  49. */
  50. // 当链表长度大于8时,并且集合元素个数大于等于64时,调整成红黑树
  51. static final int MIN_TREEIFY_CAPACITY = 64;、
  52. /**
  53. * The table, initialized on first use, and resized as
  54. * necessary. When allocated, length is always a power of two.
  55. * (We also tolerate length zero in some operations to allow
  56. * bootstrapping mechanics that are currently not needed.)
  57. */
  58. // 哈希表中的数组
  59. transient Node<K,V>[] table;
  60. // 元素个数
  61. size;

hashmap源码中的方法定义

  1. /**
  2. * Constructs an empty <tt>HashMap</tt> with the specified initial
  3. * capacity and the default load factor (0.75).
  4. *
  5. * @param initialCapacity the initial capacity.
  6. * @throws IllegalArgumentException if the initial capacity is negative.
  7. */
  8. public HashMap(int initialCapacity) {
  9. this(initialCapacity, DEFAULT_LOAD_FACTOR);
  10. }// 无参构造方法,初始化容器大小以及加载因子
  11. // 刚创建map的时候table是null,size是0,添加元素之后才是上面的16
  12. ***put方法
  13. public V put(K key, V value) {
  14. return putVal(hash(key), key, value, false, true);
  15. }
  16. */
  17. static final int hash(Object key) {
  18. int h;
  19. return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
  20. }
  21. /**
  22. * Implements Map.put and related methods
  23. *
  24. * @param hash hash for key
  25. * @param key the key
  26. * @param value the value to put
  27. * @param onlyIfAbsent if true, don't change existing value
  28. * @param evict if false, the table is in creation mode.
  29. * @return previous value, or null if none
  30. */
  31. final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
  32. boolean evict) {
  33. // 初始化声明变量,但不赋值
  34. Node<K,V>[] tab; Node<K,V> p; int n, i;
  35. if ((tab = table) == null || (n = tab.length) == 0)
  36. n = (tab = resize()).length;
  37. if ((p = tab[i = (n - 1) & hash]) == null)
  38. tab[i] = newNode(hash, key, value, null);
  39. else {
  40. Node<K,V> e; K k;
  41. if (p.hash == hash &&
  42. ((k = p.key) == key || (key != null && key.equals(k))))
  43. e = p;
  44. else if (p instanceof TreeNode)
  45. e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
  46. else {
  47. for (int binCount = 0; ; ++binCount) {
  48. if ((e = p.next) == null) {
  49. p.next = newNode(hash, key, value, null);
  50. if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
  51. treeifyBin(tab, hash);
  52. break;
  53. }
  54. if (e.hash == hash &&
  55. ((k = e.key) == key || (key != null && key.equals(k))))
  56. break;
  57. p = e;
  58. }
  59. }
  60. if (e != null) { // existing mapping for key
  61. V oldValue = e.value;
  62. if (!onlyIfAbsent || oldValue == null)
  63. e.value = value;
  64. afterNodeAccess(e);
  65. return oldValue;
  66. }
  67. }
  68. ++modCount;
  69. if (++size > threshold)
  70. resize();
  71. afterNodeInsertion(evict);
  72. return null;
  73. }
  • 总结
    • hashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16
    • 当元素个数大于阈值 (16*0.75)时会进行扩容,扩容后大小为原来二倍,目的是减少调整元素的个数
    • JDK1.8 当每个链表长度大于8,并且元素个数大于64时,会调整为红黑树,目的提高执行效率
    • JDK1.8 当链表长度小于6时,调整成链表
    • JDK1.8 以前,链表是头插入,1.8以后是尾插入
  • HashSet实际上的底层就是HashMap

    HashTable

  • HashMap JDK 1.2版本,线程不安全,运行效率快,允许用null 作为key或者是value

  • HashTable JDK1.0版本,线程安全,运行效率慢,不允许null作为key或者
  • Properties 作为HashTable 的子类,要求 key 和 value 都是String ,通常用于配置文件的读取
  • TreeMap

    • 实现了 SortedMap接口(是Map的子接口,)可以对key进行自动排序

      7.Collections工具类 相较于 Arrays来进行对比记忆

  • 概念:结合工具类,定义除了存取以外的集合常用方法

  • 方法
    • public static void reverse(list<?> list) // 反转集合中元素的顺序
    • public static void shuffle(list<?> list) // 随机重置集合元素的顺序
    • public static void sort(List list) //升序排序(元素类型必须实现Comparable接口) ```java /*
      • @Descripttion:
      • @version:
      • @Author: Addicated
      • @Date: 2020-11-07 15:03:52
      • @LastEditors: Addicated
      • @LastEditTime: 2020-11-07 15:43:12 */ package review.Day08;

import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;

public class Demo9 { public static void main(String[] args) { List list = new ArrayList<>(); list.add(12); list.add(13); list.add(38); list.add(15); list.add(22); list.add(17); // sort 排序 会直接改变原数组 System.out.println(“排序之前” + list.toString()); Collections.sort(list); System.out.println(“排序之后” + list.toString());

  1. // binarySearch 找到返回属元素的下标
  2. int i = Collections.binarySearch(list, 38);
  3. int i1 = Collections.binarySearch(list, 1503);
  4. System.out.println(i);
  5. // 查询不到返回的会是负数,而固定负数是几
  6. System.out.println(i1);
  7. // copy复制 但是目标需要与原数组的元素个数一致,否则会报错
  8. List<Integer> des = new ArrayList<>();
  9. for (int j = 0; j < 6; j++) {
  10. des.add(0);
  11. }
  12. Collections.copy(des, list);
  13. System.out.println(des.toString());
  14. // reverse 反转,交换位置
  15. Collections.reverse(list);
  16. System.out.println("反转" + list);
  17. // shuffle 打乱
  18. Collections.shuffle(list);
  19. System.out.println("打乱" + list);
  20. // 补充 list 转成数组
  21. Integer[] arr = list.toArray(new Integer[10]);
  22. System.out.println(arr.length);
  23. System.out.println(arr.toString());
  24. // 数组转成集合
  25. // 这样转换的事个受限制的集合
  26. String[] names = { "adi", "hantek", "addicated", "h" };
  27. List<String> list2 = Arrays.asList(names);
  28. System.out.println(list2);
  29. }

}

```

集合总结

集合的概念

  • 对象的容易,和数组类似,定义了对多个对象进行操作的常用方法

    List集合

  • 有序,有下标,元素可重复

    • ArrayList(数组),LinkedList(双向链表),Vector

      Set集合

  • 无序,无下标,元素不可重复

    • HashSet(哈希表,根据hashcode查找位置,如果位置没有元素就放入,如果有就执行equeals如果为True判断为重复的,false就新行程一个链表),TreeSet(存储结构是红黑树,会对数据进行排序,要求元素要实现compareable,)

      Map集合

  • 存储一堆数据,无序,武侠表,键不可重复,值可重复

    • HashMap,HashTable,TreeMap

      Collections

  • 集合工具类,定义了除存取意外的集合常用方法。