Java常晤面试真题之中级进阶(List篇)

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

前言

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

搞清楚类对象和实例对象,但都是对象。
第一种:通过类对象的 getClass() 方法获取,仔细点的都知道,这个 getClass 是 Object 类里面的方法。
  1. User user=new User();
  2. //clazz就是一个User的类对象
  3. Class<?> clazz=user.getClass();
复制代码
第二种:通过类的静态成员体现,每个类都有隐含的静态成员 class。
  1. //clazz就是一个User的类对象
  2. Class<?> clazz=User.class;
复制代码
第三种:通过 Class 类的静态方法 forName() 方法获取。
  1. 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 异常。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表