Java 进阶:集合框架2

【技术精进】Java集合框架:从入门到精通的思考之路 你是否曾经困惑于HashMap的扩容机制?是否好奇ConcurrentHashMap是如何保证线程安全的?或者对Java 8中Stream API的优雅设计感到惊叹?本文将带你深入探索Java集合框架的精髓,从实战应用到源码分析,从性能调优到并发处理,一步步揭开Java集合框架的神秘面纱。这不仅是一份学习指南,更是一次技术沉淀的旅程。 阅读详情


一、List 接口

1. 概述

  • 继承 Collection 接口,它是一个元素存取 有序 的集合

例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)

  • 它是一个 带有索引 的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)

  • 与 set 不同,List 中 可以有重复的元素,通过元素的 equals 方法,来比较是否为重复的元素

  • List 接口的常用实现类有:

  • ArrayList 集合

  • LinkedList 集合

2. List 接口中的抽象方法(特有)

  • add(int index, Object e) : 向集合指定索引处,添加指定的元素,原元素依次 后移
  • remove(int index):将指定索引处的元素,从集合中删除,返回值为被删除的元素
  • set(int index,E element):将指定索引处的元素,替换成指定的元素,返回值为替换前的元素
  • get(int index):获取指定索引处的元素,并返回该元素

3. List 遍历

List<Person> a = new LinkedList<>();
a.add(new Person("zs",10));
a.add(new Person("lisi",20));
a.add(new Person("wangwu",30));

//利用Iterator来遍历List
Iterator<Person> iterator = a.iterator();

//利用迭代器对象遍历
while(listItr.hasNext()) {
    System.out.println(listItr.next());
}

//List独有的遍历方式
for (int i = 0; i < a.size(); i++) {
    System.out.println(a.get(i));
}

二、ListIterator 接口

1.概述

  • List 不仅有自己独有的迭代方式,还有自己独有的迭代器: ListIterator

2. ListIterator 接口的抽象方法

  • add(E, e):将指定元素插入列表
  • boolean hasPrevious():逆向遍历列表,若列表迭代器有多个元素,则返回 true,也就是判断是否有前一个元素
  • previous() :返回列表的前一个元素

3. List 逆向遍历:

Iterator<Person> iterator = a.iterator();
ListIterator<Person> listItr = a.listIterator(a.size());
//先顺序遍历,让 cursor 到最后
while(listItr.hasNext()) {
    System.out.println(listItr.next());
}
//逆向遍历
//先previous向前移动一个位置,再访问cursor指向的元素
while(listItr.hasPrevious()) {
    System.out.println(listItr.previous());
}

三、迭代器的并发修改异常

1. 迭代器的并发修改异常

java.util.ConcurrentModificationException

  • 就是在遍历的过程中,使用了集合方法 修改了 集合的长度

2. 出现场景:

首先,在遍历集合的过程中修改集合;其次,修改集合行为,不是迭代器对象来完成的,而是直接修改 Collection 对象

//场景实现
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");

//对集合使用迭代器进行获取,获取时候判断集合中是否存在 "abc3"对象
//如果有,添加一个元素 "ABC3"
Iterator<String> it = list.iterator();
while(it.hasNext()){
    String s = it.next();
    //对获取出的元素s,进行判断,是不是有"abc3"
    if(s.equals("abc3")){
        list.add("ABC3");
    }
    System.out.println(s);
}

3. 原因:

在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。迭代器对象,是依赖与当前的数据集合产生的(换言之,迭代器依赖于数据集,它们必须对应)

public class ListDemo{
    public static void main(String[] args) {
       List<Person> a = new LinkedList<>();
       //迭代器
       ListIterator<Person> listItr = a.listIterator();

        a.add(new Person("zs",10));
        a.add(new Person("lisi",20));
        a.add(new Person("wangwu",30));

        while(listItr.hasNext()){
            Person p = listItr.next();
            //这种添加元素的方式,会产生异常
            //a.add(new Person("zhaoliu", 40));

            //解决: 利用ListIterator对象添加元素
            listItr.add(new Person("zhaoliu", 40));
        }
    }
    System.out.println(s);

    //针对List还有另外一种,在遍历集合同时修改集合的解决方案
    for (int i = 0; i < a.size(); i++){
        if("lisi".equals(a.get(i).name)){
            a.add(new Person("zhaoliu", 40));
        }
    }
    System.out.println(a);
    //如果使用 ListIterator 的add方法向集合中添加元素,这个元素的位置处在当前遍历到的元素之后的位置
    //如果使用 集合对象的 add(e) 方法添加元素,插入的元素处在表尾位置
}

四、ArrayList 、LinkedList 集合

1. ArrayList 集合

  • 底层采用的是 数组 结构,线程不安全,查询快,增删慢
//创建了一个长度为0的Object类型数组
ArrayList al=new ArrayList();
al.add("abc");
//本质:
//底层会创建一个长度为10的Object数组 Object[] obj=new Object[10]
//obj[0]="abc"
//如果添加的元素的超过10个,底层会开辟一个1.5*10的长度的新数组
//把原数组中的元素拷贝到新数组,再把最后一个元素添加到新数组中

2. LinkedList 集合

  • 底层采用 链表 结构,线程不安全,查询慢,增删快
  • 每次查询都要从链头或链尾找起,查询相对数组较慢,但是删除直接修改元素记录的地址值即可,不要大量移动元素
  • LinkedList 的索引决定是从链头开始找还是从链尾开始找,如果该元素小于元素长度一半,从链头开始找起,如果大于元素长度的一半,则从链尾找起
  • LinkedList 提供了大量的操作开始和结尾的方法
  • 子类的特有功能:不能多态调用:

addFirst(E) 添加到链表的开头
addLast(E) 添加到链表的结尾
E getFirst() 获取链表的开头
E getLast() 获取链表的结尾
E removeFirst() 移除并返回链表的开头
E removeLast() 移除并返回链表的结尾

3. Vector 集合(基本不用)

  • Vector 集合数据存储的结构是 数组 结构,为JDK中最早提供的集合,它是线程同步的,线程安全的
  • Vector 集合已被 ArrayList 替代

五、Set 接口

1. 特点

  • 它是个 不包含重复元素 的集合,没索引

  • 是一个不包含重复元素的 collection

  • 无序集合,没有索引,不存储重复元素

  • Set无序:存储和取出的顺序不同,

  • Set集合取出元素的方式可以采用:迭代器、增强for

  • 代码的编写上,和 ArrayList 完全一致

  • Set集合常用实现类:

  • HashSet 集合

  • LinkedHashSet 集合


六、 HashSet (哈希表)

1. 特点:

  • 底层数据结构为 哈希表
  • 存储、取出都比较快
  • 线程不安全,运行速度快
  • 不保证 set 的迭代顺序
  • 不保证该顺序的恒久不变

2. 哈希表的数据结构:

  • 加载因子:表中填入的记录数/哈希表的长度
    例如:加载因子是 0.75 代表:数组中的16个位置, 其中存入 16 * 0.75 = 12个元素。
  • 如果在存入第十三个( > 12 )元素,导致存储链子过长,会降低哈希表的性能,那么此时会扩充哈希表(再哈希),底层会开辟一个长度为原长度2倍的数组,把老元素拷贝到新数组中,再把新元素添加数组中。
    当 存入元素数量 > 哈希表长度 * 加载因子,就要扩容,因此加载因子决定扩容时机

3. 字符串对象的哈希值:

  • 对象的哈希值,是普通的十进制整数,Object 类的方法 public int hashCode() 来计算,计算结果 int 整数
  • String 类重写了hashCode() 方法,见源码

4. 哈希表的存储过程

存取原理:
每存入一个新的元素都要走以下三步:
1. 首先调用本类的 hashCode() 方法算出哈希值
2. 在容器中找是否与新元素哈希值相同的老元素,如果没有直接存入,如果有转到第三步
3. 新元素会与该索引位置下的老元素利用 equals 方法一一对比,一旦 新元素.equals(老元素),返回 true,停止对比,说明重复,不再存入,如果与该索引位置下的老元素都通过 equals 方法对比返回 false,说明没有重复,存入

哈希表的存储过程

5. 哈希表的存储自定义对象

  • 自定义对象需要重写 hashCode() 和 equals(),来保证存入对象的不重复
//重写hachCode() 方法
public int hashCode(){
    return name.hashCode() +age +id; //算法为name的hashCode值+age+id
}
//重写equals
public boolean equals(Object obj){
    if(this == obj)
        return true;
    if(obj == null)
        return false;
    if(obj instanceof Student){
        Student s = (Student)obj;
        return name.equals(s.name) && age == s.age && id == s.id;
    }
    return false;
}

6. LinkedHashSet 集合

  • LinkedHashSet 基于链表的哈希表实现,继承自 HashSet

  • LinkedHashSet 自身特性:

  • 具有顺序,存储和取出的顺序相同的,线程不安全,运行速度块

public class LinkedHashSetDemo {
    public static void main(String[] args) {
        LinkedHashSet<Integer> link = new LinkedHashSet<Integer>();
        link.add(123);
        link.add(44);
        link.add(33);
        link.add(33);
        System.out.println(link);
    }
}

7. ArrayList,HashSet 判断对象是否重复的原因

  • ArrayList 的 contains()原理:底层依赖于equals()

ArrayList的 contains方法 调用时,传入的元素的调用 equals方法 依次与集合中的旧元素所比较,从而根据返回的布尔值判断是否有重复元素。
此时,当ArrayList存放自定义类型时,由于自定义类型在未重写equals方法前, 判断是否重复的依据是地址值,所以如果想根据内容判断是否为重复元素,需要重写元素的 equals方法。

  • HashSet 的 add() 和 contains() 底层都依赖hashCode()与 equals()

Set集合不能存放重复元素,其添加方法在添加时会判断是否有重复元素,有重复不添加,没重复则添加。
HashSet集合由于是无序的,其判断唯一的依据是元素类型的hashCode与equals方法的返回结果。规则如下:

1. 先判断新元素与集合内已经有的旧元素的HashCode值
2. 如果不同,说明是不同元素,添加到集合。
3. 如果相同,再判断equals比较结果。返回true则相同元素;返回false则不同元素,添加到集合。
所以,使用HashSet存储自定义类型,如果没有重写该类的 hashCode()与equals(),则判断重复时,使用的是地址值,如果想通过内容比较元素是否相同,需要重写该元素类的 hashcode()与equals()。


七、TreeSet

1.概述

  • Set 的另外一种实现,底层由 红黑树 实现;也就是说TreeSet会根据元素的大小关系,将元素默认从小到大排列

  • 特点:

  • 元素无序(迭代或者存储顺序和插入顺序)

  • 不能存储重复元素

  • 没有位序

  • Comparator comparator();如果TreeSet采用了定制排序,则该方法返回定制排序所使用 Comparator;如果TreeSet采用了自然排序,则返回null;

2. TreeSet如何实现,不能存储重复元素

  • 其实,在真正的添加元素,treeset 的 add方法 会搜索整颗红黑树(这个元素值,是否已经存在于当前集合,如果存在,则不添加,不存在,就添加)

3. 向TreeSet中放入,自定义的类的对象

  • 如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现Comparable接口,否则程序会抛出异常 java.lang.ClassCastException

现象:直接向一个 TreeSet 中放入自定义类型的对象,发现直接抛出异常
原因:TreeSet 不知道如何对自定义的类对象进行排序,不像字符串可以根据字典顺序

  • 如何向TreeSet中放入自定义类型的对象?

通过某种方式告诉 TreeSet 我们 自定义对象的比较规则

  • 如何自定义比较规则?
  • 第一种方式:放入TreeSet 中的元素实现Comparable接口,根据 CompareTo 方法来指定比较规则:比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。负整数 -> 小于,0 -> 等于,正整数 -> 大于
//compareTo方法
@Override
public int compareTo(Student o) {
    int result;
    if(age == o.age) {
        //当两个同学的年龄形同的时候,进一步按照名字排序
       result =  name.compareTo(o.name);
    } else if(age > o.age) {
        result = 100;
    } else {
        result = -34;
    }
    return result;
}
  • 第二种方式:给 TreeSet 对象定义比较器Comparator
//通过比较器,来制定比较的规则
TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
    return o1.getAge() - o2.getAge();
    }
}); 

4. 注意事项

  • 约定俗成:一旦元素添加到 TreeSet 之后,禁止修改TreeSet中的元素值
  • 原因:修改完TreeSet中的对象后,TreeSe t不会重新调整该元素在树中的位置
Java集合进阶 在Java中,集合框架(Collections Framework)是用于存储和操作一组对象的强大工具。它提供了多种接口和类,用于处理不同类型的集合(如列表、集合、队列、映射等)。为了帮助你学习Java集合的进阶知识,我将从以下几个方面进行讲解:Java集合框架主要包括以下接口和类:: 所有集合类的根接口。: 有序集合,允许重复元素(如 , )。: 无序集合,不允许重复元素(如 , )。: 队列,支持先进先出(FIFO)或优先级队列(如 )。: 键值对集合(如 , )。: 基于动态数组实现的列表。: 基于双 阅读详情

相关推荐

21、JAVA进阶——集合(2)

一、Collections类 1、解释 2、对集合元素排序与查找 3、替换集合元素 二、认识泛型 1、 泛型的定义 2、 泛型在集合中的应用 三、深入泛型 1、 定义泛型类、泛型接口和泛型方法 2、 多个参数的泛型类 3、 从泛型类派生子类

不迁怒,不贰过。小知识,大智慧。 1095

4种方式获取List中指定元素

package com.web; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Test4 { public static void main(String[] args) { // List<String> resultList = new LinkedList<&gt

zhansan的博客 4万+

逆向实战:手把手教你分析Google DroidGuard虚拟机的加密与反调试(附Python脚本)

本文深入解析Google DroidGuard虚拟机的加密机制与反调试策略,提供从环境配置到逆向分析的完整实战指南。通过IDA Pro、Frida等工具链,详细剖析DroidGuard的信号拦截、内存校验等保护机制,并附Python脚本实现自动化分析,助力Android安全研究人员突破GMS核心组件的安全防护。

weixin_32428571的博客 313

java中List集合三种获取集合元素方式

java中List集合三种获取集合元素方式

欢迎你的到来,我们一起加油!!! 5万+

Windows系统下复现PointNet++算法

本文详细介绍了如何在Windows系统下复现PointNet++算法,内容包括程序下载、环境配置、数据集准备以及三个主要任务(语义分割、分类、部件分割)的实现步骤和常见报错解决方法。通过遵循本文的指导,用户可以顺利完成PointNet++算法的复现。

LingYi_5的博客 4326

VINS-Fusion实战:从零搭建无人机视觉SLAM系统(附ROS配置全流程)

本文详细介绍了如何从零开始为无人机搭建基于VINS-Fusion的视觉SLAM系统。内容涵盖硬件选型(重点推荐双目相机与IMU搭配)、ROS环境配置、传感器标定、核心参数调优以及实际飞行测试与问题排解全流程,旨在帮助开发者实现稳定、精确的无人机自主定位与导航。

wasm7browser的博客 216

【Java】List 接口遍历元素的三种方式

List 接口遍历元素的三种方式

dengmsjava的博客 4004

基于LTspice的共模电感差模/共模插入损耗仿真指南

在电源与EMC设计领域,插入损耗是衡量滤波器件抑制噪声能力的核心指标。共模电感作为EMI滤波器中最常见的元器件之一,其差模与共模插入损耗特性直接影响整体滤波方案的合规性。然而,仅依赖规格书曲线往往难以覆盖真实应用中的阻抗条件,借助SPICE仿真工具进行电路级验证已成为工程师常用的手段。LTspice凭借其轻量、高效的交流分析能力,能够帮助设计者快速搭建共模电感等效模型,并通过调整耦合系数、寄生电容等参数,还原漏感与谐振行为。本文以Wurth Elektronik的WE 744821201型号为例,从基本测试

weixin_27252001的博客 293

List中取出特定数据

1.for循环遍历删除指定元素 List<String> list = new ArrayList<>(Arrays.asList("a","b","c","f","b","e","d")); for (int i = 0; i < list.size(); i++) { System.out.println("i="+i+"//str="+list.get(i)); if (list.get(i).equ

qq_31387691的博客 1万+

ExpressLRS 915MHz vs 2.4GHz:实测对比与TX12遥控器的最佳搭配方案

本文深入对比了ExpressLRS 915MHz与2.4GHz两种频段在穿透能力、延迟、抗干扰等方面的实测表现,并结合RadioMaster TX12遥控器的硬件特性,提供了从微型花飞到极限远航等不同场景下的最佳搭配方案与EdgeTX系统配置指南,帮助FPV玩家根据核心飞行需求做出精准选择。

milk8的博客 447

SAP ERP与金蝶云星空的集成案例(新能源光伏行业)

通过建设PLM、SAP、MES、WMS、SCADA、EAM等多系统集成的工业互联网平台作为数字化工厂的控制中枢,不仅可以实现人员、设备、物料、工艺参数、产品等生产全流程追溯管理,同时也可以根据数据采集进行生产现场的控制调节,最大程度降低能耗水平。销售订单创建下推金蝶采购订单创建修改、销售订单创建下推金蝶销售订单创建修改、销售发货过账下推金蝶采购入库单、销售发货过账下推金蝶销售出库单:在SAP ERP系统创建销售订单、销售发货过账单后推送到云星空系统,进行采购/销售订单的创建修改、完成物料的入库和出库流程。

集信通 1621

Java——集合笔记

一、集合概述 为了在程序中保存数目不确定的对象,Java提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,这些类统称为集合 二、Collection接口 Collection是所有单列集合的父接口,它定义了单列集合(List和Set)通用的一些方法。 Collection接口的常用方法 boolean add(Object o) //向集合添加一个元素 boolean addAll(Collection c) //将指定Collection中所有元素添加到该集合中 void cl

m0_48936146的博客 6090

R语言机器学习算法实战系列(十五)随机森林生存预后模型+SHAP值 (Random Survival Forest + SHAP)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。。并且增加了SHAP值评估特征重要性

专注生信领域 2627

Java-进阶:集合框架2

目录 一、List 接口 1. 概述 2. List 接口中的抽象方法(特有) 3. List 遍历 二、ListIterator 接口 1.概述 2. ListIterator 接口的抽象方法 3. List 逆向遍历: 三、迭代器的并发修改异常 1. 迭代器的并发修改异常 2. 出现场景: 3. 原因: 四、ArrayList 、LinkedList 集合 1. ArrayList 集合 2. LinkedList 集合 3. Vector 集合(基本不用) 五、Set 接口 六、 HashSet (哈

m0_57205294的博客 79

【WRF数据准备】海温(SST)数据替换

【WRF数据准备】海温(SST)数据替换

WW、forever的博客 1119

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java-进阶:集合框架2(1)

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!!ult = 100;} else {第二种方式:给 TreeSet 对象定义比较器Comparator这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!![外链图片转存中…(img-SJe0G5Cu-1714321594232)]本文已被。

2401_84103216的博客 823

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java-进阶:集合框架2,springboot源码分析视频

3. Vector 集合(基本不用) 五、Set 接口 六、 HashSet (哈希表) 1. 特点 2. 哈希表的数据结构 3. 字符串对象的哈希值 4. 哈希表的存储过程 5. 哈希表的存储自定义对象 6. LinkedHashSet 集合 7. ArrayList,HashSet 判断对象是否重复的原因 七、TreeSet 1.概述 2. TreeSet如何实现,不能存储重复元素 3. 向TreeSet中放入,自定义的类的对象 4. 注意事项 一、List 接口 1. 概述 继承 Collecti

m0_64867047的博客 275

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java 进阶:集合框架1

目录 一、集合类 1. 概述 2. 集合类的框架 3. 参数化类型和泛型 二、Collection 接口 三、 集合 Collection 的方法 1. 第一类:针对单个元素的操作 2. 第二类:针对集合的操作(一次操作多个元素) 三、集合元素的遍历 1. 第一种遍历方式: 将集合转化为数组 2. 第二种遍历方式: 通过迭代器遍历集合中的所有元素(集合专用) 四、Iterator 接口 (迭代器) 1. 迭代器概述 2. Iterator 接口的抽象方法 3. 遍历的代码实现 4. 实现原理 5. 一个例题

诗与远方的博客 1000

Java-进阶:集合框架1

因为:功能上没什么问题,但是由于一旦把针对不同具体集合的生成迭代器的方法,放在一个类中,通常,各个不同的迭代器的方法,可能会有一些公共行为,被抽成一个方法。迭代器是一个接口,每一个具体的集合类都实现了 Iterator 接口,能够返回一个针对自己的存储结构的具体的 Iterator 接口的实现子类。//迭代是反复内容,使用循环实现,循环的条件,集合中没元素, hasNext()返回了false。//调用集合的方法iterator()获取出 Iterator接口的实现类的对象。//将基本数据类放入集合中。

2401_85113211的博客 767

Java进阶九—数组问题(集合框架)

由此我们抛出即Java集合框架,也可称为函数库。

2301_76556912的博客 1084

Java 集合框架是什么?集合框架的优点有哪些?

它提供了一系列的接口和类,这些接口和类可以帮助我们以一种高效和标准化的方式存储、访问和操作数据集合。随着集合的广泛使用,Java1.2 提出了囊括所有集合接口、实现和算法的集合框架。集合框架中的类都是由经验丰富的开发者设计和实现的,它们经过了严格的测试,确保了性能和稳定性。集合框架提供了现成的、经过优化的数据结构,开发者可以直接使用这些数据结构,而不需要从头开始实现自己的集合类。:Java 5 引入了泛型,这使得集合可以指定它们可以存储的元素类型,从而提供了编译时类型安全,减少了类型转换的错误。

apple_64847327的博客 1105

Java进阶_1集合框架

Java进阶_1 一、集合框架概念 集合是对象的容器,定义了多个对象进行操作的常用方法,类似数组的功能。 和数组的区别 (1)数组长度固定,集合长度不固定 (2)数组可以存储基本类型和引用类型,集合只能存储引用类型 位置:java.util.*; 图1-集合框架图 集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容: **接口:**是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对

Nicole_1_2_3的博客 274

Java进阶——集合框架详解

集合是处理数据的核心工具,本文将结合博主工作中的电商系统部分场景,详细梳理 Java 集合的相关知识点的实际应用。

1加1等于的博客 950

Java进阶之集合框架(List)

以上是ArrayList动态扩容的代码,而Vector同样是用动态数组实现的,它的动态机制和ArrayList大同小异,这里就不再深究代码,不同的是Vector的方法基本上是用同步修饰符synchronized修饰,从而保证了线程安全,而Stack直接继承了Vector,因而也是线程安全的,只不过追加了先进后出的逻辑。在文章中列出的三个接口List、Set和Queue的特征,例如元素是否可为空,元素是否有序,这些在接口的实现类中,并不会严格遵循不是绝对的,只能作为接口设计的初衷和一般规范;

Liusp的专栏 1365
上一篇: Java 进阶:集合框架1
下一篇: Java 进阶:集合框架3
JavaCaiy
博客等级 码龄6年 1万+粉丝 95原创
评论 26
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值