首页 > 编程语言 >Java集合小结

Java集合小结

时间:2025-01-18 12:28:24浏览次数:3  
标签:Java hashMap iterator ArrayList Object 链表 集合 new 小结

这一节先快速回顾所学集合知识(抓要点,不深追底层代码),下一节复习集合的八股文

狠狠学java,猛猛赚他一笔!

一集合体系图

集合分为单列集合和双列集合,先来看集合体系图

二单列集合

2.1List之三种遍历方式 

iterator迭代器遍历(idea快捷键itit)

List list = new ArrayList();
Iterator iterator = r.iterator();
 while (iterator.hasNext()) {
            Object next =  iterator.next();
            
        }

增强for循环(idea快捷键I)

ArrayList r = new ArrayList();
for (Object o :r) {
            System.out.println(o);
        }

注意:增强for循环的底层就是通过迭代器实现

普通for循环

 ArrayList r = new ArrayList();
for(int i=0;i<r.size();i++){
            System.out.println(r.get(i));
        }

2.2ArrayList(基本等同Vector)

        ArrayList的特点:底层是数组(连续的内存空间),元素有序,可重复(可以放多个null值),支持索引,线程不安全(无synchronized),不适用多线程

        ArrayList的扩容机制:

        有参构造器eg:ArrayList List = new ArrayList(100),按照参数的1.5倍扩容

        无参构造器:第一次初始化时,容量=10,之后按照1.5倍扩容

源码:

初始化默认容量

private static final int DEFAULT_CAPACITY = 10;

扩容机制:1+0.5  >>向右位移 除以2

int newCapacity = oldCapacity + (oldCapacity >> 1);

使用ArrayList.copyOf()扩容

return elementData = Arrays.copyOf(elementData,
                                           newCapacity(minCapacity));

2.3Vector(对象数组)

        Vector特点:元素有序,可重复,支持索引,可以放多个null值,线程安全(synchronized),适用多线程

        Vector扩容机制:两倍扩容

(capacityIncrement > 0)  false
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);

无参构造器默认初始化容量为10

//无参构造器
public Vector() {
        this(10);
    }

2.4LinkedList(双向链表+双端队列)

        LinkedList特点:底层是双向链表(不连续的内存空间),元素有序,可重复,支持索引,可以放多个null值,线程不安全(无synchronized),不适用多线程

public LinkedList() {
}

有first指针指向头结点,last直接指向尾结点,每个节点有pre前驱和next后继结点

2.5List集合选择

       基本逻辑:首先考虑线程安全性

                        数组是连续内存空间,便于查询,

                        链表中包含指针操作,便于增删

2.6HashSet(底层HashMap)

这里先说说Set接口统一特点:

1)无序,添加与取出的顺序不一致,没有索引,不能保证元素一致性

2)不允许重复元素,最多一个null值

3)遍历方式:迭代器,增强for,不能根据索引遍历(无get(index)方法)

4)取出顺序的相对位置固定

//HashSet中数据占据hashMap的键位置,其值位置全部用PRESENT替代,注意:static final ,只会初始化一次,所用的值均是同一个PRESENT
private static final Object PRESENT = new Object();
public HashSet() {
        map = new HashMap<>();
    }

        HashSet(HashMap)扩容机制:

       table表中每增加一个元素到table中,就算是增加1个(无论是加到表的空位置还是挂到链表上)当达到临界值:容量*加载因子,进行双倍扩容:容量*2

//默认初始化容量16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
//扩容加载因子0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;

2.7LinkedHashSet(数组加双向链表)

        1)LinkedHashSet是HashSet的子类

        2)底层是LinkedHashMap,底层维护了一个数组+双向链表

        3)LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,使得元素看起来是有序的

2.8TreeSet(底层TreeMap)

public TreeSet() {
    this(new TreeMap<>());
}

        1)使用无参构造器,创建TreeSet时,仍是无序的

        2)可排序,可以在构造器中自己定义一个Comparator

TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).compareTo(((String)o2);
            }
        });

三双列集合

        先说说map的特点:

        key-value,键值对,key和value可以是任何引用类型的数据

        map中的key不能重复(原因同hashSet,与添加规则有关),value可重复

        如果添加相同的key,而值不同,则会覆盖原来的key-val(覆盖)

3.1HashMap(HashSet的底层)

        hashMap三种(六大)遍历方式:

        1)键找值(keySet)

        2)值集合(values)

        3)键值对(EntrySet)

 HashMap hashMap = new HashMap();
        hashMap.put("1","1");
        hashMap.put("2","2");
        hashMap.put("3","3");
        hashMap.put("4","4");
        Set set = hashMap.keySet();//键找值
        for (Object o :set) {
            System.out.println(hashMap.get(o));
        }
//        Iterator iterator = set.iterator();也可以迭代器,略
        Collection values = hashMap.values();//值集合
        for (Object o :values) {
            System.out.println(o);
        }
//        Iterator iterator = values.iterator();
        Set entries = hashMap.entrySet();//键值对
        for (Object o :entries) {
            Map.Entry entry = (Map.Entry) o;
            System.out.println(entry.getKey()+" "+entry.getValue());
        }

        HashMap底层:数组+链表+红黑树

        hashMap添加元素机制:先通过hash算法求得该元素的哈希值,进行转换得到该元素在数组的索引值,

        判断该索引位置有无元素,无则直接添加

        有:则进行equals(程序员可重写,定义比较规则)比较,若equals也相同,就放弃添加,不相同则添加到最后(若是链表则会循环对每一个数据进行equals比较)

        树化:

        在java8中,如果一条链表的元素  >= TREEIFY_THRESHOLD=8 &&

        table表的大小 >=   MIN_TREEIFY-CAPACITY(64)就会进行树化(红黑树)

3.2Hashtable

        hashTable的特点:

                1)键和值都不能为空,否则会空指针异常

                2)使用方法同hashMap

                3)hashtable线程安全,synchronized

public Hashtable() {
        this((initialCapacity)11, (loaderFactor)0.75f);
    }
int newCapacity = (oldCapacity << 1) + 1;

扩容机制:达到临界值时,乘2+1

3.3TreeMap

public TreeMap() {
        comparator = null;
    }

四集合选型规则(一张表)

        先判断存储类型,再看是否可重复,或要求有序

标签:Java,hashMap,iterator,ArrayList,Object,链表,集合,new,小结
From: https://blog.csdn.net/m0_74927596/article/details/145222311

相关文章

  • JAVA:根据经纬度获取夏令时以及偏移(免费)
    注:国内根据经纬度来获取夏令时区以及时区偏移量的api的服务有百度和谷歌,但是谷歌的获取夏令时和时区的api在国内服务其上部署时访问不了的(看过有在服务器上安装代理的,但是操作有点复杂。好吧,其实是我看着步骤太多,感觉太麻烦所以直接pass了)。所以目前在我获取到的信息中,只有百......
  • JAVA安全之JDK8u141版本绕过研究
    基本介绍从JDK8u141开始JEP290中针对RegistryImpl_Skel#dispatch中bind、unbind、rebind操作增加了checkAccess检查,此项检查只允许来源为本地,下面以bind为例:publicvoiddispatch(Remotevar1,RemoteCallvar2,intvar3,longvar4)throwsException{if(var4!=4......
  • Java初学者笔记-04、异常与泛型
    异常异常代表程序出现的问题。Error错误和Exception异常。RuntimeException运行时异常。编译时异常,提醒程序员这里的程序很容易出错。异常的基础处理抛出给上层调用者。使用try-catch处理。异常的处理方案底层异常抛出,最外层捕获异常记录异常并响应合适信息。(少见)最......
  • leetcode——接雨水(java)
    给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨水)。示例......
  • 【2024年华为OD机试】 (A卷,200分)- 硬件产品销售方案(Java & JS & Python&C/C++)
    一、问题描述题目描述某公司目前推出了AI开发者套件,AI加速卡,AI加速模块,AI服务器,智能边缘多种硬件产品,每种产品包含若干个型号。现某合作厂商要采购金额为amount元的硬件产品搭建自己的AI基座。例如当前库存有N种产品,每种产品的库存量充足,给定每种产品的价格,记为price(不......
  • 【2024年华为OD机试】 (B卷,100分)- 流水线(Java & JS & Python&C/C++)
    一、问题描述题目描述一个工厂有m条流水线,来并行完成n个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。现给定流水线个数m,需要完成的作业数n,每个作业的处理时间分别为t1,t2,...,tn。请你编程计算处理完所有作业的耗时为多......
  • 股票API接口使用python、JAVA等多种语言实例代码演示免费获取实时数据、历史数据、CDM
    ​最新整理的股票API接口,下方所有接口链接均可直接点击验证,查看返回的数据。沪深两市股票列表股票API接口链接(可点击验证):https://api.mairui.club/hslt/list/LICENCE-66D8-9F96-0C7F0FBCD073【实时数据接口】沪深两市实时交易数据接口股票API接口链接(可点击验证):https:......
  • leetcode——令牌放置(java)
    你的初始能量为power,初始分数为0,只有一包令牌以整数数组tokens给出。其中tokens[i]是第i个令牌的值(下标从0开始)。你的目标是通过有策略地使用这些令牌以最大化总分数。在一次行动中,你可以用两种方式中的一种来使用一个未被使用的令牌(但不是对同一个令牌使......
  • java集合
    集合想一下,目前为止,我们学过哪些可以存储元素的容器:1、数组,查询快,增删慢。既可以存储基本数据类型的元素,又可以存储引用数据类型的元素对于同一个数组而言,元素类型都是一样长度一旦创建旧固定了,不能改变长度。2、StringBuffer长度可以随着添加的字符个数而改变StringBuffe......
  • java常用类
    java常用类Api概述API(ApplicationProgrammingInterface)应用程序编程接口编写一个机器人程序去控制机器人踢足球,程序就需要向机器人发出向前跑、向后跑、射门、抢球等各种命令,没有编过程序的人很难想象这样的程序如何编写。但是对于有经验的开发人员来说,知道机器人厂商一......