学习-面试java基础-(集合)

news2024/11/15 17:41:37

String 为什么不可变?


1线程安全
2支持hash映射和缓存。因为String的hash值经常会使用到,比如作为 Map 的键,不可变的特性使得 hash 值也不会变,不需要重新计算。
3出于安全考虑。网络地址URL、文件路径path、密码通常情况下都是以String类型保存,
4.字符串常量池优化

String, StringBuffer 和 StringBuilder区别


1. 可变性String 不可变StringBuffer 和 StringBuilder 可变
2. 线程安全String 不可变,因此是线程安全的
StringBuilder 不是线程安全的  效率最高
StringBuffer 是线程安全的,内部使用 synchronized 进行同步

Java 反射是指在运行时获取和使用类的内部信息的能力。反射可以用来获取类的名称、方法、属性、构造方法等信息,也可以用来调用类的方法、设置属性的值等。 


Arraylist 和 Vector 的区别


*ArrayList在内存不够时扩容为原来的1.5倍,Vector是扩容为原来的2倍。
*Vector(淘汰1.2)属于线程安全级别的,但是大多数情况下不使用Vector,因为操作Vector效率比较低。
CopyOnWriteArrayList: 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.

HashMap和HashTable的区别?


*HashMap和Hashtable都实现了Map接口。
*HashMap可以接受为null的key和value,key为null的键值对放在下标为0的头结点的链表中,而Hashtable则不行。
*HashMap是非线程安全的,HashTable是线程安全的。Jdk1.5提供了ConcurrentHashMap,它是HashTable的替代。
*Hashtable很多方法是同步方法,在单线程环境下它比HashMap要慢。
*哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

LinkedHashMap是*HashMap的子类 非线程安全

TreeMap是有序的key-value集合,通过红黑树实现。根据键的自然顺序进行排序或根据提供的Comparator进行排序


        HashMap、    HashTable、  LinkedHashMap    TreeMap区别
       非线程安全   | 线程安全    | 非线程安全              | 非线程安全
       无序  | 按照键的插入顺序 | 按照键的插入顺序 | 按照键的升序或降序 
扩容:根据负载因子 | 固定的 | 根据负载因子 | 固定的 |
 性能   | 高 | 低 | 高 | 低 | 

Con cu rrentHashMap 高效线程安全  替代HashMap、 性能低一点点

扩容:
固定:简单粗暴 浪费空间
负载因子:合理利用空间 ,加强并发 动态适应 0.72

ConcurrentHashMap理解

ConcurrentHashMap是Java中的线程安全的哈希表实现,它是HashMap的线程安全版本。ConcurrentHashMap具有以下特点和原理:
 1. 线程安全性:ConcurrentHashMap使用了锁分段技术,将整个哈希表分成多个段(Segment),每个段都有自己的锁。这样不同的线程可以同时访问不同的段,提高了并发性能。相比于使用全局锁的方式,ConcurrentHashMap能够支持更高的并发度。
 2. 分段锁:ConcurrentHashMap中的每个段都是一个独立的哈希表,具有自己的锁。当一个线程对某个段进行操作时,只需获取该段的锁,而不会影响其他段的访问。这样可以减小锁的粒度,提高并发性能。
 3. 原子操作:ConcurrentHashMap中的一些操作是原子的,比如putIfAbsent、remove、replace等。这些操作可以保证在多线程环境下的原子性,避免了竞态条件。
 4. 读操作的无锁优化:ConcurrentHashMap在读操作上进行了优化,读操作不需要获取锁。这样可以实现读写分离,提高并发性能。
 5. 扩容机制:ConcurrentHashMap在扩容时,只需对部分段进行扩容,而不是整个哈希表。这样可以减小扩容的开销和影响。
 总的来说,ConcurrentHashMap通过分段锁和一些优化措施,实现了高效的线程安全哈希表。它适用于多线程环境下的高并发操作,能够提供较好的性能和可靠性。



集合学习

list单列集合,map双列集合

list系列集合:有序,可重复,又索引
set系列集合:无序,不重复,无索引

数据结构

*长什么样子
*怎么添加数据
*怎么删除数据


常见结构
1,栈:
后进先出,先进后出
2,队列:先进先出,后进后出
3,数组:(查询快,增删慢)
        *查询速度快,根据地址和索引,快速点位,(内存是连续的)
        *增删慢:从新排序
4,链表(查询慢,增删快)
        *链表中节点是一个独立的对象,在内存不连续,
每个节点包含数据和下一个节点的地址-单向
        *
无论查询哪个数据都要从 头开始
        *添加和删除 - 只要断开链表重写前后地址就好
        双向链表(
每个节点包含数据和下一个节点的地址,前一个地址)-(可以两边查找,可以提高查找效率,例如查询第几个时,先判断从头还是尾,比较近)
5,树,节点()
        
二叉树:最多两个节点,没有什么规则
        二叉查找树:最多两个节点,左小右大,
一样的不存(set的不重复)
                内容包含:(父左右节点地址,和值)没有就null
                1前序遍历:当前-左-右
                2中序遍历:
左-当前-右(从左到右,就是从小到大)
               
3后续遍历:左-右-当前
                4层序遍历:一层层
               
弊端:不平衡,树太高查询慢

        平衡二叉树:任意节点左右高度查不超过1
                旋转机制:(左旋右旋,触发:当添加节点后,不是一颗平衡二叉树就
                        左旋:1从添加的节点,往父节点找不平衡的节点当作支点
                        左左和右右 旋转一次就好(整体旋转)
                        左右和右左。要旋转两次(先局部旋转 ,在整体旋转)
6,红黑树   
        是一个自平衡二叉树,不是高度平衡,特右的红黑规则:
        *根节点 必须黑色
        *连个红节点不能相连
        *没有值的为nil
        *每个节点的简单路径上黑节点相同 
        添加默认元素为红(效率比黑的高)
        增删查改效率都很高

                           



ArrayList集合底层原理


*底层是数组结构
1,利用空参是时候 低层创建的数据长度默认为0

2,添加第一个元素的时候,底层新建一个长度为10的数组
        size:(元素的个数,下次存入的位置)
3,存满的时候,会扩容原理的1.5倍(一个个添加的时候)
4,如果一次性添加多个元素,新建长度以实际为准

LinkedList集合底层原理

*底层是双向链表,查询慢。头尾操作极快

迭代器


*iterator生成一个迭代器对象,默认指向0索引
*hasNext 判断是否有元素
*next获取元素,移动指针

在使用迭代器的时候  不要并发的添加或者删除元素 否则异常

泛型

List<String>
*JDK5引用的
*统一数据类型
*把运行期问题提前到编译期
java是伪泛型,编译的时候 底层还是存object,


泛型类public class Mycalss<E>{}  所有的方法都可以使用
泛型方法 public <E> void  test(E e)
泛型接口:1给出实现类型,2延续泛型

泛型不支持继承性,但数据支持继承性
通配符 可以指定类型的范围(指定某一类)

Java的集合框架中的泛型参数不能是基本类型,而只能是引用类型。这是由Java泛型的设计决策所决定的。 Java的泛型是在编译期进行类型检查的,编译器会对泛型进行类型擦除(Type Erasure),将泛型类型转换为其对应的原始类型。原始类型是指不带泛型参数的类型,如 ListMap 等。 基本类型(如 intcharboolean 等)是不具备对象特性的,无法作为泛型参数使用。因此,为了实现泛型的类型安全性和一致性,Java要求泛型参数必须是引用类型。



set系列集合

        无序 ,不重复,无索引

        HashSet ,无序
        LinkedHashset,有序
        TreeSet,可排序


哈希值:*根据hashcode计算出来的int整数
                *没有重写就默认用地址值计算,所有一般情况会重写hashcode和equals方法
 

        HashSet底层原理()
               
*创建一个默认16的数组名字叫table,默认扩展因子为0.75(条件)-扩2倍
                *根据元素hash值和数组长度计算存入位置
                *存入前判断是否为null,如果是null就直接存入
                *如果不是,就调用equals方法比较属性值
                        1,一样:不存
                        2,不一样:jdk8以前:老元素挂在新元素下面,jdk8后新元素直接挂在老元素后面
                                (要和链表的每个元素equals方法比较,相同不存)

                        jdk18前:数组+链表
                        jdk18前:数组+链表+红黑树(链表和数组的长度达到阈值触发链表转红黑树

                 LinkedHashSet底层原理()
                     
  *是HashSet的子类
                        *多加了:在每个元素额外多了一个双向链表机制,记录存储顺序

                TreeSet底层原理
                       
*可排序(默认从小到大
                        *底层是红黑树结构实现的排序,增删查改性能较好
                排序:
                1,int ,double,默认从小到大
                2,字符按照ASCII码表的数字排序
                3,多字符,依次按照每一个字母比较 不看长度
                4,对象
                        4.1默认排序(自然排序)比较的java对象实现comparable,重写compareTo方法
                        4.2比较器排序 (结果负数小,正数大,0不存)(可以lambad)(优先级高)
                                TreeSet<String> set = new TreeSet<>(new MyComparator());
                        

 双列集合Map

        hashMap
               
*是map的实现类
                 *特点都是由键值决定的 :无序,不重复,无索引
                 *底层根hashSet 一模一样

       LikedhashMap     
                *底层和Likedhashset
一模一样,多了双向链表
                *有序


        TreeMap
                *
底层和Treeset
一模一样,
                 *可排序

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

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

相关文章

使用JLink仿真器实现调试打印的N种方法

方法一&#xff1a;使用MCU的串口 这是最古老也是最简单的方法。 电脑上面插一个USB转TTL&#xff0c;然后与MCU的UART_RX/UART_TX/GND连接起来。PC端再打开一个串口调试助手。两边的波特率一致&#xff0c;就可以收到MCU发过来的打印信息了。 方法二&#xff1a;使用JLink仿…

低功耗模式的通用 MCU ACM32F0X0 系列,具有高整合度、高抗干扰、 高可靠性的特点

ACM32F0X0 系列是一款支持多种低功耗模式的通用 MCU。集成 12 位 1.6 Msps 高精度 ADC 以及比 较器、运放、触控按键控制器、段式 LCD 控制器&#xff0c;内置高性能定时器、多路 UART、LPUART、SPI、I2C 等丰富的通讯外设&#xff0c;内建 AES、TRNG 等信息安全模块&#xff0…

初识文件系统

文章目录 1、概述2、inode结构3、block BitMap 和 inode BitMap4、软链接和硬链接4.1 硬链接4.2 软链接 5、Linux下的文件类型的 1、概述 文件存储在硬盘上&#xff0c;硬盘的最小存储单位叫做“扇区”&#xff08;Sector&#xff09;。每个扇区储存512字节 操作系统读取硬盘…

vue3 添加编辑页使用 cron 表达式生成

示例效果图 1、添加组件 <template><div class"v3c"><ul class"v3c-tab"><li class"v3c-tab-item" :class"{ v3c-active: tabActive 1 }" click"onHandleTab(1)">秒</li><li class&qu…

智能优化算法应用:基于蝙蝠算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蝙蝠算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蝙蝠算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝙蝠算法4.实验参数设定5.算法结果6.参考文献7.MA…

【MQ】Rocketmq如何保证消息不丢失

文章目录 前言一、前言二、消息什么情况会丢失&#xff1f;三、如何保障消息不丢失&#xff1f;3.1、生产者端3.2、Broker端3.3、消费者端 四、总结 前言 一、前言 RocketMQ可以理解成一个特殊的存储系统&#xff0c;这个存储系统特殊之处数据是一般只会被使用一次&#xff0…

Mysql安装教程(zip版)

去官网下载&#xff1a; 我这有个5.7.9的版本&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1H6Qs2mP0vzBklmD_ID7VLg 提取码&#xff1a;8xnk 管理员cmd 到mysql安装目录的bin下面 1、mysqld --initialize-insecure --usermysql //初始化执行成功之后会生…

四六级高频词组3

目录 词组 参考链接 词组 101. by chance&#xff08;accidentally&#xff0c; by accident&#xff09;偶然 102. for a change换换环境&#xff08;花样等&#xff09; 103. charge sb. with …控告某人犯有… 104. in charge of &#xff08;responsible for&#xff…

小程序商城免费搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 鸿鹄云商

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

音视频技术开发周刊 | 323

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 Meta牵头组建开源「AI复仇者联盟」&#xff0c;AMD等盟友800亿美元力战OpenAI英伟达 超过50家科技大厂名校和机构&#xff0c;共同成立了全新的人工智能联盟。以开源为旗号…

c++ multimap

multimap创建 multimap<string , string> m; m.insert(make_pair("12","3234")); m.insert(make_pair("12","3234")); m.insert(make_pair("12","3234"));遍历 multimap<string , string> m; m.inser…

Nacos配置管理-nacos集群搭建

一、集群结构图 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用 nginx。 二、 计划实现 --计划架构-- 3个Nacos节点&#xff1b; 3个mysql库&#xff1b; --计划节点地址-- 三、集群搭建 3.1 基本步骤 &#xff08;1&#…

Camunda 7.x 系列【60】流程分类

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. 案例演示2.1 后端2.2 前端2.3 测试1. 前言 钉钉中的OA审批分类: 企业级的业务…

SQL自学通之函数 :对数据的进一步处理

目录 一、目标 二、汇总函数 COUNT SUM AVG MAX MIN VARIANCE STDDEV 三、日期/时间函数 ADD_MONTHS LAST_DAY MONTHS_BETWEEN NEW_TIME NEXT_DAY SYSDATE 四、数学函数 ABS CEIL 和FLOOR COS、 COSH 、SIN 、SINH、 TAN、 TANH EXP LN and LOG MOD POW…

软件测试之缺陷管理

一、软件缺陷的基本概念 1、软件缺陷的基本概念主要分为&#xff1a;缺陷、故障、失效这三种。 &#xff08;1&#xff09;缺陷&#xff08;defect&#xff09;&#xff1a;存在于软件之中的偏差&#xff0c;可被激活&#xff0c;以静态的形式存在于软件内部&#xff0c;相当…

输电线路故障监测系统:实现电力传输的智能化管理

随着科技的不断发展&#xff0c;电力系统的安全稳定运行对于国家经济和人民生活至关重要。为了提高电力系统的运行效率和安全性&#xff0c;恒峰智慧科技研发的输电线路故障监测系统HFP-GZS2000应运而生。本文将介绍输电线路分布式故障定位及隐患监测装置的技术原理、功能特点以…

洗衣行业在线下单小程序源码系统:上门取货,轻松操作,简单便捷 带完整的安装部署教程

传统洗衣行业存在一些问题&#xff0c;如店面覆盖范围有限、取送时间较长、服务水平参差不齐等。随着消费升级和移动互联网技术的发展&#xff0c;消费者对于洗衣服务的需求也在发生变化。他们需要更便捷、高效、优质的服务方式。因此&#xff0c;开发一款基于移动互联网技术的…

vscode 远程连接内网服务器和通过跳板机远程连接外网服务器

1.打开vscode congfig文件&#xff0c;输入相应信息如下图 若本地没有id_rsa文件&#xff0c;可打开cmd进入.ssh目录下输入命令&#xff1a;ssh-keygen&#xff0c;创建该文件&#xff0c;会提示输入该文件保存地址以及设置秘钥密码&#xff08;最好不要设置密码&#xff0c;不…

Java EE 多线程之多线程案例

文章目录 1. 多线程案例1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式1.1.3 多线程下的单例模式 1.2 阻塞队列1.2.1 阻塞队列定义1.2.2 生产者消费者模型的意义1.2.4 标准库中的阻塞队列1.2.5 实现阻塞队列1.2.6 用阻塞队列实现生产者消费者模型 1.3 实现定时器1.3.1 标准库中的定…

在接触新的游戏引擎的时候,如何能快速地熟悉并开发出一款新游戏?

引言 大家好&#xff0c;今天分享点个人经验。 有一定编程经验或者游戏开发经验的小伙伴&#xff0c;在接触新的游戏引擎的时候&#xff0c;如何能快速地熟悉并开发出一款新游戏&#xff1f; 利用现成开发框架。 1.什么是开发框架&#xff1f; 开发框架&#xff0c;顾名思…