Java集合框架-List、Set、Map

news2024/11/16 15:30:43

 一、Java集合框架概述:

1.1 Collection接口继承树

 JDK提供的集合API位于java.util包内。

 Map接口继承树

 1.2 Collection接口方法

Collection 接口

Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。

JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现。

在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理;从 JDK 5.0 增加了泛型以后,Java 集合可以记住容器中对象的数据类型。

Collection 接口方法

1.3 Iterator迭代器接口

        使用 Iterator 接口遍历集合元素

        Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。

        GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。类似于“交车上的售票员”、“火车上的乘务员”、“空姐”。

        Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现Iterator接口的对象。

        Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建Iterator 对象,则必须有一个被迭代的集合。

        集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。

        Iterator接口的方法

 

 在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且

下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。

        Iterator接口remove()方法

Iterator iter = coll.iterator();//回到起点

while(iter.hasNext()){

        Object obj = iter.next();

        if(obj.equals("Tom")){

        iter.remove();

        }

}

注意:

        Iterator可以删除集合的元素,但是是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法。

        如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,再调用remove都会报IllegalStateException。

         使用 foreach 循环遍历集合元素

Java 5.0 提供了 foreach 循环迭代访问 Collection和数组。

遍历操作不需获取Collection或数组的长度,无需使用索引访问元素。

遍历集合的底层调用Iterator完成操作。

foreach还可以用来遍历数组。

 二、Collection子接口之一:List接口

2.1 List接口概述

鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组。

List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。

List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。

2.2 List接口方法

2.3  List实现类之一:ArrayList

ArrayList 是 List 接口的典型实现类、主要实现类。

本质上,ArrayList是对象引用的一个”变长”数组。

ArrayListJDK1.8之前与之后的实现区别?

        JDK1.7:ArrayList像饿汉式,直接创建一个初始容量为10的数组。

        JDK1.8:ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创建一个始容量为10的数组。

Arrays.asList(…) 方法返回的 List 集合,既不是 ArrayList 实例,也不是Vector 实例。

Arrays.asList(…) 返回值是一个固定长度的 List。

ArrayList 就是一个动态的数组。

优点: 底层数据结构是数组,查询快,增删慢。

缺点: 线程不安全,效率高。
 

2.3.1 ArrayList 构造方法

2.3.2   ArrayList 方法

public class Test01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("a");
        System.out.println(list);
        System.out.println(list.get(1));
        System.out.println("list集合遍历:");
        /*
        for (int i = 0;i< list.size();i++){
            String s = list.get(i);
            System.out.println(s);
        }
         */
        //增强for循环
        for (String s :list){
            System.out.println(s);
        }

    }
}

 另一个博客里写有ArrayList这里就不再讲述了。 

2.4 List实现类之二:LinkedList

对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。

LinkedList基于链表的存储结构。

LinkedList:双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。Node除了保存数据,还定义了两个变量:

        prev变量记录前一个元素的位置。

        next变量记录下一个元素的位置。

优点: 底层数据结构是链表,查询慢,增删快。

缺点: 线程不安全,效率高

2.4.1 LinkedList 构造方法

2.4.2 LinkedList 方法

 2.5 List实现类之三:Vector

Vector 是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList 相同,区别之处在于Vector是线程安全的。

在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时, 使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。

优点: 底层数据结构是数组,查询快,增删慢。

缺点: 线程安全,效率低。

2.5.1 Vector字段

 2.5.2 Vector 构造方法

 2.5.3 Vector 方法

 

ArrayList和LinkedList的异同

二者都线程不安全,相对线程安全的Vector,执行效率高。

此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。

三、Collection子接口之一:Set接口

Set接口是Collection的子接口,set接口没有提供额外的方法

Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败。

Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals() 方法

3.1 Set实现类之一:HashSet

HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。

HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。

HashSet 具有以下特点:

        不能保证元素的排列顺序

        HashSet 不是线程安全的

        集合元素可以是 null

HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。

对于存放在Set容器中的对象,对应的类一定要重写equals()hashCode(Object obj)方法,以实现对象相等规则。即:“相等的对象必须具有相等的散列码”。

向HashSet中添加元素的过程:

        当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值,通过某种散列函数决定该对象HashSet 底层数组中的存储位置。(这个散列函数会与底层数组的长度相计算得到在数组中的下标,并且这种散列函数计算还尽可能保证能均匀存储元素,越是散列分布,该散列函数设计的越好)。

        如果两个元素的hashCode()值相等,会再继续调用equals方法,如果equals方法结果为true,添加失败;如果为false,那么会保存该元素,但是该数组的位置已经有元素了,那么会通过链表的方式继续链接。

如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet 将会把它们存储在不同的位置,但依然可以添加成功。

重写 hashCode() 方法的基本原则

        在程序运行时,同一个对象多次调用 hashCode() 方法应该返回相同的值。

        当两个对象的 equals() 方法比较返回 true 时,这两个对象的 hashCode()方法的返回值也应相等。

        对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值。

3.1.1 HashSet 构造方法

 3.1.2 HashSet 方法

public class Test01 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("x");
        set.add("y");
        set.add("z");
        set.add("x");
        System.out.println(set);
        System.out.println("set集合的遍历:");
        //set集合用迭代器来遍历
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String s = iterator.next();
            System.out.println(s);
        }

    }
}

 3.2 Set实现类之二:LinkedHashSet

LinkedHashSet 是 HashSet 的子类。

LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。

LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。

LinkedHashSet 不允许集合元素重复。

3.2.1 LinkedHashSet 构造方法

3.3 Set实现类之三:TreeSet

TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。

TreeSet底层使用红黑树结构存储数据。

TreeSet 两种排序方法:自然排序定制排序。默认情况下,TreeSet 采用自然排序。

四、Collection子接口之一:Map接口

  Map接口概述

Map与Collection并列存在。用于保存具有映射关系的数据:key-value。

Map 中的 key 和 value 都可以是任何引用类型的数据。

Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。

常用String类作为Map的“键”。

key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。

Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和Properties。其中,HashMap是 Map 接口使用频率最高的实现类。

 4.1 Map 接口:常用方法

 4.2 Map实现类之一:HashMap

HashMap是 Map 接口使用频率最高的实现类。

允许使用null键和null值,与HashSet一样,不保证映射的顺序。

所有的key构成的集合是Set:无序的、不可重复的。所以,key所在的类要重写:equals()和hashCode()。

所有的value构成的集合是Collection:无序的、可以重复的。所以,value所在的类要重写:equals()。

一个key-value构成一个entry。

所有的entry构成的集合是Set:无序的、不可重复的。

HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。

HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。

4.2.1 HashMap 构造方法

 4.2.2 HashMap 方法

public class Test01 {
    public static void main(String[] args) {
        //创建一个map key为string类型 数据是object类型
        Map<String,Object> map = new HashMap<>();
        //添加数据,通过key
        map.put("name","张三");
        map.put("age",20);
        map.put("sex","男");
        System.out.println("Map集合的遍历:");
        //通过keyset获取map中所有key值并把它们保存在set集合
        Set<String> ks = map.keySet();
        //迭代器
        Iterator<String> i = ks.iterator();
        //用hasNext查找key
        while (i.hasNext()){
            //获取key值
            String key = i.next();
            Object value = map.get(key);
            System.out.println(key+"--->"+value);
        }
    }
}

4.3 Map实现类之二:LinkedHashMap

LinkedHashMap 是 HashMap 的子类。

在HashMap存储结构的基础上,使用了一对双向链表来记录添加元素的顺序。

与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。

4.3.1 LinkedHashMap 构造方法

 4.3.2 LinkedHashMap 方法

4.4 Map实现类之三:TreeMap

TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序。

        TreeMap 可以保证所有的 Key-Value 对处于有序状态。

TreeSet底层使用红黑树结构存储数据。

TreeMap 的 Key 的排序:

        自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException。

        定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现Comparable 接口。

TreeMap判断两个key相等的标准:两个key通过compareTo()方法或者compare()方法返回0。

4.4.1 TreeMap构造方法

 4.4.2 TreeMap 方法

4.5 Map实现类之四:Hashtable

Hashtable是个古老的 Map 实现类,JDK1.0就提供了。不同于HashMap,Hashtable是线程安全的。

Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构,查询速度快,很多情况下可以互用。

与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value。

与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序。

Hashtable判断两个key相等、两个value相等的标准,与HashMap一致。

4.5.1 Hashtable 构造方法

4.5.2 Hashtable 方法

 4.6 Map实现类之四:Properties

Properties 类是 Hashtable 的子类,该对象用于处理属性文件。

由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key和 value 都是字符串类型。

存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法。

 4.6.1 Properties  构造方法

4.6.2 Properties  方法

五、Collections工具类

Collections 是一个操作 Set、List 和 Map 等集合的工具类。

Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。

排序操作(均为static方法)

        reverse(List):反转 List 中元素的顺序

        shuffle(List):对 List 集合元素进行随机排序

        sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序

        sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序

        swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

 Collections常用方法:同步控制

Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。

 

 5.1 Collections 方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/814787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab进阶绘图第24期—悬浮柱状图

悬浮柱状图是一种特殊的柱状图。 与常规柱状图相比&#xff0c;悬浮柱状图可以通过悬浮的矩形展示最小值到最大值的范围&#xff08;或其他范围表达&#xff09;&#xff0c;因此在多个领域得到应用。 本文使用自己制作的Floatingbar小工具进行悬浮柱状图的绘制&#xff0c;先…

【Linux】Linux项目自动化构建工具 make/Makefile

目录 1. Makefile 是如何工作的 2. 依赖关系与依赖方法 3. .PHONY 4. Makefile 的特殊符号 写在最后&#xff1a; 1. Makefile 是如何工作的 make 是一个命令。 Makefile 是一个文件&#xff0c;当前目录下的一个文件。 我们先来上手写一个简单的 Makefile 文件&#…

火山引擎AB测试:广告实验深度打通巨量引擎,高效测试广告素材

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近期&#xff0c;火山引擎AB测试DataTester上线了新版的广告AB实验&#xff0c;还推出了与巨量引擎深度打通的能力。用户可以在DataTester中直接进行广告落地页的创…

机器学习:异常检测

问题定义 anomaly&#xff0c;outlier&#xff0c; novelty&#xff0c; exceptions 不同的方法使用不同的名词定义这类问题。 应用 二分类 假如只有正常的数据&#xff0c;而异常的数据的范围非常广的话&#xff08;无法穷举&#xff09;&#xff0c;二分类这些不好做。另外就…

没钱,没人,没IT,如何成功进行数字化转型?

在数字化时代的浪潮下&#xff0c;技术的迅猛发展为企业和个人带来了前所未有的机遇和挑战。然而&#xff0c;传统的软件开发过程通常需要大量的编程工作&#xff0c;对于非技术背景的人士而言&#xff0c;这是一座高不可攀的技术门槛。如何能够快速地实现创新&#xff0c;推动…

YAML+PyYAML笔记 9 | PyYAML源码之dump(),dump_all(),safe_dump(),yaml.YAMLObject

9 | PyYAML源码之emit&#xff0c;dump&#xff0c;safe_dump&#xff0c;yaml.YAMLObject 1 yaml.dump()2 yaml.dump()3 yaml.safe_dump4 yaml.YAMLObject 1 yaml.dump() 源码&#xff1a; 作用&#xff1a; 将Python对象序列化为YAML流。如果stream为None&#xff0c;则返…

无涯教程-jQuery - Tooltip组件函数

小部件工具提示功能可与JqueryUI中的小部件一起使用。Tooltip用于显示提示。 Tooltip - 语法 $( document ).tooltip(); Tooltip - 示例 以下是显示工具提示用法的简单示例- <!doctype html> <html lang"en"><head><meta charset"utf…

【腾讯云 Cloud Studio 实战训练营】在Cloud Studio上使用React实现学生管理系统

一、前言 为了提升办公效率&#xff0c;越来越多的人开始使用云工作站的方法进行“云办公”了&#xff0c;所谓云办公即把传统意义办公场所转移到网络浏览器中&#xff0c;这样做的好处有&#xff1a; 实现真正的移动化办公&#xff0c;不再受设备、时间、地点等的束缚&#…

最近写了10篇Java技术博客【SQL和画图组件】

&#xff08;1&#xff09;Java获取SQL语句中的表名 &#xff08;2&#xff09;Java SQL 解析器实践 &#xff08;3&#xff09;Java SQL 格式化实践 &#xff08;4&#xff09;Java 画图 画图组件jgraphx项目整体介绍&#xff08;一&#xff09; 画图组件jgraphx项目导出…

Java版知识付费 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建

提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发…

VsCode与Idea编辑器更换背景图

目录 VsCode Idea VsCode 需要安装background插件 安装完成后&#xff0c;打开设置&#xff0c;搜索background 然后就可以在json文件进行图片设置&#xff0c;透明度等等 Idea 打开File -> Settings 然后找到Appearance &#xff0c; 往下滑&#xff0c;找到BackGround …

Android studio实现Button界面跳转

本教程以界面MainActivity跳转到TwoActivity为例 MainActivity对应layout&#xff1a;R.layout.activity_main TwoActivity*对应layout&#xff1a;R.layout.twolayout 1. 建立MainActivity的java文件 package com.example.myapplication;//界面跳转 所需头文件 import andro…

在人工智能的浪潮下,汽车自动驾驶的新发展新可能

原创 | 文 BFT机器人 相信生活在21世纪的人们&#xff0c;没有人会不知道什么是人工智能。如果你不知道&#xff0c;那么你就是被现社会甩在了身后。人工智能从出现到现在&#xff0c;经历了60年的发展&#xff0c;而如今人工智能更如一股大浪潮&#xff0c;席卷了全国各地&am…

Keil5芯片pack包官网下载与安装

1.进入官网 ARM Keil官网链接&#xff1a;https://www.keil.arm.com/ 2.进入CMSIS Packs中选择需要的pack包 输入需要的芯片型号后回车能显示出所有相关型号&#xff0c;或者在输入栏下方列表中查找&#xff1a; 3.下载所需的安装包 找到所需安装包后&#xff0c;右键在…

kernel32.dll如何修复,快速解决kernel32.dll缺失的方法

Kernel32.dll是Windows操作系统中一个重要的系统文件&#xff0c;对于系统的正常运行至关重要。然而&#xff0c;由于各种原因&#xff0c;用户可能会遇到kernel32.dll文件的缺失问题。今天小编就来给大家详细的介绍一下kernel32.dll这个文件&#xff0c;并且详细的介绍一下ker…

[计算机入门] 回收站

2.10 回收站 回收站是Windows 操作系统中一个特殊的文件夹&#xff0c;通常在桌面上以图标的形式表示。 回收站主要作用是为了保护用户的数据免于被意外删除。使用回收站后用户可以避免错误地彻底删除文件&#xff0c;也可以从回收站中恢复它们。如果没有回收站&#xff0c;在…

vue2.x通过指令实现v-debounce和v-throttle防抖节流的实现,亲测可用。

在vue2.x中&#xff0c;防抖和节流一般是通过引入防抖函数debounce和节流函数throtte&#xff0c;对事件回调进行一层包裹&#xff0c;然后在模板中绑定包裹后的事件回调&#xff0c;这样每个需要用的地方都需要进行防抖&#xff0c;节流函数的导入&#xff0c;事件回调的包裹&…

集成kisso框架springboot解决登录不了问题

前端使用 VUE 框架&#xff0c;要求请求头中传入 token值&#xff0c;获取设置token使用cookie操作 import Cookies from js-cookieconst TokenKey token-c export function getToken() {return Cookies.get(TokenKey) } export function setToken(token) {Cookies.set(Token…

【计算机网络】第四章 网络层(一)

文章目录 第四章 网络层4.1 网络层概述4.2 网络层提供的两种服务4.2.1 小结 第四章 网络层 网络层是计算机网络体系结构中的一个关键层&#xff0c;位于传输层上方、数据链路层下方。它负责将传输层提供的数据分割成适当大小的数据包&#xff0c;并在不同网络之间进行路由选择和…

Segment anything(图片分割大模型)

目录 1.Segment anything 2.补充图像分割和目标检测的区别 1.Segment anything 定义&#xff1a;图像分割通用大模型 延深&#xff1a;可以预计视觉检测大模型&#xff0c;也快了。 进一步理解&#xff1a;传统图像分割对于下图处理时&#xff0c;识别房子的是识别房子的模型…