java集合类详解

news2024/12/23 13:23:27

目录

1、数组导入:

2、单列集合

List接口

1、ArrayList:数组列表

ArrayList类中的方法

2、LinkedList:链表列表

3、Vector:数组列表

4、list集合的遍历

1、for循环遍历

2、增强for循环

3、迭代器遍历

Set接口

1、HashSet

​编辑

2、TreeSet

3、双列集合

map接口

1、HashMap

HashMap的底层结构:

HashMap的遍历 

2、HashTable

3、TreeMap


1、数组导入:

容器---->数组:

一组数据类型相同的元素集合
创建数组时,必须给定长度,而且一旦创建长度不能变。
一旦数组装满元素,需要创建一个新的数组,将元素复制过去。
缺点:
如果我们从数组中间删除了一个元素或者添加一个元素,需要移动后面的元素。
如果数组装满了,超过了数组的最大长度,会创建新的数组将旧数组复制到新数组上。

java中为了解决数据存储单一的情况,提供了许多不同结构的集合类。让我们可以根据不同的场景进行数据存储选择。

 提供了数组实现的集合,链表实现的集合,哈希结构,树结构... 让iava程序员使用起来就非常方便。

2、单列集合

单例集合指的是:一次放进去一个值(对象)。集合实现Collection接口,定义了单例集合共有的方法。

List接口

特点:List类中可以有重复元素

1、ArrayList:数组列表

底层有一个数组,可以动态扩展数组的长度,并提供一个一系列方法操作。

特点:查询快, 中间增加、删除慢。

ArrayList类中的方法
arrayList.add()--->添加
arrayList.remove()---->删除
arrayList.get()----->获取指定位置上的元素
arrayList.indexOf()----->查找给定元素第一次出现的位置
arrayList.lastIndexOf()---->从后往前查找指定元素第一次出现的位置
arrayList.set(int index,E element)---->将指定位置上的元素替换并返回原来的值arrayList.clear()----->清空
arrayList.isEmpty()----->判断是否为空
arrayList.contains()----->判断是否包含指定元素
arrayList.size()----->返回集合中元素的个数

public class Demo3 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("d");
        arrayList.add("e");
        System.out.println(arrayList.remove("b"));//boolean类型,根据内容删除匹配的第一个元素,删除成功返网true,否则返回false
        System.out.println(arrayList.remove(1));//删除并返回指定位置的值
        System.out.println(arrayList.get(1));//获取指定位置上的元素
        System.out.println(arrayList.indexOf("d"));//查找第一次出现的位置
        System.out.println(arrayList.lastIndexOf("d"));//从后查找,第一次出现的位置
        System.out.println(arrayList.set(1, "v"));//将指定位置上的元素替换并返回原来的值
        arrayList.clear();
        System.out.println(arrayList.isEmpty());
        System.out.println(arrayList.contains("c"));//判断是否包含指定元素
        System.out.println(arrayList.size());//返回集合中元素的个数

        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));

        }
    }
}

2、LinkedList:链表列表

底层是一个链表结构。

特点:查询慢,增加、删除快

linkedList.add("a")---->向链表末尾添加元素
linkedList.add(2, "y")---->向链表指定的位置插入元素
linkedList.get(2)----->获取指定位置上的元素
linkedList.remove("y")----->删除
linkedList.remove(1)------>删除并返回指定元素的值
linkedList.removeFirst())----->删除第一个元素并返回其值
linkedList.pop()----->出栈
linkedList.clear()------>清空
linkedList.contains()----->判断是否包含指定元素
linkedList.isEmpty()----->判断是否为空
linkedList.size()----->返回集合中元素的个数

3、Vector:数组列表

特点:相对于ArrayList是线程安全的。其他与arraylist相似。、

4、list集合的遍历

1、for循环遍历

允许操作(删除)元素的.

(注意索引的变化与元素位置的移动)


public class List1 {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("r");

        System.out.println(arrayList);
        /*
        List 接口实现类/List集合遍历方式
         1、for循环遍历,允许操作(删除)元素的.
         注意索引的变化与元素位置的移动

         */
        for (int i = 0; i < arrayList.size(); i++) {
            if ("a".equals(arrayList.get(i))) {
                arrayList.remove("a");
                i--;
            }

        }
        System.out.println(arrayList);
    }
}
2、增强for循环

增强for循环遍历元素时, 不允许修改集合元素(删除,添加)


public class List2 {
    /*
    List接口实现类/List集合遍历
    方式2:增强for循环
    增强for循环遍历元素时,  不允许修改集合元素(删除,添加)
     */
    public static void main(String[] args) {
        ArrayList<String> arrayList=new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("r");
        for(String s:arrayList){
            //arrayList.remove("a");ConcurrentModificationException报错
            System.out.println(arrayList);
        }
        System.out.println(arrayList);
    }
}
3、迭代器遍历

迭代器只能对list接口下的实现类遍历


public class List3 {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("r");

        /*
        List接口实现类/List集合遍历
        方式3:使用迭代器遍历
        获得集合对象的选代器对象
         */
        Iterator<String> it = arrayList.iterator();
        while (it.hasNext()) {//判断数组是否遍历完成  0!=3,next,3==3,false结束
            String s = it.next();//获取到下一个元素
            if (s.equals("a")) {
                it.remove();//使用迭代器对象删除元素
            }
            System.out.println(arrayList);
        }
    }
}


//迭代器2
public class List4 {
    public static void main(String[] args) {
        ArrayList<String> arrayList=new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("f");
        arrayList.add("b");
        arrayList.add("g");
        System.out.println(arrayList);

        System.out.println("从指定位置往后遍历");
        ListIterator<String> listIterator=arrayList.listIterator(2);//
        while(listIterator.hasNext()){
            System.out.println(listIterator.next());
        }
        System.out.println("从(最后)后往前遍历");
        ListIterator<String> listIterator1=arrayList.listIterator(arrayList.size());//
        while (listIterator.hasPrevious()){

            System.out.println(listIterator.previous());
        }

    }
}

Set接口

特点:Set类中不能有重复元素

1、HashSet

无序的,通过hashCode和equals方法判断元素是否有序。
在添加元素时,是如何判断元素重复的:
     (当我们向集合中添加一个元素时,如果每次都使用equals()比较内容是否相等效率会很低)
因此该如何比较呢?
      先判断hashcode()值是否相等,如果相等,不一定内容相同,即此情况下会出现哈希冲突,再用equals()比较内容。
      在底层会先调用hashcode()-- 0bject中的hashcode()返回的是对象的地址(但是我们不调用这个) 我们需要:调用类中重写的Hashcode(),返回的是根据内容计算的哈希值
      遍历时,会用哈希值先比较是否相等,会提高比较的效率,
      但是哈希值会存在问题。内容不同,哈希相同
      此种情况下,再调用equals()比较内容,这样设计既提高判断效率,又保证安全。
   public static void main(String[] args) {
        HashSet<String> set=new HashSet<>();
        set.add(new String("asdfgdfgdfgsa"));
        set.add("bgbgbgghjdnbu");
        set.add("通话");
        set.add("重地");
        for(String s:set){
            System.out.println(set);
        }
    }

2、TreeSet

有序的,可以给Set集合中的元素进行指定方式的排序。存储的对象必须实现Comparable接口。
 可以给Set集合中的元素进行指定方式的排序。存储的对象必须实现Comparable接口。
特点: 
1、有序的
2、不能存储重复元素的
3、存储时可以根据值进行排序,底层使用了树形结构,树结构本身即是有序的
向树形结构中添加元素时,如何判断元素大小以及元素是否重复?
    向TreeSet中添加的元素类型,必须实现Comparable接口,重写compareTo方法
    每次添加元素时,调用compareTo()方法进行比较大小
   (第一个为根节点,比他大的在右边,比它小的在左边)
package A_集合单例.Set.TreeSet;

import java.util.Objects;

public class Student implements Comparable<Student> {
    private String name;
    private int num;

    public Student(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return getNum() == student.getNum() &&
                Objects.equals(getName(), student.getName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName(), getNum());
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        return this.num - o.num;
    }
}

package A_集合单例.Set.TreeSet;


import java.util.TreeSet;

public class StudentTest {
    public static void main(String[] args) {
        TreeSet<Student> treeSet=new TreeSet<>();
        Student s1=new Student("张三1",103);
        Student s2=new Student("张三2",101);
        Student s3=new Student("张三3",102);
        Student s4=new Student("张三4",104);
        treeSet.add(s1);
        treeSet.add(s2);
        treeSet.add(s3);
        treeSet.add(s4);

        System.out.println(treeSet);
    }

}

3、双列集合

map接口

map接口:

数据存储是(键:值)键值对的形式存储。
键不能重复的,(重复了覆盖原键),值可以重复
通过键可以找到值
一个键只能映射到一个值

1、HashMap

键是无序的,可以存储键为空,值为空的值。
{
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("a","ddd");
        map.put("b","eee");
        map.put("c","fff");
        map.put("e","ttt");
        map.put("a","dd");//向map中添加一组 键值对

        System.out.println(map.remove("b"));//删除指定的键值,返回对应的值
        map.clear();//清空键值对
        System.out.println(map.isEmpty());//判空
        System.out.println(map.containsKey("b"));
        System.out.println(map.containsValue("eee"));
        System.out.println(map.get("c"));
        System.out.println(map);
    }
}
HashMap的底层结构:
哈希表(数组)
链表
红黑树

对于HashMap详细的讲解可看,(讲解很清楚):https://blog.csdn.net/Wooo_e/article/details/136974366?spm=1001.2014.3001.5501

HashMap的遍历 

HashMap两种遍历方式:

1、根据键找值

2、利用map.Entry键值对的查找

package B_集合双列.hashmap;

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

public class Demo2 {
    /*
      1、用key计算哈希值
      static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    2、
     public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }
     */
    public static void main(String[] args) {
        HashMap<String,String> map=new HashMap<>();
        map.put("a","aa");
        map.put("b","bb");
        map.put("c","ccc");
        map.put(null,null);

        System.out.println(map);
        //map遍历
        //方式1、先拿到所有的键  遍历键  根据键找值
        Set<String> keyset = map.keySet();
        for(String s: keyset) {
            System.out.println(s + ":" + map.get(s));
        }
        //方式2、推荐的遍历
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for(Map.Entry entry:entries){
            System.out.println(entry.getKey()+":"+entry.getValue());
        }

    }
}

2、HashTable

HashTable的底层实现:
也是用到key的哈希值,计算位置,判断元素是否重复。
但是方法上都添加了synchronized锁
Hashtbale中不能存储为null的键和为null的值
package B_集合双列.hashtable;

import java.util.Hashtable;

public class Demo1 {
public static void main(String[] args) {
    Hashtable<String,String> hashtable=new Hashtable<>();
    hashtable.put("a","bb");
    hashtable.put("c","cc");
    hashtable.put("b","ff");
    hashtable.put("a","aa");
    //hashtable.put("d",null);//报错
    System.out.println(hashtable);
}
}

3、TreeMap

 TreeMap
     底层使用树形结构存储键值(红黑树)
     键可以排序
     键元素类型必须实现Comparable接口,重写compareTo()方法.

在TreeMap中,可以存储值为null,但是键不能为null。

package B_集合双列.TreeMap;

import java.util.TreeMap;

public class Demo1 {
    public static void main(String[] args) {
        TreeMap<Integer,String> treeMap=new TreeMap<>();
        treeMap.put(3,"aa");
        treeMap.put(2,"bb");
        treeMap.put(1,"ff");
        treeMap.put(4,"jj");
        treeMap.put(5,"oo");
        System.out.println(treeMap.get(3));
        System.out.println(treeMap.containsKey(2));
        System.out.println(treeMap.size());
        System.out.println(treeMap);
    }

}

持续更新ing........ 

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

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

相关文章

word-形状绘制、smartart、visio

一、人员架构图绘制 小技巧&#xff1a; 1、ctrlshift水平复制 2、点击图形&#xff0c;右键设置为默认形状 3、插入-形状-右键-锁定绘图模式&#xff0c;按esc退出状态 4、插入-形状-新建绘图画布&#xff0c;代替组合问题 画布中存在锚点&#xff0c;便于直线连接 二、s…

LP-MSPM03507学习资料汇总

&#xff08;因对MSPM0研究不够深入&#xff0c;故暂不开启浏览权限&#xff0c;权当记录学习。但愿尽快掌握供大家免费阅读。有意者可私信我共同学习&#xff09; 一、延时函数 1、滴答定时器SYSTICK 1.1 SysConfig配置 配置1ms延时函数&#xff0c;并开启中断 1.2 编写延时…

Day21:Leetcode513.找树左下角的值 +112. 路径总和 113.路径总和ii + 106.从中序与后序遍历序列构造二叉树

LeetCode&#xff1a;513.找树左下角的值 解决方案&#xff1a; 1.思路 在遍历一个节点时&#xff0c;需要先把它的非空右子节点放入队列&#xff0c;然后再把它的非空左子节点放入队列&#xff0c;这样才能保证从右到左遍历每一层的节点。广度优先搜索所遍历的最后一个节点…

php基础笔记

开端&#xff1a; PHP 脚本可以放在文本的任意位置 PHP 脚本以 开始&#xff0c;以 ?>** 结束&#xff1a; PHP 文件的默认文件扩展名是 ".php" 标签替换 <? echo 123;?> //short_open_tagson 默认开启 <?(表达式)?> 等价于 <?php echo …

Servlet 的 API

HttpServlet init&#xff1a;当 tomcat 收到了 /hello 这样的路径是请求后就会调用 HelloServlet&#xff0c;于是就需要对 HelloServlet 进行实例化&#xff08;只实例一次&#xff0c;后续再有请求也不实例了&#xff09;。 destory&#xff1a;如果是通过 smart tomcat 的停…

基础常用动词,柯桥西班牙语培训

1. Ser&#xff1a;是 表示身份: Soy Ana. Soy estudiante. 我是安娜。我是一名学生。 表示属性: Es duro. 这是硬的。 表示国籍: Soy espaol, de Madrid. 我是西班牙人&#xff0c;来自马德里。 2. Estar: 是..., 在... 表示身体状况: Estoy muy cansada, necesito dormir.我很…

springboot3项目练习详细步骤(第四部分:文件上传、登录优化、多环境开发)

目录 本地文件上传 接口文档 业务实现 登录优化 SpringBoot集成redis 实现令牌主动失效机制 多环境开发 本地文件上传 接口文档 业务实现 创建FileUploadController类并编写请求方法 RestController public class FileUploadController {PostMapping("/upload&…

英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富

在数据呈现指数级增长的今天&#xff0c;越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长&#xff0c;对智能算力的需求也不断增强。为应对新的市场趋势&#xff0c;英码科技凭借自身的硬件研发优势&#xff0c;携手算能相继推出了基于BM1684的边缘计算盒…

uniappx 应用未读角标插件(完善推送、通知、消息效果) Ba-Shortcut-Badge-U

简介&#xff08;下载地址&#xff09; Ba-Shortcut-Badge-U 是设置应用未读角标的原生插件&#xff0c;UTS版本&#xff08;同时支持uniapp和uniappx&#xff09; 支持设置未读、清空未读支持机型有Huawei、oppo、xiaomi、Samsung、Sony、LG、HTC、ZUK、ASUS、ADW、APEX、NO…

如何使用Matlab进行三角剖分(自定义函数实现delaunayTriangulation 使用Bowyer-Watson 算法)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Delaunay三角形 二、使用步骤 1.Bowyer-Watson算法 2.算法步骤 三、动画演示 四、核心代码 五、对比matlab自带函数和我们的算法&#xff1a; 总结 前…

【C++】学习笔记——二叉搜索树

文章目录 十四、二叉搜索树1. 二叉搜索树的概念2. 二叉搜索树的实现查找插入中序遍历删除拷贝构造析构函数赋值重载完整代码 3. 二叉搜索树的应用K搜索模型KV搜索模型 未完待续 十四、二叉搜索树 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&…

BUUCTF---misc---[MRCTF2020]ezmisc

1、附件下载后是一张图片 2、查看属性&#xff0c;winhex分析&#xff0c;没发现什么 3、在kali中binwalk和foremost也没找到什么信息 4、用stegsolve分析也没发现什么 5、这里几乎常见的misc方法都试过了&#xff0c;还是没有发现什么 6、回归到图片本身&#xff0c;想到的…

正心归一、绽放真我 好普集团正一生命文化艺术大赛(中老年赛区)正式启动

为进一步弘扬社会主义核心价值观&#xff0c;弘扬生命文化&#xff0c;提升公众对生命价值的认识与尊重&#xff0c;同时展现中老年艺术家的创作才华&#xff0c;激发广大中老年朋友的艺术热情和创造力。好普集团主办&#xff0c;幸福金龄会与正一生命科学研究&#xff08;广州…

CSS单行、同行文本左右对齐

再项目需求中&#xff0c;UI小姐姐常常要考虑项目的排版样式更简洁高级&#xff0c;常常会在项目设置内容或者字体两端对齐的效果&#xff0c;比如&#xff0c;在做表单时我们经常遇到让上下两个字段对齐的情况&#xff0c;比如姓名&#xff0c; 手机号码&#xff0c; 出生地等…

分布式音乐播放器适配了Stage模型

OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;应用开发自API 8及其更早版本一直使用的是FA模型进行开发。FA模型是Feature Ability的缩写&#xff0c;它和PA&#xff08;Particle Ability&#xff09;两种类型是过往长期推广的术语&#xff0c;深入人心…

flannel详细介绍

一、前言 Flannel 是一个简单、高效的容器网络解决方案&#xff0c;适用于需要在多个主机上运行容器的场景。它通过虚拟网络技术和 IP 地址管理来实现容器之间的通信和跨主机连接&#xff0c;为容器平台提供了可靠的网络基础设施&#xff0c;flannel有三种模式&#xff0c;分别…

【OceanBase诊断调优】—— 直连普通租户时遇到报错:Tenant not in this server

本文介绍了直连 OceanBase 数据库中的普通租户时&#xff0c;出现报错&#xff1a;ERROR 5150 (HY000) : Tenant not in this server 的处理方法。 问题描述 在 n-n 或者 n-n-n (n>1) 的部署架构中&#xff0c;使用 2881 端口 直连 OceanBase 集群的普通租户&#xff0c;可…

Vue2基础及其进阶面试(一)

简单版项目初始化 新建一个vue2 官网文档&#xff1a;介绍 — Vue.js 先确保下载了vue的脚手架 npm install -g vue-cli npm install -g vue/cli --force vue -V 创建项目 vue create 自己起个名字 选择自己选择特性 选择&#xff1a; Babel&#xff1a;他可以将我们写…

华院计算 | 简单而复杂的“生命游戏”

人类是社会动物&#xff0c;而人类的社会活动则既简单又复杂。长期以来&#xff0c;数学家、计算机科学家和社会学家们一直试图用简单明了的方式方法去刻画错综复杂的社会现象&#xff0c;其中“生命游戏”提供了一个“寓科学于娱乐”的活动框架。 【一】导引 让我们先来玩一…

接口自动化测试Requests库实战超细详解

一、requests库 Requests is an elegant and simple HTTP library for Python, built for human beings. Requests库就是一个使用Python语言发送HTTP请求的一个类库。 github地址&#xff1a;GitHub - psf/requests: A simple, yet elegant, HTTP library. 中文地址&#xff…