Java集合详解

集合详解

1、集合,也可以说是容器。由两大接口派生而来,一个是collection,主要用于存储单一元素;另一个是map接口,主要用于存储键值对。

Collection接口

在这里插入图片描述

Map接口

在这里插入图片描述

2、集合和数组

在之前我们保存多个数据可以使用数组,但是数组有很多不足,如:

  • 数组长度必须开始就要指定,一旦指定不能更改,无法扩容
  • 数组保存的必须是同一类型的元素
  • 使用数组进行增加和删除元素很麻烦(需要重新创建一个数组,然后将原数组的元素复制到新数组中)

集合和数组区别

共同点:其实都是存放数据的容器。

  • 数组不可变,集合可变;
  • 集合只能存放引用类型不能基本数据类型;
  • 数组一旦创建,每个元素的类型一样,而集合里头的元素的类型可变;
  • 集合重写了toString(),输出集合就是把集合的所有元素输出;数组没有重写toString(),输出数组是输出对象类型+地址哈希值;
  • 数组是有序(放进去和出来的顺序一致)可重复的;集合除了list外都是无序不重复的;
  • 集合通过接口创建对象(降低耦合性),数组通过类创建对象;
  • 集合无序,没办法通过下标查找元素,需要用迭代器才能找到元素 iterator;数组可以通过下标查找/遍历元素;

2、List

  • list:是有序(怎么进去怎么出来)可重复;

    有序的意思并不是说里面元素按照顺序排列,而是说添加进集合的顺序和输出顺序一致;

    List接口下有三个实现类:

    • ArrayList:“长度可变的一维数组”;底层是一维数组,但一维数组是不可变的,所以ArrayLost实现实际是:先创建一个一维数组,当集合一旦长度要发生变化,就会继续创建新的一维数组,这样达到“可变”的效果。

    • LinkedList:底层:双向链表。

    • Vector:底层和ArrayList一样也是一维数组。区别是Vector是线程安全的,效率较低,很少使用。

//集合需要通过接口创建对象,降低耦合性。用接口List接收
List list = new ArrayList();
//自动装箱。相当于 list.add(new Integer(5)),存储的还是引用类型。不能存储基本类型
list.add(5);  
list.add("one");
System.out.println(list);//集合复写了toString(),所以输出list地址会自动调用toString(),将集合中的每个元素都输出出来。按照输入的顺序输出,这就是有序
list.size(); //返回集合中的元素
list.remove("one");//删除集合中的某个元素

  

Collection的一些方法:

Collection c = new ArrayList();  //用父类接口类型变量指向子接口对象地址。父接口看不到子接口复写的方法(继承)
c.add(1);
Object o = new Object();
c.add(o);
System.out.println(c.size()); //输出集合中元素的个数
System.out.println(c);//输出集合c
System.out.println(c.contains(0));//判断集合中是否含有元素
//将集合转换成数组
Object[]objes = c.toArray();
for(int i = 0;i<objes.length-1;i++){
	System.out.println(objes[i]);
}


//清空集合
c.clear();

3、Set

  • Set:无序不可重复
    • HashSet:底层是hash表。equal()相同,是重复的;不相同才是合法元素;
Set set = new HashSet();
set.add(10);
set.add("aa");
System.out.println(set); //无序:输出的顺序和输入顺序无关

//遍历集合中每一个元素
//方法1:迭代器
Iterator itr = set.iterator();
while(itr.hahNext()){
  System.out.println(itr.next());
}
//方法2:增强for循环
for(Object o : set){
	System.out.println(o);
}
//增强for循环也可以在数组中使用,底层仍然是迭代器

//iterator实质就是可以自身迭代的集合

​ set接口下的子接口sortedSet的实现类TreeSet:可排序的set集合

SortedSet ss = new TreeSet();//这里不能用set或者collection接收,因为父类看不到子接口重写的方法,所以Set是不具备排序的功能,只能用SortedSet接收;TreeSet实现SortedSet接口

TreeSet的数据结构是一个二叉树,被存储元素实现了Comparable接口,实现了compareTo方法,TreeSet集中在添加元素时,默认会调用被存储元素的compareTo方法完成比较!这就是为什么TreeSet可以对元素进行排序的原因。

4、Map集合

1)类型:entry,map.entry

2)实现Map接口的子接口/类:

  • SortedMap—>TreeMap 中的key存储元素的特点是无序不可重复,但是可以按照元素的大小顺序自动排序,SortedMap中的key等同于SortedSet
  • Hashtable---->properties 属性类,也是以key-value的方式存储元素,但是key和value只能是字符串类型。
  • HashMap---->LinkedHashMap

Map中的key是无序不重复的,Map集合以键值对的方式存储元素。

5、HashMap

底层是哈希表:一维数组+单向链表。复写了hashcode和equals

在这里插入图片描述

实现原理:哈希表本质是一个数组,只不过这个数组中的每一个元素又是单向链表。

  • 添加/修改:

    map.put(a)-----首先调用重写的hashcode()方法,得到a的哈希地址,也就是对应在一维数组的下标位置。如图,a的hashcode为1,则在一维数组第一个位置插入。

    map.put(b)----首先先调用hashcode()方法,得到b的哈希地址,b.hashcode(),此时发现一维数组这个位置已经有了a,即b和a的哈希值相同,就会发生“哈希碰撞”。然后比较a和b的equals(),b.equals(a) ,如果为false,b节点就在a节点的位置下面连接,即a节点指向b节点。如果结果为true,就用新的value值替换原来的value值,即为修改操作。

  • 查找:map.get(b)------先找b的hashcode值,调用hashcode()方法,确认在一维数组的哪个位置,确定位置后,跟这个位置的每个节点的key进行equals()比较,b.equals(a)==false,b.equals(b)==true,这样就找到了

System.out.println(map);因为没有重写toString,所以输出的是对象类型+哈希地址;

6、负载因子

哈希表底层实际上就是一个数组,数组的每一个元素是一个单向链表。数组的每一个位置称为桶,桶的数量称为容量,如上图哈希表的容量就是4 。哈希表中元素(也就是单向链表)的个数称为大小size;

**负载因子=size(大小)/ capacity(容量) **

  • HashMap默认初始化容量为16,默认负载因子为0.75
  • 负载因子过大时,代表元素个数多,则碰撞次数会加大,查找效率低,空间利用率高;负载因子过小,元素个数少,插入时碰撞次数更少,效率高,但是空间利用率低;因此默认的负载因子是0.75
  • 碰撞次数小于5时采用链表,一旦超过8时就使用红黑树不再用链表了;而5~8之间是缓存带,既可以用采用链表也可以采用二叉树。

MapTest.java

import java.util.*;
public class MapTest
{
  public static void main(String[] args) 
{//1.创建Map集合,使用泛型
 //HashMap的默认初始化容量16
 //默认负载因子0.75
  Map<String,String> persons=new HashMap<String,String>();
 //2.存储键值对
 persons.put("1000","jack");
 persons.put("1001","jack");
 persons.put("1002","king");
 persons.put("1003","sun");
 persons.put("1002","cook");
//Map中的key是无序不可重复的,和HashSet相同。所以1002-cook其实是修改1002-king的value值
 //{1002=cook, 1000=jack, 1003=sun, 1001=jack}
 System.out.println(persons);
//3.取得键值对(entry)的个数
System.out.println(persons.size());//4
//4.判断集合中是否包含相应的key
System.out.println(persons.containsKey("1003"));//true
//5.判断集合中是否包含相应的value	
//因为Map中的key重复了,所以value采用的是覆盖,后面插入的覆盖之前的
System.out.println(persons.containsValue("king"));//false	
//6.通过key取得value
System.out.println(persons.get("1002"));//cook
//7.通过key删除键值对	
persons.remove("1002");
System.out.println(persons.size());	//3
//8.遍历Map:方法一:取得所有的key,输出Map的键值对,使用泛型。
//{1000=jack, 1003=sun, 1001=jack}
Set<String>keys=persons.keySet();
for(String key:keys)
  {String value=persons.get(key);
   System.out.println(key+"->"+value);
   }
System.out.println("***********************");
//9.遍历map:方法二:取得所有的entry,输出Map的键值对。
Set entrys=persons.entrySet();
 for(Object name:entrys)
  { Map.Entry entry=( Map.Entry)name;
   String key=(String)entry.getKey();
   String value=(String)entry.getValue();
System.out.println(key+":"+value);
   }

 //10.清空Map
 persons.clear();
 //11.判断该集合是否为空
System.out.println(persons.isEmpty());//true
 System.out.println(persons);
 }

}

7、遍历map

  • 方法一,把map的key都set到Set集合中,然后通过迭代器,把key遍历出来,通过key去get到value,从而将key和value都遍历出来
//把map的key都set到Set集合中
Set<String>keys = persons.keySet();
//增强for循环将key遍历出来,并通过key去得到value
for(String key:keys){
  String value = persons.get(key);
  System.out.println(key+"->"+value);
}

  • 方法二

获取所有的entry都放到set集合,然后迭代器迭代,通过entry直接get到key和value

//将entry放到set集合中,因为entry是包含key和value的
Set entrys=persons.entrySet();
//将entry遍历,从entry来获取key和value
 for(Object name:entrys)
  { Map.Entry entry=( Map.Entry)name;
   String key=(String)entry.getKey();
   String value=(String)entry.getValue();
System.out.println(key+":"+value);
   }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tcl常用命令备忘录-正则命令篇

正则表达式是一种用于匹配、查找、替换文本中特定模式的工具。在Tcl脚本中&#xff0c;可以使用正则表达式对字符串进行匹配、查找和替换。 regexp 语法&#xff1a; regexp ?选项? 正则表达式 字符串 ?变量1 变量2 ...? 其中&#xff0c;?选项?为可选项&#xff0c;…

Spring Security OAuth2授权原理、流程与源码解读

文章目录 前言AuthorizationServerConfigurerAdapter(身份认证服务配置适配器)OAuth2AuthorizationServerConfiguration(OAuth2授权服务配置) EnableAuthorizationServer(开启身份认证服务)AuthorizationServerEndpointsConfigurations身份认证服务站点配置类AuthorizationEndp…

Qt编写精美输入法(历时十年迭代/可换肤/支持Qt4/5/6/win/linux/mac/嵌入式等)

一、前言 大概是从2012年就开始研究用Qt写输入法&#xff0c;因为项目需要&#xff0c;嵌入式板子上&#xff0c;没有对应的输入法&#xff0c;当初使用过很多NVR&#xff0c;里面也是鼠标按下弹出输入法面板进行输入&#xff0c;可以切换数字和字母及中文&#xff0c;于是借鉴…

jmeter如何进行http压力测试

目录 前言&#xff1a; 1、添加线程组&#xff1a; 2、添加采样器&#xff1a; 3、添加监视器 压力测试知识说明 前言&#xff1a; JMeter是一个基于Java的开源压力测试工具&#xff0c;可用于评估Web应用程序的性能&#xff0c;包括HTTP、HTTPS、FTP、SOAP、Restful、JD…

Oracle-高版本SQL优化分析(bind mismatch)

背景: 接到用户报障说一套Oracle19c数据库近期出现insert语句执行变慢的情况&#xff0c;执行一次数据插入需要1秒的时间&#xff0c;而且问题发生的数据库是跑在一体机上面&#xff0c;数据插入正常不应该这么慢&#xff0c;需要分析插入慢的原因 问题: 数据库近期出现insert…

StarRocks 文章收集

StarRocks在58的实践 StarRocks在58的实践 - 墨天轮StarRocks在58的实践 --2022-06-08https://www.modb.pro/db/639611 StarRocks之系统架构 StarRocks之系统架构 - 墨天轮https://www.modb.pro/db/610300 StarRocks小规模集群部署最佳实践(1/2) 0016.S StarRocks小规模集…

2自由度并联仿生腿的制作

1. 运动功能说明 本文实例将实现2自由度并联仿生腿模组运动起来&#xff0c;模拟实现狗腿行走的动作。 2. 结构说明 2自由度并联仿生腿模组是由两个舵机驱动的&#xff0c;它的所有动作都将在两个舵机的配合运动下实现。 3. 运动原理说明 2自由度并联仿生腿模组运动的点位如下…

数据结构-各种树(二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树)

文章目录 二叉树二叉查找树平衡二叉树红黑树B树B树 二叉树 概念&#xff1a;二叉树&#xff08;binary tree&#xff09;是指树中节点的度不大于2的有序树&#xff0c;它是一种最简单且最重要的树。二叉树的递归定义为&#xff1a;二叉树是一棵空树&#xff0c;或者是一棵由一…

2023 年6月开发者调查统计结果——最流行的技术(1)

2023 年6月开发者调查统计结果——最流行的技术&#xff08;1&#xff09; 本文目录&#xff1a; 一、编程、脚本和标记语言 二、数据库 三、云平台 四、网络框架和技术 五、其他框架和库 六、其他工具 七、集成开发环境 八、异步工具 九、同步工具 ​十、操作系统 …

端午出行电脑没网怎么办?无线网卡解决网络问题

无线网卡是一种可以让电脑或其他设备通过无线信号连接网络的硬件设备&#xff0c;无线网卡有多种类型和接口&#xff0c;例如USB无线网卡&#xff0c;PCI-E无线网卡&#xff0c;PCMCIA无线网卡等。端午出行在即&#xff0c;不妨看看驱动人生准备的无线网卡攻略&#xff0c;让大…

基于Python的招聘信息可视化系统,附源码

文章目录 1 简介2 技术栈3 总体设计3.1 系统结构3.2 数据库设计3.2.1 数据库实体3.2.2 数据库表设计 4 运行设计4.1 招聘热门行业分析4.2热门岗位分析界面4.3招聘岗位学历分析界面4.4岗位分布分析界面 5 源码下载 1 简介 基于Python的招聘信息可视化系统,通过对招聘数据进行分…

MFC扩展库BCGControlBar Pro v33.5亮点 - Ribbon Bar等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.5已正式发布了&#xff0c;此版本包含了Ribbon&#xff08;功能区&#xff09;自定义…

Linux国产操作系统,UCA-系统工程师学习必备技能,使用dpkg管理软件包、apt命令、内网获取依赖包及源码安装

目录 ​编辑 1.使用dpkg管理软件包 2.apt命令 3.内网获取依赖包 4.源码安装 1.使用dpkg管理软件包 第一种方法当然可以上网搜索软件安装包&#xff0c;下载然后解压成软件。 第二种也就是我接下来要介绍的&#xff0c;dpkg 命令&#xff0c;dpkg 全称叫做debian package…

步长(stride) | 填充(padding) | 扩长(dilation)

这几个名词中文真的好难翻译&#xff0c;不是大佬就不要造名词了&#xff0c;后面还是老老实实用英文吧&#xff01;&#xff08;标题是机翻的 。&#xff09; stride stride 很好理解&#xff0c;stride 就是卷积核移动的步长。 如下图&#xff1a; stride1 stride2 paddi…

技术新动向 | 谷歌云大举扩展安全 AI 生态系统

【本文由 Cloud Ace 整理发布&#xff0c; Cloud Ace 是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件…

【设计模式】SpringBoot优雅使用策略模式

文章目录 1.概述1.1.简述策略模式 2.实现方法2.1.实现思路2.2.实现代码2.3.策略拓展2.4.执行调用 3.总结 1.概述 本篇文章主要会描述SpringBoot与策略模式的结合使用&#xff0c;因为不涉及到理论部分&#xff0c;所以在阅读本篇之前&#xff0c;需要对策略模式的理论已经有了…

HarmonyOS学习路之开发篇—Java UI框架(JS FA调用Java PA)

JS FA调用Java PA机制 使用兼容JS的类Web开发范式的方舟开发框架提供了JS FA&#xff08;Feature Ability&#xff09;调用Java PA&#xff08;Particle Ability&#xff09;的机制&#xff0c;该机制提供了一种通道来传递方法调用、处理数据返回以及订阅事件上。 当前提供Ab…

鼠标键盘实验

文章目录 USB参考资料USB设备STM32F407USB 硬件连接软件移植官方HIDSTM32F4USB通信库 USB参考资料 ①《STM32F4xx中文参考手册》-第30章 全速USB on-the-go(OTG_FS) ②光盘&#xff1a;STM32参考资料:STM32 USB 学习资料-CD00289278.pdf(UM1021) ③光盘&#xff1a;STM32参考资…

Python3 函数与数据结构 | 菜鸟教程(十一)

目录 一、Python3 函数 &#xff08;一&#xff09;定义一个函数 1、你可以定义一个由自己想要功能的函数&#xff0c;以下是简单的规则&#xff1a; 2、语法 3、实例 ①让我们使用函数来输出"Hello World&#xff01;"&#xff1a; ②更复杂点的应用&#xff…

【gcc, cmake, eigen, opencv,ubuntu】一.gcc介绍

文章目录 gcc介绍1.查看当前gcc 版本2.安装其他版本的gcc3.设置多个版本的优先级4.修改默认的版本5.查看cpu信息 gcc介绍 gcc介绍和makefile介绍 1.查看当前gcc 版本 gcc --version2.安装其他版本的gcc sudo apt install gcc-10 g-10这样我们电脑里包含gcc-9 和 gcc-10两个…