前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >怒怼面试官|别在问我JAVA List了

怒怼面试官|别在问我JAVA List了

作者头像
会呼吸的Coder
发布于 2022-12-02 08:15:58
发布于 2022-12-02 08:15:58
21800
代码可运行
举报
文章被收录于专栏:会呼吸的Coder会呼吸的Coder
运行总次数:0
代码可运行
了解JAVA的List吗?

List是一个接口,查关键的实现类有ArrayList和LinkedList

讲讲这两个实现类的区别?
  • ArrayList的底层数据结构是数组,支持下标访问,查询数据快,默认初始值为10,容量不足时会进行扩容。
  • 而LinkedList的顶层数据结构是链表,将元素添加到链表的末尾,无需扩容
ArrayList是怎么扩容的,详细讲讲?

arrayList扩容源码实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private Object[] grow(int minCapacity) {
        return elementData = Arrays.copyOf(elementData,
                                           newCapacity(minCapacity));
    }

    private Object[] grow() {
        return grow(size + 1);
    }

    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity <= 0) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return minCapacity;
        }
        return (newCapacity - MAX_ARRAY_SIZE <= 0)
            ? newCapacity
            : hugeCapacity(minCapacity);
    }

可以看到,在graw方法里面进行扩容,将数组容量扩大为原来的1.5倍。 举个例子,如果初始化的值是8,当添加第9个元素的时候,发现数组空间不够,就会进行扩容,扩容之后容量为12. 扩容之后,会调用Arrays.copyOf()方法对数组进行copy。

ArrayList和LinkedList分别应用于什么场景呢?

对于随机index访问的get和set方法,ArrayList的速度要优于LinkedList,因为ArrayList直接通过数组下标直接找到元素;LinkedList要移动指针遍历每一个元素直到找到为止。 新增和删除元素,LinkedList的速度要优于ArrayList,因为ArrayList在新增和删除元素的时候,可能会扩容和复制数组,而LinkedList的新增和删除操作只需要修改指针即可。 因为ArrayList适用于查询多,增删少的场景,而LinkedList适用与查询少,增删多的场景

讲讲Set和List的区别?

List以索引来存取元素,有序的,元素是允许重复的,可以插入多个null值,Set不能存放重复元素,无序的,只允许插入一个null。 List底层实现有数组,链表两种方式,Set基于Map实现,Set里的元素值就是Map的键值。

了解Vector吗?

Vector的底层结构是数组,现在基本没有使用Vector了,因为操作Vector效率比较低,相对于ArrayList,它是线程安全的,在扩容的时候容量扩展为原来的2倍。

那你还知道哪些线程安全的List?

可以使用Collections.synchronizedList()方法返回一个线程安全的List。 还有另外一种方法,使用CopyOnWriteArrayList。

讲一下CopyOnWriteArrayList原理?

CopyOnWriteArrayList是一个线程安全的List,底层是通过复制数组的方式来实现的。 所谓的CopyOnWrite,就是写时复制。 当我们往容器添加元素时,不直接往容器添加,而是先将当前容器进行复制,复制出一个新的容器,然后往新的容器添加元素,添加完元素之后,再将原容器引入指向新容器。 这样做的好处就是可以对CopyOnWrite容器进行并发的读而不需要加锁,因为当前容器不会被修改。

那你说说CopyOnWriteArrayList有什么缺点吗?

主要有以下俩个问题:

  • 内存占用问题,由于CopyOnWrite的写时复制机制,在进行写操作时,内存里会有两个对象的内存。
  • CopyOnWrite容器不能保证数据的实时一致性,可能读取到旧数据。
怎么给List排序呢?

可以使用List自身的sort方法,或者使用Collections.sort(list)方法。

怎么在遍历ArrayList时移除一个元素?

如果使用foreach删除元素的话,会导致快速失败问题,可以使用迭代器的remove方法,避免快速失败问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 初级程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql 唯一索引_mysql主键和唯一索引的区别
普通索引(INDEX):最基本的索引,没有任何限制 唯一索引(UNIQUE):与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。 主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。 全文索引(FULLTEXT ):可用于 MyISAM 表,mysql5.6之后也可用于innodb表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时和空间。 联合(组合)索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
全栈程序员站长
2022/11/05
3.3K0
MySQL insert or update sql
MySQL 一条 sql 实现数据保存变更 insert or update ,如果没有执行insert,有就update
全栈程序员站长
2022/11/15
3.1K0
主从结构不一致复制问题验证
简介:高级数据库工程师,从事数据库行业近10年,从Oralce转战MySQL,擅长MySQL数据库性能优化、备份恢复、国产数据库迁移,对开源数据库相关技术有浓厚兴趣。
GreatSQL社区
2022/03/04
8320
MySQL避免插入重复记录的方法
mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。 1、insert ignore 2、replace into 3、insert on duplicate key update
IT工作者
2022/01/26
2.5K0
如何在 ClickHouse 中实现行列转换
当我们在进行数据分析时,时常会遇到行转列、列转行的查询需求。今天就来聊一聊如何在 CH 中实现这些查询。
Nauu
2020/06/29
14.8K0
insert 语句加锁机制
之前的文章里面总结了很多死锁案例,其实里面有几篇文章对于insert加锁流程表述的不准确,而且微信公众号又无法修改,所以通过本文重新梳理insert加锁流程,最后加上一个死锁案例解析。
用户1278550
2018/08/09
3.3K0
MySQL索引优化深入
CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `c1` varchar(10) DEFAULT NULL,   `c2` varchar(10) DEFAULT NULL,   `c3` varchar(10) DEFAULT NULL,   `c4` varchar(10) DEFAULT NULL,   `c5` varchar(10) DEFAULT NULL,   PRIMARY KEY (`id`),   KEY `idx_test_c1234` (`c1`,`c2`,`c3`,`c4`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
星哥玩云
2022/08/18
2950
MySQL索引优化深入
insert...on duplicate key update语法
这样的操作乍一看没有什么问题,但是仔细分析分析,还是有些瓶颈的,目前来看,我能分析到的瓶颈有两个,
AsiaYe
2019/11/06
2.6K0
MYSQL高级篇-----索引优化分析
由于有些mysql不能使用full join,不过可以换种方法表示 A 的独有 + AB 共有 + B的独有 union本身就可以去重 所以可以这样使用
默 语
2024/11/20
6990
MYSQL高级篇-----索引优化分析
GreatSQL 中 Insert 慢是什么情况?
GreatSQL社区
2024/07/06
1170
GreatSQL 中 Insert 慢是什么情况?
运维常用 mysql 语句
上周隔壁专题推送最后一篇Nginx文章(公众号出门左转 Nginx专题) ,从本周开始每周一推送MySql主题文章(Docker 主题每周四不变),文章内容均为运维方向相关,聚沙成塔,集腋成裘,第一篇文章讲一下运维工作中经常使用的 MySql 语句。
用户1560186
2019/12/19
1.6K0
有哪些优化mysql索引的方式请举例(sqlserver索引优化)
myisam存储:如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎,比如bbs 中的发帖表,回复表
全栈程序员站长
2022/07/25
1.2K0
有哪些优化mysql索引的方式请举例(sqlserver索引优化)
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
在当今的大数据时代,数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库,在与MySQL模式的兼容性方面展现出了显著的优势,为企业数据迁移、整合与升级提供了极大的便利。
公众号:码到三十五
2024/05/06
8580
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
Oracle连接字符串函数listagg()和wmsys.wm_concat()用法简介
介绍:其函数在Oracle 11g 版本中推出,对分组后的数据按照一定的排序进行字符串连接。
星哥玩云
2022/08/16
4K0
Mysql INSERT ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE KEY UPDATE是MySQL insert的一种扩展。当发现有重复的唯一索引(unique key)或者主键(primary key)的时候,会进行更新操作;如果没有,那么执行插入操作。
霸王猪
2018/07/19
5K0
Mysql INSERT ON DUPLICATE KEY UPDATE
Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践
在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作;
加多
2018/09/06
2.5K0
Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践
关于MySQL中insert ignore,insert on duplicate和replace into,你可能没想过区别
在数据流转中或者日常的数据操作中,势必会有数据写入的过程,如果把一些数据写入一张数据库表中,如果写入量有100万,而重复的数据有90万,那么如何让这10%的数据能够更高更高效的写入。
jeanron100
2020/02/13
3.8K0
MySQL的insert会阻塞update?
某银行客户在从Oracle迁移到MySQL的开发中,MySQL在READ-COMMITTED隔离级别下,出现了insert阻塞update的情况,但同样的情况下,Oracle的insert则不会阻塞update。本文通过复现该问题,分析MySQL的锁信息,确认是MySQL与Oracle在并发事务处理上的差异,在进行数据库迁移改造的程序开发应予以关注。
bisal
2023/04/06
2.1K0
大数据技术之_29_MySQL 高級面试重点串讲_02
  MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。
黑泽君
2019/06/16
6640
5.深入TiDB:Insert 语句
这篇文章我们看一下 TiDB 是插入数据是如何封装的,索引是如何维护的,如果插入的数据发生了冲突会如何处理,类似INSERT IGNORE 与 INSERT ON DUPLICATE KEY UPDATE插入语句是如何处理。
luozhiyun
2021/10/09
9880
5.深入TiDB:Insert 语句
推荐阅读
相关推荐
mysql 唯一索引_mysql主键和唯一索引的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验