首页 > 编程语言 >Java常见List面试题

Java常见List面试题

时间:2024-10-29 12:15:48浏览次数:9  
标签:面试题 Java LinkedList ArrayList List 线程 User 数组 Class

前言

本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!获取一个类Class对象的方式有哪些?ArrayList 和 LinkedList 的区别有哪些?用过 ArrayList 吗?说一下它有什么特点?有数组了为什么还要搞个 ArrayList 呢?说说什么是 fail-fast?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘

*** 12万字的java面试题整理 ***

获取一个类Class对象的方式有哪些

搞清楚类对象和实例对象,但都是对象。
第一种:通过类对象的 getClass() 方法获取,细心点的都知道,这个 getClass 是 Object 类里面的方法。

User user=new User();
//clazz就是一个User的类对象Class<?> clazz=user.getClass();

第二种:通过类的静态成员表示,每个类都有隐含的静态成员 class。

//clazz就是一个User的类对象
Class<?> clazz=User.class;

第三种:通过 Class 类的静态方法 forName() 方法获取。

Class<?> clazz = Class.forName("com.tian.User");

ArrayList 和 LinkedList 的区别有哪些?

ArrayList
  • 优点:ArrayList 是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
  • 缺点:因为地址连续,ArrayList 要移动数据,所以插入和删除操作效率比较低。
LinkedList
  • 优点:LinkedList 基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址。对于新增和删除操作,LinkedList 比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景。
  • 缺点:因为 LinkedList 要移动指针,所以查询操作性能比较低。
适用场景分析
  • 当需要对数据进行对随机访问的时候,选用 ArrayList。
  • 当需要对数据进行多次增加删除修改时,采用 LinkedList。

如果容量固定,并且只会添加到尾部,不会引起扩容,优先采用 ArrayList。
当然,绝大数业务的场景下,使用 ArrayList 就够了,但需要注意避免 ArrayList 的扩容,以及非顺序的插入。

用过 ArrayList 吗?说一下它有什么特点?

只要是搞 Java 的肯定都会回答“用过”。所以,回答题目的后半部分——ArrayList 的特点。可以从这几个方面去回答:

Java 集合框架中的一种存放相同类型的元素数据,是一种变长的集合类,基于定长数组实现,当加入数据达到一定程度后,会实行自动扩容,即扩大数组大小。

底层是使用数组实现,添加元素。

  • 如果 add(o),添加到的是数组的尾部,如果要增加的数据量很大,应该使用 ensureCapacity()方法,该方法的作用是预先设置 ArrayList 的大小,这样可以大大提高初始化速度。
  • 如果使用 add(int,o),添加到某个位置,那么可能会挪动大量的数组元素,并且可能会触发扩容机制。

高并发的情况下,线程不安全。多个线程同时操作 ArrayList,会引发不可预知的异常或错误。
ArrayList 实现了 Cloneable 接口,标识着它可以被复制。注意:ArrayList 里面的 clone() 复制其实是浅复制。

有数组了为什么还要搞个 ArrayList 呢?

通常我们在使用的时候,如果在不明确要插入多少数据的情况下,普通数组就很尴尬了,因为你不知道需要初始化数组大小为多少,而 ArrayList 可以使用默认的大小,当元素个数到达一定程度后,会自动扩容。
可以这么来理解:我们常说的数组是定死的数组,ArrayList 却是动态数组。

说说什么是 fail-fast?

ail-fast 机制是 Java 集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生 fail-fast 事件。

例如:当某一个线程 A 通过 iterator 去遍历某集合的过程中,若该集合的内容被其他线程所改变了,那么线程 A 访问集合时,就会抛出 ConcurrentModificationException 异常,产生 fail-fast 事件。这里的操作主要是指 add、remove 和 clear,对集合元素个数进行修改。
解决办法:建议使用“java.util.concurrent 包下的类”去取代“java.util 包下的类”。
可以这么理解:在遍历之前,把 modCount 记下来expectModCount,后面 expectModCount 去和 modCount 进行比较,如果不相等了,证明已并发了,被修改了,于是抛出ConcurrentModificationException 异常。

标签:面试题,Java,LinkedList,ArrayList,List,线程,User,数组,Class
From: https://blog.csdn.net/2401_87718562/article/details/143310104

相关文章

  • Springboot+vue的公司日常考勤管理系统(有报告),Javaee项目,springboot vue前后端分离项目
    演示视频:Springboot+vue的公司日常考勤管理系统(有报告),Javaee项目,springbootvue前后端分离项目。项目介绍:本文设计了一个基于Springboot+vue的前后端分离的公司日常考勤管理系统,采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven......
  • ssm+vue的班级事务管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。
    演示视频:ssm+vue的班级事务管理系统(有报告)。Javaee项目,ssmvue前后端分离项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Vue+Maven来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁,操作简单......
  • ssm+vue的超市会员管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。
    演示视频:ssm+vue的超市会员管理系统(有报告)。Javaee项目,ssmvue前后端分离项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Vue+Maven来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁,操作简单......
  • Python 和Java 哪个更适合做自动化测试
    标题:Python和Java哪个更适合做自动化测试自动化测试领域中,Python与Java均为热门选择。Python因其语法简洁、开发速度快而颇受推崇;Java凭借稳固的企业级特性与庞大用户基础而久负盛名。两者各有优势,选择取决于项目需求、团队熟悉度以及环境兼容性。Python的优势在于其脚......
  • 【项目实战】Java中集合Collection 和 Collections入门介绍
    在Java编程语言中,Collection是一个接口,它是集合层次结构中的根接口。Collection接口定义了所有集合类型(如列表、集合和队列)所共有的基本操作方法。而Collections则是一个工具类,它提供了一系列静态方法来操作或返回集合。当你需要存储一组对象并在程序中对其进行操作时,......
  • 1 Java 跨平台原理
    JVMJava的特性就是程序员一次编写,到处运行,意思是我们只需要写一份代码,就可以在不同的操作系统(windows、Linux、MacOS等)中运行。但是不同的操作系统能看懂的指令是不同的,所以实现方式就是给每个操作系统开发一个Java虚拟机(JVM)。JVM运行的过程是把我们代码编译后的字节码翻译成系......
  • zblog获取tag列表函数GetTagList参数和使用方法介绍说明
    函数位置:zblogphp.php文件,大约2641行。函数参数:$select:数组,获取指定数据。$where:数组,数据获取限制规则。$order:数组,数据获取排序规则。$limit:数组,获取数据数量限制。$option:数组,附加限制选项,可用来获取指定范围内的数据。函数输出:输出一个数组。示例:{......
  • Java学习第一天《String字符串的使用》
    1.获取字符最后一次出现的位置(函数返回值为int类型)                字符串的变量名.lastIndexOf(Stringstr);                               查找a最后出现的位置               System.out.print("请......
  • java+vue计算机毕设电力行业求职招聘系统【开题+程序+论文+源码】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着电力行业的蓬勃发展,人才流动与需求日益增加,传统的招聘方式已难以满足当前高效、精准的匹配需求。电力行业作为国民经济的重要支柱,其招聘活动不仅......
  • Java毕业设计-基于Springboot框架的智慧学生校舍系统项目实战(附源码+论文)
    大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。......