• java的集合


     因为此文章用于博主的复习,所以就不介绍集合是什么,什么时候用到以及为什么要用。

    直接进入干又硬的知识点

     

    1 集合框架

    1.1 List

    List(列表)是有序的集合,它允许重复的元素。

    1.LinkedList:基于链表实现,链表内存是散列的,增删快,查找慢;

    2.ArrayList:基于数组实现,非线程安全,效率高,增删慢,查找快; 

    3.Vector:基于数组实现,线程安全,效率低,增删慢,查找慢;

    ArrayList、LinkedList、Vector 的区别
    ArrayListLinkedListVector
    底层实现数组双向链表数组
    同步性及效率不同步,非线程安全,效率高,支持随机访问不同步,非线程安全,效率高同步,线程安全,效率低
    特点查询快,增删慢查询慢,增删快查询快,增删慢
    默认容量10/10
    扩容机制int newCapacity = oldCapacity + (oldCapacity >> 1);//1.5 倍/2 倍

    1.2 Map

    1.HashMap:基于哈希表的实现,是使用频率最高的用于键值对处理的数据类型。它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,特点是访问速度快,遍历顺序不确定,线程不安全,最多允许一个key为null,允许多个value为null。

    2.HashTable:线程安全,低效,不支持 null 值和 null 键;

    3.LinkedHashMap: LinkedHashMap继承了HashMap,是Map接口的哈希表和链接列表实现,它维护着一个双重链接列表,此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。

    4.TreeMap:能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。

    HashMap、HashTable、TreeMap的区别
    HashMapHashTableTreeMap
    底层实现哈希表(数组+链表)哈希表(数组+链表)红黑树
    同步性线程不同步同步线程不同步
    null值允许 key 和 Vale 是 null,但是只允许一个 key 为 null,且这个元素存放在哈希表 0 角标位置不允许key、value 是 nullvalue允许为null。
    当未实现 Comparator 接口时,key 不可以为null
    当实现 Comparator 接口时,若未对 null 情况进行判断,则可能抛 NullPointerException 异常。如果针对null情况实现了,可以存入,但是却不能正常使用get()访问,只能通过遍历去访问。
    hash使用hash(Object key)扰动函数对 key 的 hashCode 进行扰动后作为 hash 值直接使用 key 的 hashCode() 返回值作为 hash 值
    容量容量为 2^4 且容量一定是 2^n默认容量是11,不一定是 2^n
    扩容两倍,且哈希桶的下标使用 &运算代替了取模2倍+1,取哈希桶下标是直接用模运算

    1.3 Set 

    1.HashSet:底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。

    2.LinkedHashSet: 底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。

    3.TreeSet:底层数据结构采用二叉树来实现,元素唯一且已经排好序,唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。

    HashSet、TreeSet、LinkedHashSet的区别
    HashSetTreeSetLinkedHashSet
    底层实现HashMap红黑树LinkedHashMap
    重复性不允许重复不允许重复不允许重复
    有无序无序有序,支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。有序,以元素插入的顺序来维护集合的链接表
    时间复杂度add(),remove(),contains()方法的时间复杂度是O(1)add(),remove(),contains()方法的时间复杂度是O(logn)LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet,时间复杂度是 O(1)。
    同步性不同步,线程不安全不同步,线程不安全不同步,线程不安全
    null值允许null值不支持null值,会抛出 java.lang.NullPointerException 异常。因为TreeSet应用 compareTo() 方法于各个元素来比较他们,当比较null值时会抛出 NullPointerException异常。允许null值
    比较equals()compareTo()equals()

    2 集合的基本操作 

    2.1 基本操作

    1. public class CollectionExample {
    2. public static void main(String[] args) {
    3. // 创建一个 ArrayList
    4. ArrayList fruits = new ArrayList<>();
    5. // 添加元素
    6. fruits.add("苹果");
    7. fruits.add("香蕉");
    8. fruits.add("橙子");
    9. // 删除元素
    10. fruits.remove("香蕉");
    11. // 遍历元素
    12. for (String fruit : fruits) {
    13. System.out.println(fruit);
    14. }
    15. }
    16. }

     

    2.2 Iterator接口 

    Iterator接口,用于遍历集合元素的接口。 

    1. public static void main(String[] args) {
    2. List list1 = new ArrayList<>();
    3. list1.add("abc0");
    4. list1.add("abc1");
    5. list1.add("abc2");
    6. // while循环方式遍历
    7. Iterator it1 = list1.iterator();
    8. while (it1.hasNext()) {
    9. System.out.println(it1.next());
    10. }
    11. // for循环方式遍历
    12. for (Iterator it2 = list1.iterator(); it2.hasNext(); ) {
    13. System.out.println(it2.next());

    2.3 集合工具类Collections

     Collections:集合工具类,方便对集合的操作。这个类不需要创建对象,内部提供的都是静态方法。

    1. Collections.sort(list);//list集合进行元素的自然顺序排序。
    2. Collections.sort(list,new ComparatorByLen());//按指定的比较器方法排序。
    3. class ComparatorByLen implements Comparator{
    4. public int compare(String s1,String s2){
    5. int temp = s1.length()-s2.length();
    6. return temp==0?s1.compareTo(s2):temp;
    7. }
    8. }
    9. Collections.max(list);//返回list中字典顺序最大的元素。
    10. int index = Collections.binarySearch(list,"zz");//二分查找,返回角标。
    11. Collections.reverseOrder();//逆向反转排序。
    12. Collections.shuffle(list);//随机对list中的元素进行位置的置换。
    13. //将非同步集合转成同步集合的方法:Collections中的 XXX synchronizedXXX(XXX);
    14. //原理:定义一个类,将集合所有的方法加同一把锁后返回。
    15. List synchronizedList(list);
    16. Map synchronizedMap(map);

     

  • 相关阅读:
    T5 model
    What is a TCP SYN Flood DDoS Attack?
    被迫开始学习Typescript —— class
    MYSQL的触发器
    python | xlsxwriter,一个实用的 Python 库!
    每日一题:探究响应式本质,以最简单的方式理解响应式
    FileBeat 实战
    2022“杭电杯”中国大学生算法设计超级联赛(7) 2022杭电多校第七场
    npm详解
    03贪心:摆动序列
  • 原文地址:https://blog.csdn.net/m0_73798489/article/details/139354942