当前位置: 首页 > news >正文

Java集合基础知识总结(绝对经典)

List接口继承了Collection接口,定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。

实际上有两种list:一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是快速随机访问设计的,而是具有更通用的方法。

  • List : 次序是List最重要的特点:它保证维护元素特定的顺序。

  • ArrayList : 由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。

  • LinkedList : 对顺序访问进行了优化,向List中间插入与删除的开销并不大,随机访问则相对较慢。还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

  • Vector:实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象Vector是 需要zi料+ 绿色徽【vip1024b】

唯一的同步容器类!!

  • stack:这个类从vector派生而来,并增加了方法实现栈,一种后进先出的存储结构。

List的用法示例:

package collection;

import java.util.*;

public class SetExample {

public static void main(String[] args) {

List linkedList = new LinkedList();

for (int i = 0; i <= 5; i++) {

linkedList.add(“a”+i);

}

System.out.println(linkedList);

linkedList.add(3,“a100”);

System.out.println(linkedList);

linkedList.set(6,“a200”);

System.out.println(linkedList);

System.out.println(linkedList.get(2));

System.out.println(linkedList.indexOf(“a3”));

linkedList.remove(1);

System.out.println(linkedList);

}

}

六、list和set对比


Set子接口:无序,不允许重复,检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

List子接口:有序,可以有重复元素,和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

Set和List具体子类:

Set

|————HashSet:以哈希表的形式存放元素,插入删除速度很快。

List

|————ArrayList:动态数组

|————LinkedList:链表、队列、堆栈。

七、map


1、map接口不是Collection接口的继承。

不重复的键到值的映射。

2、Map.Entry 接口

map的entrySet()方法返回一个实现map.entry接口的对象集合。集合中每个对象都是底层map中一个特定的键值对。

3、HashMap 类和 TreeMap 类

在map中插入、删除和定位元素,HashMap是最好的选择。但如果您要按顺序遍历键,那么TreeMap 会更好。根据集合大小,先把元素添加HashMap,再把这种映射转换成一个用于有序键遍历的TreeMap 可能更快。

为了优化hashmap空间的使用,您可以调优初始容量和负载因子。这个treeMap没有调优选项,因为该树总处于平衡状态。

  • hashtable:实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类时前面Java实现的一个继承,并且通常能在实现映象的其它类中更好地使用。

  • hashmap:实现一个映象,运行存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个空)。

  • WeakHashMap:如果有一个键对于一个对象而言不再被引用,键将被舍弃,WeakHashMap在具有大量数据时使用。

  • TreeMap: 实现这样一个映象,对象是按键升序排列的。

4、map的使用示例

以下程序演示了具体map类的使用。该程序对自命令行传递的词进行频率计数。hashmap起初用于数据存储。后来,映射被转换为TreeMap以显示有序的键列列表。

package collection;

import java.util.Collections;

import java.util.HashMap;

import java.util.Map;

import java.util.TreeMap;

public class MapExample {

public static void main(String[] args) {

String[] array = {“a”,“b”,“c”,“d”,“e”};

Map map = new HashMap();

Integer ONE = new Integer(1);

for (int i=0, n=array.length; i<n; i++) {

String key = array[i];

int frequency = i+1;

map.put(key, frequency);

}

System.out.println(map);

Map sortedMap = new TreeMap(map);

System.out.println(sortedMap);

//hashmap的同步

Map map1 = Collections.synchronizedMap(map);

System.out.println(map1);

}

}

5、控制台输出

八、HashMap、Hashtable、ConcurrentHashMap的原理与区别


1、HashTable

  1. 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化

  2. 初始size为11,扩容:newsize = olesize*2+1

  3. 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length

2、HashMap

(1)HashMap简介

  • 底层数组+链表实现,可以存储null键和null值,线程不安全

  • 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂

  • 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入

  • 插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)

  • 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀

  • 计算index方法:index = hash & (tab.length – 1)

(2)HashMap加载因子

  • 哈希冲突:若干Key的哈希值按数组大小取模后,如果落在同一个数组下标上,将组成一条Entry链,对Key的查找需要遍历Entry链上的每个元素执行equals()比较。

  • 加载因子:为了降低哈希冲突的概率,默认当HashMap中的键值对达到数组大小的75%时,即会触发扩容。因此,如果预估容量是100,即需要设定100/0.75=134的数组大小。

  • 空间换时间:如果希望加快Key查找的时间,还可以进一步降低加载因子,加大初始大小,以降低哈希冲突的概率。

(3)HashMap容量

HashMap和Hashtable都是用hash算法来决定其元素的存储,因此HashMap和Hashtable的hash表包含如下属性:

  • 容量(capacity):hash表中桶的数量

  • 初始化容量(initial capacity):创建hash表时桶的数量,HashMap允许在构造器中指定初始化容量

  • 尺寸(size):当前hash表中记录的数量

  • 负载因子(load factor):负载因子等于“size/capacity”。负载因子为0,表示空的hash表,0.5表示半满的散列表,依此类推。轻负载的散列表具有冲突少、适宜插入与查询的特点(但是使用Iterator迭代元素时比较慢)

除此之外,hash表里还有一个“负载极限”,“负载极限”是一个0~1的数值,“负载极限”决定了hash表的最大填满程度。当hash表中的负载因子达到指定的“负载极限”时,hash表会自动成倍地增加容量(桶的数量),并将原有的对象重新分配,放入新的桶内,这称为rehashing。

HashMap和Hashtable的构造器允许指定一个负载极限,HashMap和Hashtable默认的“负载极限”为0.75,这表明当该hash表的3/4已经被填满时,hash表会发生rehashing。

笔者福利

以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。

有了这个,面试踩雷?不存在的!

回馈粉丝,诚意满满!!!




,hash表会发生rehashing。

笔者福利

以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。

有了这个,面试踩雷?不存在的!

回馈粉丝,诚意满满!!!

[外链图片转存中…(img-GEgc3vXh-1710358195397)]
[外链图片转存中…(img-7u9zz3mh-1710358195398)]
[外链图片转存中…(img-s1kdbJeB-1710358195399)]
[外链图片转存中…(img-6cV4LgY7-1710358195399)]

相关文章:

Java集合基础知识总结(绝对经典)

List接口继承了Collection接口&#xff0c;定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理&#xff0c;还添加了面向位置的操作。 实际上有两种list&#xff1a;一种是基本的ArrayList&#xff0c;其优点在于随机访问元素&#xff0c;另一种是更强大的L…...

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量&#xff0c;或将一个普通变量导出为环境变量&#xff0c;并且在这个过程中&#xff0c;可以给该环境变量赋值。 下面…...

案例--某站视频爬取

众所周知&#xff0c;某站的视频是&#xff1a; 由视频和音频分开的。 所以我们进行获取&#xff0c;需要分别获得它的音频和视频数据&#xff0c;然后进行音视频合并。 这么多年了&#xff0c;某站还是老样子&#xff0c;只要加个防盗链就能绕过。&#xff08;防止403&#xf…...

清华把大模型用于城市规划,回龙观和大红门地区成研究对象

引言&#xff1a;参与式城市规划的新篇章 随着城市化的不断推进&#xff0c;传统的城市规划方法面临着越来越多的挑战。这些方法往往需要大量的时间和人力&#xff0c;且严重依赖于经验丰富的城市规划师。为了应对这些挑战&#xff0c;参与式城市规划应运而生&#xff0c;它强…...

Vue+SpringBoot打造创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…...

Web框架开发-Django简介

一、MVC和MTV模型 MVC 所谓MVC就是把web应用分为模型&#xff08;M&#xff09;&#xff0c;控制器&#xff08;C&#xff09;和视图&#xff08;V&#xff09;三层&#xff0c;他们之间以一种插件式的&#xff0c;松耦合的方式连接在一起&#xff0c;模型负责业务对象与数据库…...

VB播放器(动态服务器获取歌词)-183-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword183 VBASP vb动态从服务器读取歌词 VB asp交互 程序, 模式不一样, 与普通的MP3播放器不一样, 这个是可以实现歌词从服务器上查询功能的. 看好了在咨询 我可以給您演示 目  录 前  言 1 1 . 简述 2 1.1 开发…...

java-可变参数

可变参数是什么&#xff1f; 可变参数就是指传入的参数个数是可变的&#xff0c;不是固定的 为什么要可变参数&#xff1f; 当我们要传入大量的形参时&#xff0c;我们就可以用到可变参数了 定义格式 数据类型...变量名; 例如int ...a; 可变参数的细节&#xff1a; &…...

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…...

嵌入式学习39-程序创建数据库及查找

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开 数据库文件(创建一个数据库连接) 参数: filename: …...

科研三维模型高精度三维扫描服务3d逆向测绘建模工业产品抄数设计

三维抄数技术在科研三维模型的应用已经日益广泛&#xff0c;其高精度、高效率的特点使得科研工作者能够更快速、更准确地获取和分析数据。这一技术的核心在于通过专业的三维扫描仪对实物进行高精度测量&#xff0c;再将这些数据转化为三维数字模型&#xff0c;为后续的研究提供…...

【LeetCode热题100】141. 环形链表(链表)

一.题目要求 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…...

express+mysql+vue,从零搭建一个商城管理系统11--使用Sequelize

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、安装sequelize和mysql2二、修改config/db.js三、修改models/user.js&#xff0c;models/shop.js&#xff0c;models/goods.js四、新建dao/user.js&#xff0c;dao/shop.js&#xff0c;dao/goods.js五、修…...

霹雳学习笔记——6.1 ResNet网络结构、BN以及迁移学习

一、ResNet结构 ResNet是一个突破一千层的网络架构。主要是卷积层Conv和池化层的堆叠。但是普通的堆叠会使得错误率更高&#xff0c;如下图所述&#xff0c;这是因为会产生梯度消失/梯度爆炸等。&#xff08;梯度就是增量&#xff0c;有大小有方向&#xff09; 解决方法&#…...

Gitee的注册和代码提交(附有下载链接)

目录 一、Git的下载和安装二、安装图形化界面工具三、在Gitee上创建仓库四、如何把仓库开源五、Clone远程仓库到本地六、拷贝代码到本地的仓库七、Add-Commit-Push到远程仓库八、可能出现的问题8.1 建议在本地仓库直接创建项目8.2 第一次Push可能出现的问题8.3 怎么删除Gitee上…...

机器学习是什么?

机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;其主要目标是使计算机系统能够通过数据和经验来改进和学习&#xff0c;而无需明确地编程。在机器学习中&#xff0c;计算机系统会通过对大量数据进行学习和分析&#xff0c;从中发现模式和规律&#xff0c;…...

复盘-PPT

调整PPT编号起始页码在设计→幻灯片大小 设置所有以及文本项目符号 ## 打开母版&#xff0c;找到对应级别设置重置 当自动生成的smartart图形不符合预期时 1 2...

springcloud gateway网关动态配置限流

上一篇记录了gateway网关的基础功能和配置&#xff0c;并且使用了默认的限流功能。 springcloud gateway网关-CSDN博客 这里简单记录一下gateway网关集成mybatisPlus实现动态限流。gateway网关默认的限流方式各项限流参数都是在配置文件中配置&#xff0c;不够灵活&#xff0…...

在Linux/Ubuntu/Debian中使用windows应用程序/软件

Wine 是一个兼容层&#xff0c;允许你在类 Unix 操作系统&#xff08;包括 Ubuntu&#xff09;上运行 Windows 应用程序。 以下是在 Ubuntu 上安装和使用 Wine 的基本步骤&#xff1a; 在 Ubuntu 上安装 Wine&#xff1a; 更新软件包列表&#xff1a; 打开终端并运行以下命令以…...

idea Springboot 组卷管理系统LayUI框架开发mysql数据库web结构java编程计算机网页

一、源码特点 springboot 组卷管理系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整…...

JavaSec-SPEL - 表达式注入

简介 SPEL(Spring Expression Language)&#xff1a;SPEL是Spring表达式语言&#xff0c;允许在运行时动态查询和操作对象属性、调用方法等&#xff0c;类似于Struts2中的OGNL表达式。当参数未经过滤时&#xff0c;攻击者可以注入恶意的SPEL表达式&#xff0c;从而执行任意代码…...

8.axios Http网络请求库(1)

一句话总结 Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js&#xff0c;帮助你轻松发送请求、接收响应。 Axios is a Promise-based HTTP client for the browser and Node.js, making it easy to send requests and handle responses. &#x1…...

jenkins结合gitlab实现CI

Jenkins结合GitLab实现CI&#xff08;持续集成&#xff09; 持续集成&#xff08;Continuous Integration, CI&#xff09;是一种软件开发实践&#xff0c;开发者在代码提交后&#xff0c;系统会自动进行构建、测试&#xff0c;从而尽早发现问题。Jenkins和GitLab的结合可以高效…...

LeetCode--23.合并k个升序链表

解题思路&#xff1a; 1.获取信息&#xff1a; 给出了多个升序链表&#xff0c;要求合并成一个升序链表&#xff0c;返回首元结点 2.分析题目&#xff1a; 外面在21题的时候&#xff0c;讲了怎样合并两个升序链表为一个升序链表&#xff0c;不了解的&#xff0c;建议去看一下21…...

API管理是什么?API自动化测试怎么搭建?

目录 一、API管理是什么 &#xff08;一&#xff09;API管理的定义 &#xff08;二&#xff09;API管理的重要性 二、API管理的主要内容 &#xff08;一&#xff09;API设计 1. 遵循标准规范 2. 考虑可扩展性 3. 保证接口的易用性 &#xff08;二&#xff09;API开发 …...

设计模式-2 结构型模式

一、代理模式 1、举例 海外代购 2、代理基本结构图 3、静态代理 1、真实类实现一个接口&#xff0c;代理类也实现这个接口。 2、代理类通过真实对象调用真实类的方法。 4、静态代理和动态代理的区别 1、静态代理在编译时就已经实现了&#xff0c;编译完成后代理类是一个实际…...

C++编程——关于比较器的使用

注&#xff1a; 简单记录一下C里比较器的构建&#xff0c;常用于自定义 sort() 函数和优先队列的改写优先级。 简单构建比较器&#xff1a; sort() 函数&#xff1a; vector<int> arr;//(a, b) -> true : a < b //升序排列 bool compare(int a, int b) {retur…...

Elasticsearch的搜索流程描述

Elasticsearch 的搜索流程是一个结合 分布式查询、分片协同、结果聚合和排序 的复杂过程,其设计目标是在海量数据中实现快速检索和精准结果返回。以下是搜索流程的详细解析: 一、搜索流程总览 Elasticsearch 搜索流程示意图 (图源:Elastic 官方文档) 二、详细步骤解析 …...

​​TLV4062-Q1​​、TLV4082-Q1​​迟滞电压比较器应用笔记

文章目录 主要作用应用场景关键优势典型应用示意图TLV4062-Q1 和 TLV4082-Q1 的主要作用及应用场景如下: 主要作用 精密电压监测:是一款双通道、低功耗比较器,用于监测输入电压是否超过预设阈值。 集成高精度基准电压源(阈值精度1%),内置60mV迟滞功能,可避免因噪声导致的…...

『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)

目录 预览效果思路分析downloadTxt 方法readTxt 方法 完整代码总结 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 预览效果 思路分析 downloadTxt 方法 该方法主要完成两个任务&#xff1a; 下载 txt 文件&#xff1a;通…...