2024年150道高频Java面试题(二十一)

41. ArrayList 和 LinkedList 的区别是什么?

ArrayList 和 LinkedList 都是 Java 中常用的 List 接口的实现,用于存储一系列动态的元素集合。它们之间的主要区别在于数据结构、性能特性、和适用场景。

  1. 数据结构
    • ArrayList 使用动态数组来实现 List 接口。这意味着所有元素都被连续存储在内存中,允许通过索引快速访问任何位置的元素。
    • LinkedList 使用双向链表实现 List 接口。每个元素(节点)都包含数据以及指向前一个和后一个节点的引用,这样可以在不连续的内存位置中存储元素。
  2. 性能特性
    • 访问元素:ArrayList 在常量时间 O(1) 内提供对元素的随机访问,因为它是基于索引的。而 LinkedList 需要线性时间 O(n),因为它必须从头节点或尾节点遍历链表。
    • 插入和删除:对于 ArrayList,插入和删除元素可能需要线性时间 O(n),因为它可能涉及到移动大量元素以保持数组的连续性。而 LinkedList 在这种情况下通常有更好的性能,为 O(1),因为只需要改变节点的指针。
    • 内存占用:由于链表结构,LinkedList 在每个元素之间存储额外的引用,因此相比于 ArrayList,它在内存使用上稍微要高一些。
  3. 适用场景
    • ArrayList 更适用于需要频繁随机访问元素的场景,如数组遍历、基于索引的查找等。
    • LinkedList 更适合在频繁插入和删除操作的场景中,如实现栈、队列等数据结构,或者当列表很大且操作频繁时,插入和删除的常数时间操作使它成为更合适的选择。

以下是一个简单的代码示例,展示两者的部分操作性能差异:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class ListPerformance {public static void main(String[] args) {List<Integer> arrayList = new ArrayList<>();List<Integer> linkedList = new LinkedList<>();// 添加元素for (int i = 0; i < 100000; i++) {arrayList.add(i);linkedList.add(i);}// ArrayList 访问元素快long startTime = System.currentTimeMillis();arrayList.get(50000); // 假设我们获取中间的元素long endTime = System.currentTimeMillis();System.out.println("ArrayList get operation time: " + (endTime - startTime) + "ms");// LinkedList 访问元素慢startTime = System.currentTimeMillis();linkedList.get(50000); // 假设我们获取中间的元素endTime = System.currentTimeMillis();System.out.println("LinkedList get operation time: " + (endTime - startTime) + "ms");// LinkedList 插入和删除快startTime = System.currentTimeMillis();linkedList.add(50000, 123456); // 在中间插入元素endTime = System.currentTimeMillis();System.out.println("LinkedList add operation time: " + (endTime - startTime) + "ms");startTime = System.currentTimeMillis();linkedList.remove(50000); // 删除中间的元素endTime = System.currentTimeMillis();System.out.println("LinkedList remove operation time: " + (endTime - startTime) + "ms");}
}

以上代码只是性能测试的一个简单示例,实际性能会根据具体操作和 JVM 的实现有所不同。在决定使用 ArrayList 或 LinkedList 之前,应该考虑实际应用场景和数据操作的特点。

42. 如何实现数组和 List 之间的转换?

在 Java 中,数组和 List(列表)之间的转换非常常见。下面分别介绍几种转换方法。

1)数组转 List
  1. 使用 Arrays.asList()

    String[] array = {"a", "b", "c"};
    List<String> list = Arrays.asList(array);
    

    注意:这种方法得到的 List 是与原数组绑定在一起的,即对其中一个的修改会影响另一个。

  2. 使用 Collections.addAll()

    String[] array = {"a", "b", "c"};
    List<String> list = new ArrayList<>();
    Collections.addAll(list, array);
    

    这种方法得到的 List 是独立的。

2)List 转数组
  1. 使用 List.toArray()

    List<String> list = Arrays.asList("a", "b", "c");
    String[] array = (String[]) list.toArray();
    

    注意:这种转换默认得到的数组类型是 Object 类型的,如果需要得到特定类型的数组,需要强制类型转换。

  2. 使用 List.toArray(T[] a)

    List<String> list = Arrays.asList("a", "b", "c");
    String[] array = list.toArray(new String[0]); // 传入一个类型匹配的、长度为 0 的数组
    

    这种方法可以避免强制类型转换,并且可以指定数组类型。

总结:

  • Arrays.asList() 方法简单易用,但得到的 List 与原数组绑定,操作需谨慎。
  • Collections.addAll() 方法得到的 List 是独立的,更加灵活。
  • List.toArray() 方法需要强制类型转换,而 List.toArray(T[] a) 可以避免这个问题。

领【150 道精选 Java 高频面试题】请go公众号:码路向前 。

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

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

相关文章

达梦使用disql登录数据库显示“未连接”

基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例问题&#xff1a;达梦数据库在使用disql登录时&#xff0c;显示“未连接”。 指定了IP和端口号还是连接异常。 […

CentOS如何做端口映射?

在今天的技术发展中&#xff0c;越来越多的应用需要跨越网络进行远程管理和控制。为了实现这一目标&#xff0c;端口映射技术被广泛应用于各个领域。其中&#xff0c;【天联】作为一种性能稳定、安全可靠的端口映射工具&#xff0c;在各种应用场景中得到了广泛的应用和认可。 结…

python+django+flask+vue贫困地区儿童资助网站22pk7

Python 中存在众多的 Web 开发框架&#xff1a;Flask、Django、Tornado、Webpy、Web2py、Bottle、Pyramid、Zope2 等。近几年较为流行的&#xff0c;大概也就是 Flask 和 Django 了 一开始&#xff0c;本文就对系统内谈到的基本知识&#xff0c;从整体上进行了描述&#xff0c…

无法从 tensorflow.comptensorflow.compat.v2.experimental 中导入 dtensor

解决办法1&#xff1a; 对tensorflow2的版本做升或降的调整 解决办法2&#xff1a; 查看tensorflow2的版本与keras的版本是否相匹配 该项目下载的tensorflow2.6.0&#xff0c;连带安装版本为2.15.0的keras 需要更改keras的版本来解决报错&#xff1a; pip install keras2.6.0…

SEO优化艺术:精细化技巧揭示与搜索引擎推广全面战略解读

SEO&#xff08;搜索引擎优化&#xff0c;Search Engine Optimization&#xff09;是一种网络营销策略&#xff0c;旨在通过改进网站内外的各项元素&#xff0c;提升网站在搜索引擎自然搜索结果中的排名&#xff0c;从而吸引更多目标用户访问网站&#xff0c;增加流量&#xff…

面试算法-154-搜索二维矩阵 II

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,…

SQL注入---HTTP报头注入

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前文中提到万能密钥的工作原理&#xff0c;然而万能密钥仅在源代码中没有代码审计&#xff0c;此时才被称之为万能密钥&#xff0c;而代码中有代码审计时需要分以下几种情况讨论 一.uagent注入 …

鸿蒙ArkUI声明式学习:【UI资源管理】

OpenHarmony 应用的资源分类和资源的访问以及应用开发使用的像素单位以及各单位之间相互转换的方法。 资源分类 移动端应用开发常用到的资源比如图片&#xff0c;音视频&#xff0c;字符串等都有固定的存放目录&#xff0c;OpenHarmony 把这些应用的资源文件统一放在 resourc…

python+django教师业绩考评考核评分系统flask

在设计过程中&#xff0c;将参照一下国内外的一些同类网站&#xff0c;借鉴下他们的一些布局框架&#xff0c;将课题要求的基本功能合理地组织起来&#xff0c;形成友好、高效的交互过程。开发的具体步骤为&#xff1a;   第一步&#xff0c;进行系统的可行性分析&#xff0c…

我对神经网络的一点理解

为什么会写这点心得&#xff1f; 因为算起来&#xff0c;学习和接触深度学习已经4年多了&#xff0c;这期间更多是应用层面&#xff0c;调包侠&#xff0c;调参侠&#xff0c;在基础概念层面尤其是数据推理过程&#xff0c;都是浅尝辄止&#xff0c;这些课必须陆续补上&#x…

宝塔面板php7.37.4版本不支持ZipArchive手工安装扩展方法

宝塔面板安装的PHP7.3和7.4默认已经不带zip扩展&#xff0c;要手工安装zip扩展首先需要安装libzip&#xff0c;方法如下&#xff1a; 宝塔面板php7.3版本在SSH命令行界面执行以下语句&#xff1a; cd /www/server/php/73/src/ext/zip/ /www/server/php/73/bin/phpize ./config…

java实现TCP交互

服务器端 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.PriorityQueue; import java.util.Scanner;public class TCP_Serv…

【Leetcode每日一题】 递归 - 二叉树剪枝(难度⭐⭐)(50)

1. 题目解析 题目链接&#xff1a;814. 二叉树剪枝 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 想象一下&#xff0c;你有一堆层层叠叠的积木&#xff0c;你想从底部开始&#xff0c;把那些标记为0的积木拿走。如…

Oracle SQL中的DECODE函数与NVL函数:区别与应用场景详析

Oracle SQL中的DECODE函数与NVL函数&#xff1a;区别与应用场景详析 引言1. NVL函数简介与使用示例2. DECODE函数简介与使用示例3. NVL与DECODE函数的区别4. 使用场景举例结论 引言 在Oracle数据库开发和数据分析过程中&#xff0c;DECODE函数和NVL函数都是非常实用且常见的工具…

C++奇迹之旅:我与类和对象相遇

文章目录 &#x1f4dd;面向过程和面向对象初步认识&#x1f320; 类&#x1f309;类的引入&#x1f309;类的定义 &#x1f320;类的访问限定符&#x1f320;访问限定符 &#x1f320;类的两种定义方式&#x1f309;封装 &#x1f6a9;总结 &#x1f4dd;面向过程和面向对象初…

spring cloud gateway openfeign 联合使用产生死锁问题

spring cloud gateway openfeign 联合使用产生死锁问题&#xff0c;应用启动的时候阻塞卡住。 spring.cloud 版本如下 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><vers…

Docker-compose部署 gitlab-server

Gitlab部署文档 1、配置环境变量 export GITLAB_HOME/srv/gitlab2、创建docker-compose.yml文件 修改http端口需要同步修改external_url修改ssh端口需要同步修改gitlab_rails[‘gitlab_shell_ssh_port’]volumes&#xff1a;容器数据的持久化存储&#xff0c;强烈推荐。除非你…

arm-none-eabi-addr2line和arm-none-eabi-objdump使用笔记

1. arm-none-eabi-addr2line arm-none-eabi-addr2line -ife ./nuttx/vela_ap.elf 0x0c177186arm-none-eabi-addr2line 是一个用于将地址转换为文件名和行号的工具&#xff0c;用于在嵌入式系统中调试程序时定位代码位置。命令的一般格式是&#xff1a; arm-none-eabi-addr2li…

国际数字影像产业园以数字影像技术,重构文创生活

国际数字影像产业园区&#xff0c;作为树莓集团与成都市金牛区人民政府合作的重点项目&#xff0c;于2023年3月正式在金牛区落地生根。这一园区不仅是第五代产业园区的代表&#xff0c;更是数字影像相关产业服务的特色园区&#xff0c;其独特的定位和宏大的愿景“以数字影像技术…

centos安装nvidia驱动(附各种问题)

一准备 1.1 看开显卡型号 1、Linux查看显卡信息:(ps:若找不到lspci命令,可以安装 yum install pciutils) lspci | grep -i vga 2、使用nvidia GPU可以: lspci | grep -i nvidia 3、查看显卡驱动 cat /proc/driver/nvidia/version 1.2 安装环境依赖 yum install kernel-d…