【java基础】集合

news2024/10/5 14:10:24

集合

集合类位于java.util 包下,集合类又被称为容器

与数组的区别

  • 数组的长度是固定的,集合的长度是可变的
  • 数组可以用来存放基本数据类型,集合存放引用类型,不能存放基本数据类型

如何选择

在这里插入图片描述
collection
在这里插入图片描述
map
在这里插入图片描述

黄色的是接口,蓝色的是实现类

接口名称作 用
Iterator 接口集合的输出接口,主要用于遍历输出(即迭代访问)Collection 集合中的元素,Iterator 对象被称之为迭代器。迭代器接口是集合接口的父接口,实现类实现 Collection 时就必须实现 Iterator 接口。
Collection 接口是 List、Set 和 Queue 的父接口,是存放一组单值的最大接口。所谓的单值是指集合中的每个元素都是一个对象。一般很少直接使用此接口直接操作。
Queue 接口Queue 是 Java 提供的队列实现,有点类似于 List。
Dueue 接口是 Queue 的一个子接口,为双向队列。
List 接口是最常用的接口。是有序集合,允许有相同的元素。使用 List 能够精确地控制每个元素插入的位置,用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,与数组类似。
Set 接口不能包含重复的元素。
Map 接口是存放一对值的最大接口,即接口中的每个元素都是一对,以 key➡value 的形式保存。

Collection

在这里插入图片描述
Set接口和List接口都继承了Collection接口
它们共同的方法有

方法名称说明
boolean add(E e)向集合中添加一个元素,如果集合对象被添加操作改变了,则返回 true。E 是元素的数据类型
boolean addAll(Collection c)向集合中添加集合 c 中的所有元素,如果集合对象被添加操作改变了,则返回 true。
void clear()清除集合中的所有元素,将集合长度变为 0。
boolean contains(Object o)判断集合中是否存在指定元素
boolean containsAll(Collection c)判断集合中是否包含集合 c 中的所有元素
boolean isEmpty()判断集合是否为空
Iterator iterator()返回一个 Iterator 对象,用于遍历集合中的元素
boolean remove(Object o)从集合中删除一个指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true。
boolean removeAll(Collection c)从集合中删除所有在集合 c 中出现的元素(相当于把调用该方法的集合减去集合 c)。如果该操作改变了调用该方法的集合,则该方法返回 true。
boolean retainAll(Collection c)从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合 c 的交集),如果该操作改变了调用该方法的集合,则该方法返回 true。
int size()返回集合中元素的个数
Object[] toArray()把集合转换为一个数组,所有的集合元素变成对应的数组元素。

在这里插入图片描述

package com.collection;

import java.util.ArrayList;

//import java.util.Map;

//import java.util.Collection;

public class Collection_ {

    public static void main(String[] args) {

        ArrayList arrayList = new ArrayList();

        //添加元素,add(Object )

        arrayList.add("huhu");

        arrayList.add(10);//add(new Integer(10))

        arrayList.add(true);

        System.out.println(arrayList);//[huhu, 10, true]

        //删除元素,remove()

//        arrayList.remove("huhu");

//        System.out.println(arrayList);//[10, true]

//        arrayList.remove(1);//可以传入索引值

//        System.out.println(arrayList);//[10]

        //查找元素是否存在,包含

        boolean b=arrayList.contains("huhu");

        System.out.println(b);//true

        //元素的个数

        System.out.println(arrayList.size());//3

        //判断集合是否为空

        System.out.println(arrayList.isEmpty());//False

        //清空

        arrayList.clear();

        System.out.println(arrayList);//[]

        //添加多个元素

        ArrayList list2=new ArrayList();

        list2.add("haha");

        list2.add("jiji");

        arrayList.addAll(list2);

        System.out.println(arrayList);

        //

    }

}

List

有序的,添加顺序和取出顺序一致,可以重复
在这里插入图片描述

后面是否有向上箭头Collection,代表是否继承自Collection接口

ArrayList

  • get(index),索引是从0开始
  • 可以加入null ,并且可以加入多个 arraylist.add(null);
  • 底层是Object的数组
    • 使用无参构造器创建的对象的大小是10;使用指定大小的构造器,则初始化为指定大小
    • 如需扩容,扩容为原来的1.5倍
    • 参考视频:https://www.bilibili.com/video/BV1fh411y7R8?p=511&spm_id_from=pageDriver&vd_source=1fe29350b37642fa583f709b9ae44b35

    • 适合改查
  • 基本等同于Vector,但是线程不安全;在多线程的情况下不建议使用

Vector

底层也是一个数组,线程同步即线程安全
在这里插入图片描述

LinkedList

  • 底层实现了双向链表和双向队列的特点
  • 可以重复,包括null
  • 线程不安全,没有实现同步
  • 通常不会使用
    在这里插入图片描述

Set

在这里插入图片描述

  • HashSet无序,存储顺序和查询顺序是不一致的(但是取出的顺序是固定的,只有一种)
  • 没有索引,遍历方式没有索引
  • 不能重复
  • 最多只能有一个null

HashSet

import java.util.HashSet;

import java.util.Set;

public class Set_ {

    @SuppressWarnings({"all"})

    public static void main(String[] args) {

        Set set= new HashSet();

        System.out.println(set.add("jiji"));//true

        System.out.println(set.add("haha"));//true

        System.out.println(set.add("huhu"));//true

        System.out.println(set.add("jiji"));//false

        set.remove("jiji");

        System.out.println(set);//[haha, huhu]

        set =new HashSet();

        System.out.println(set.add(new Dog("tom")));//true

        System.out.println(set.add(new Dog("tom")));//true

        System.out.println(set);//[Dog{name='tom'}, Dog{name='tom'}]

        set =new HashSet();

        System.out.println(set.add(new String("haha")));//true

        System.out.println(set.add(new String("haha")));//false

        System.out.println(set);//[haha]

    }

}

class  Dog{

    private String name;

    public Dog(String name) {

        this.name = name;

    }

    @Override

    public String toString() {

        return "Dog{" +

                "name='" + name + '\'' +

                '}';

    }

}

Hashset的底层就是HahMap
数组+链表+红黑树
在这里插入图片描述
扩容

当链表到达8之后,但是table表没到64之前,会把数据继续加到链表后面,同时进行table数组扩容

在这里插入图片描述

LinkedHashSet

  • LinkedHashSet是HashSet的子类
  • Linkedhashset底层是个 Linkedhashmap,底层维护了一个数组+双向链表
  • Linkedhashset根据元素的 hashcode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的
  • Linkedhashset不允许添重复元素

TreeSet

TreeSet底层是TreeMap

想让TreeSet排序,在创建TreeSet的时候传给它一个Comapretor
不传,就采用默认排序,但是存储的内容要可比较,即同一类型

当传入的两个key经过比较相同时,key不会变,value会变

TreeSet<Object> set = new TreeSet<>();
        set.add("bb");
//        set.add(1);//报错
        set.add("aa");
        set.add("cc");
        for (Object o : set) {
            System.out.println(o);
        }
        TreeSet set2 = new TreeSet<>(
                new Comparator() {
                    @Override
                    public int compare(Object o1,Object o2){
                        return ((String)o2).compareTo((String) o1);
                    }
                }
        );
        set2.add("bb");
        set2.add("aa");
        set2.add("cc");
        for (Object o : set2) {
            System.out.println(o);
        }

Iterator

遍历方式(3种)

package com.collection;

import java.util.ArrayList;

import java.util.Iterator;

//import java.util.Map;

//import java.util.Collection;

public class Collection_ {

    public static void main(String[] args) {

        ArrayList arrayList = new ArrayList();

        arrayList.add("huhu");

        arrayList.add(10);//add(new Integer(10))

        arrayList.add(true);

        //遍历数组的迭代器

        Iterator iterator = arrayList.iterator();

        while(iterator.hasNext()){//需要先判断是否有下一个元素

            Object next = iterator.next();

            System.out.println(next);

        }

        //当迭代器指向最后一个元素后,若想再次遍历要重置迭代器

        iterator =arrayList.iterator();

        while (iterator.hasNext()) {

            Object next =  iterator.next();

            System.out.println(next);

        }

        //foreach 的增强循环

        for (Object a:

             arrayList) {

            System.out.println(a);

        }

//for循环

for (int i = 0; i < arrayList.size(); i++) {

    System.out.println(arrayList.get(i));

}

    }

}

Map

在这里插入图片描述

  • 保存具有映射关系的数据,key-value(双列关系)

常用集合
HashMap,HashTable,Properties
在这里插入图片描述

常用方法

HashMap hashmap=new HashMap();

hashmap.put("no1","haha");

hashmap.put("no2","jiji");

//hashmap的key不能重复,可以为null,但只能有一个;无序

hashmap.put("no2","mama");//替换机制

//value可以重复,可以为null,可以有多个

hashmap.put("no3","haha");

hashmap.put(null,null);

//get传入key可以得到value

System.out.println(hashmap.get("no2"));

//remove

hashmap.remove("no1");

//size

System.out.println(hashmap.size());

//isEmpty

System.out.println(hashmap.isEmpty());

//clear

hashmap.clear();

//containsKey

hashmap.containsKey("no8");//false

System.out.println(hashmap);

遍历

EntrySet ,keySet,Values中都是保存的地址 为了方便遍历

KeySet只是建立了一个对于HashMapNode中key的引用,其他类似
Map.Entry是一个内部接口,HashMapNode实现了它

package com.map_;

import com.sun.media.sound.RIFFInvalidFormatException;

import java.util.*;

public class method_ {

    @SuppressWarnings({"all"})

    public static void main(String[] args) {

        HashMap hashmap=new HashMap();

        hashmap.put("no1","haha");

        hashmap.put("no2","jiji");

        hashmap.put("no3","haha");

        //第一组:遍历所有的 key

        Set keySet = hashmap.keySet();

        //(1) for增强循环

        for (Object key:

             keySet) {

            System.out.println(hashmap.get(key));

        }

       //(2) 迭代器

        Iterator iterator = keySet.iterator();

        while (iterator.hasNext()) {

            Object next =  iterator.next();

            System.out.println(hashmap.get(next));

        }

        //第二组: 遍历value

        Collection values = hashmap.values();

        //(1) for增强

        for (Object value:

             values) {

            System.out.println(value);

        }

        //(2)迭代器

        Iterator iterator1 = values.iterator();

        while (iterator1.hasNext()) {

            Object next =  iterator1.next();

            System.out.println(next);

        }

        //第三组: EntrySet 来获取kv

        Set set = hashmap.entrySet();

        //(1) for增强

        for (Object entry:

             set) {

            Map.Entry me=(Map.Entry)entry;//向下转型

            //只有Map.Entry 是public ,想要使用getkey() 必须转换成Map.Entry

            System.out.println(me.getKey());

            System.out.println(me.getValue());

            System.out.println(entry);

        }

        //(2) 迭代器

        Iterator iterator2 = set.iterator();

        while (iterator2.hasNext()) {

            Object next =  iterator2.next();

            Map.Entry me=(Map.Entry)next;//向下转型

            System.out.println(((Map.Entry<?, ?>) next).getKey());

            System.out.println(me.getValue());

            System.out.println(next);

        }

    }

}

HashMap

  • key不能重复,value可以重复
  • 允许使用null键和null值
  • 如果添加相同的key,则会覆盖原来的;等同于修改,key不变,value变
  • 底层是Hash表,不能保证映射的顺序
  • 线程不安全
  • key和value可以保存任意类型的数据,会保存在HashMap$Node中、key常用字符串

对于HashSet,底层就是HashMap,key就是值,Value是一个常量

HashTable

在这里插入图片描述
对比
在这里插入图片描述

Properties

  • Properties类继承自 Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保有数据。
  • 他的使用特点和 Hashtable类似
  • Properties还可以用于从xw. properties文件中,加数据到 Properties类对象并进行读和修改
  • key不能为null

工作后xx. properties文件通常作为配置文件

 Properties properties = new Properties();//创建对象
        // 加载配置文件
        properties.load(new FileReader("D:\\IDEA_file\\Learn_8\\src\\file\\mysql.properties"));
        //或者new
        properties.put("name","gao");
        properties.remove("name");
        //把k-v显示到控制台
        properties.list(System.out);
        String myuser=properties.getProperty("user");
        String mypsd=properties.getProperty("password");
        System.out.println(mypsd);
        //如果该文件没有该键值对,就创建,有就修改
        properties.setProperty("user2","tom");
        //指定存储位置
        properties.store(new FileWriter("D:\\IDEA_file\\Learn_8\\src\\file\\mysql.properties"),null);

mysql.properties

#Thu Feb 24 23:00:28 CST 2022
user=root
password=19790116
user2=tom
ip=192.168.200.1

工具类

java.util.collections
有许多静态方法

ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("cc");
        list.add("aa");
        list.add("dd");
        for (Object o : list) {
            System.out.print(o+",");
        }
        System.out.println();
        //反转
        Collections.reverse(list);
        for (Object o : list) {
            System.out.print(o+",");
        }
        System.out.println();
        //排序
        Collections.sort(list);//等价于 list.sort(String::compareTo);
        for (Object o : list) {
            System.out.print(o+",");
        }
        System.out.println();
        //统计频率
        int count = Collections.frequency(list, "aa");
        System.out.println(count);
        //打乱
        Collections.shuffle(list);
        for (Object o : list) {
            System.out.print(o+",");
        }
        System.out.println();
        //交换
        Collections.swap(list,0,1);
        for (Object o : list) {
            System.out.print(o+",");
        }
        System.out.println();
        //最大值
        String max = Collections.max(list);
        System.out.println(max);
        //复制
        //替换

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

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

相关文章

1.计算机基础-操作系统面试题—计算机系统概述、进程管理

本文目录如下&#xff1a;计算机基础-操作系统 面试题一、计算机系统概述CPU 内核态 和 用户态 的区别&#xff1f;从 用户态 切换到 内核态 的常见方法&#xff1a;二、进程管理线程 和 进程 的区别&#xff1f;协程 (goroutine) 和 线程的区别?进程有哪些状态&#xff1f;进…

day11_类中成员之变量

通过以前的学习&#xff0c;我们知道了成员变量是类的重要组成部分。对象的属性以变量形式存在&#xff0c;下面我们就来详解的学习一下类中的变量 成员变量 成员变量的分类 实例变量&#xff1a;没有static修饰&#xff0c;也叫对象属性&#xff0c;属于某个对象的&#xf…

Transformer位置编码图解

在语言中&#xff0c;单词的顺序及其在句子中的位置非常重要。 如果重新排列单词&#xff0c;整个句子的意思可能会发生变化。 在实施 NLP 解决方案时&#xff0c;循环神经网络具有处理序列顺序的内置机制。 然而&#xff0c;transformer 模型不使用递归或卷积&#xff0c;而是…

面试(七)为什么一般希望将析构函数定义为虚函数

class B { public:~B() // 基类析构函数不为虚函数{cout << "B::~B()" << endl;} };class D : public B { public:~D(){cout << "D::~D()" << endl;} };void Test(B* t) {delete t;t nullptr; }int main() {B *pb new B;Test…

TCP/IP网络编程——I/O 复用

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 12 章 I/O 复用12.1 基于 I/O 复用的服务器端12.1.1 多进程服务端的缺点和解决方法12.1.2 理解复用12.1.3 复用技术在服务器端的应用12.2 理解 select 函数并实现服务端12.2.1 select 函数的功能和调用顺序1…

anaconda下pytorchCPU GUP安装及问题记录

1 pytorch安装&#xff08;CPU版本&#xff09; pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2 torchvision、torchaudio、torchtext安装&#xff1a;解决ModuleNotFoundError: No module named ‘torchvision‘问题 &#xff08…

用“AI“挑选一件智慧礼物

在久违的烟火气回归之际&#xff0c;充满希望的生活可能就从精心挑选一件新年礼物开始。在罗列礼品清单时&#xff0c;你会想到 “数据”也是其中之一吗&#xff1f;事实上&#xff0c;几乎所有时下最受欢迎的带有“智能”一词的设备&#xff0c;都是由大量高质量的数据创建。我…

面试必问的CAS,你懂多少?

目录一.什么是CAS&#xff1f;二.CAS实现过程三.CAS的缺点1.循环时间长2.只能保证一个共享变量是原子操作3.ABA问题和解决方法四.拓展题1.i和i是原子性操作吗&#xff1f;2. i 不加lock和synchronized怎么保证原子性&#xff1f;一.什么是CAS&#xff1f; CAS(Compare And Swa…

uboot源码结构、配置、编译和移植

目录 一、uboot源码结构 1.1 uboot源码获取 1.2 uboot的特点 1.3 uboot源码结构 二、uboot配置与编译 2.1uboot配置 2.2 uboot编译 三、uboot移植 3.1添加board信息 3.2再次配置和编译 3.3添加三星加密引导程序 3.4添加调制代码&#xff08;点灯法&#xff09; 3.…

CMMI-结项管理

结项管理&#xff08;ProjectClosing Management, PCM&#xff09;是指在项目开发工作结束后&#xff0c;对项目的有形资产和无形资产进行清算&#xff1b;对项目进行综合评估&#xff1b;总结经验教训等。结项管理过程域是SPP模型的重要组成部分。本规范阐述了结项管理的规程&…

绘图软件推荐——Diagram Designer

目录 Diagram Designer安装 软件下载 软件图标 Diagram Designer应用 新建页面 工具栏简介 绘制多边形 创建并添加图形模板 图像导出 Diagram Designer安装 软件下载 在腾讯管家&#xff0c;软件管理中 &#xff0c;搜索 Diagram Designer 即可下载软件图标 Diagram Des…

lio-sam学习笔记(三)

前言&#xff1a; 对于lio-sam前端中图像投影和特征提取部分的学习。 一、imageProjection.cpp main函数&#xff1a; int main(int argc, char** argv) {ros::init(argc, argv, "lio_sam");ImageProjection IP;ROS_INFO("\033[1;32m----> Image Project…

训练营day17

110.平衡二叉树 力扣题目链接 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true 。 示…

GIS矢量图形多边形地块行政区发光,阴影发光特效实现

先来看下效果: 其实做到发光效果我们必须明白两件事: 1.必须有亮色作为发光色 2.必须有暗色作为衬托色 二者缺一不可 如果你仅仅用了亮色,那么效果是这样的: 注意哦,我使用的是同一个颜色哦,为什么这一次看起来就不是发光呢? 原因很简单,第二幅图我没有加衬托色 ,…

Java基础常见面试题(一)

基础概念与常识 Java 语言有哪些特点? 简单易学&#xff1b;面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff0c;平台无关性的具体表现在于&#xff0c;Java 是“一次编写&#xff0c;到处运行&#xff08;Write Once&…

手把手教你将Eureka升级Nacos注册中心

由于原有SpringCloud体系版本比较老&#xff0c;最初的注册中心使用的Eureka后期官方无升级方案&#xff0c;配置中心无法在线管理配置&#xff0c;还有实时上下线的问题&#xff0c;因此需要将原有系统的Eureka服务升级Nacos注册心服务。原有版本SpringBoot1.5.15、SpringClou…

Python序列类型之集合

&#x1f490;&#x1f490;&#x1f490;欢迎来到小十一的博客&#xff01;&#xff01;&#xff01; &#x1f3af;博客主页&#xff1a;&#x1f3af;程序员小十一的博客 &#x1f680;博客专栏&#xff1a;&#x1f680;Python入门基础语法 &#x1f337;欢迎关注&#xff…

github报错Key is invalid. You must supply a key in OpenSSH public key format

原因&#xff1a;由于github官方提示 普通类型的ssh不安全&#xff0c;所以改成OpenSSH 解决办法 第一步&#xff1a;打开终端。粘贴下面的文本&#xff0c;替换为您的 GitHub 电子邮件地址。连续按回车键 ssh-keygen -t ed25519 -C "your_emailexample.com"第二步…

JavaWeb入门看这一篇文章就够了

第一章 JavaWeb简介 第1节 什么是web 1web&#xff08;World Wide Web&#xff09;即全球广域网&#xff0c;也称为万维网&#xff0c;它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务&#xff0c;为浏览者…

插入排序基本概念

插入排序基本概念1.插入排序1.1 基本概念1.2 插入排序执行步骤有1.3 对于5个元素的值步骤次数1.4 插入排序大O记法表示2. 将[4,2,7,1,3]进行插入排序 【实战】2.1 第一次轮回步骤2.2 第二次轮回步骤2.3 第三次轮回步骤2.4 第四次轮回步骤3.插入排序代码实现1.插入排序 1.1 基本…