加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 交互 > 正文

40道Java基础常见面试题及详细答案

发布时间:2020-12-31 19:06:19 所属栏目:交互 来源:网络整理
导读:最近看到网上流传着各种面试经验及面试题,往往都是一大堆技术题目贴上去,但是没有答案。 为此我业余时间整理了40道Java基础常见的面试题及详细答案,望各路大牛发现不对的地方不吝赐教,留言即可。 八种基本数据类型的大小,以及他们的封装类 引用数据类型

1、通过hashCode可以很快的查到小内存块。 2、通过hashCode比较比equal方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。

List的三个子类的特点

ArrayList:

  • 底层数据结构是数组,查询快,增删慢。
  • 线程不安全,效率高。

Vector:

  • 底层数据结构是数组,查询快,增删慢。
  • 线程安全,效率低。
  • Vector相对ArrayList查询慢(线程安全的)。
  • Vector相对LinkedList增删慢(数组结构)。

LinkedList

  • 底层数据结构是链表,查询慢,增删快。
  • 线程不安全,效率高。

Vector和ArrayList的区别

  • Vector是线程安全的,效率低。
  • ArrayList是线程不安全的,效率高。
  • 共同点:底层数据结构都是数组实现的,查询快,增删慢。

ArrayList和LinkedList的区别

  • ArrayList底层是数组结果,查询和修改快。
  • LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢。

共同点:都是线程不安全的

List有三个子类使用

  • 查询多用ArrayList。
  • 增删多用LinkedList。
  • 如果都多ArrayList。

String:适用于少量的字符串操作的情况。?StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况。?StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。?StringBuilder:是线程不安全的,而StringBuffer是线程安全的。

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String。

String最慢的原因

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

再来说线程安全

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

Map

  • Map是键值对,键Key是唯一不能重复的,一个键对应一个值,值可以重复。
  • TreeMap可以保证顺序。
  • HashMap不保证顺序,即为无序的。
  • Map中可以将Key和Value单独抽取出来,其中KeySet()方法可以将所有的keys抽取正一个Set。而Values()方法可以将map中所有的values抽取成一个集合。

Set

  • 不包含重复元素的集合,set中最多包含一个null元素。
  • 只能用Lterator实现单项遍历,Set中没有同步方法。

List

  • 有序的可重复集合。
  • 可以在任意位置增加删除元素。
  • 用Iterator实现单向遍历,也可用ListIterator实现双向遍历。

Queue

  • Queue遵从先进先出原则。
  • 使用时尽量避免add()和remove()方法,而是使用offer()来添加元素,使用poll()来移除元素,它的优点是可以通过返回值来判断是否成功。
  • LinkedList实现了Queue接口。
  • Queue通常不允许插入null元素。

Stack

  • Stack遵从后进先出原则。
  • Stack继承自Vector。
  • 它通过五个操作对类Vector进行扩展,允许将向量视为堆栈,它提供了通常的push和pop操作,以及取堆栈顶点的peek()方法、测试堆栈是否为空的empty方法等。

用法

  • 如果涉及堆栈,队列等操作,建议使用List。
  • 对于快速插入和删除元素的,建议使用LinkedList。
  • 如果需要快速随机访问元素的,建议使用ArrayList。

更为精炼的总结

Collection 是对象集合, Collection 有两个子接口 List 和 Set

List?可以通过下标 (1,2..) 来取得值,值可以重复。?Set?只能通过游标来取值,并且值是不能重复的。

ArrayList , Vector , LinkedList 是 List 的实现类

  • ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的。
  • LinkedList 是线程不安全的,底层是由链表实现的。

Map 是键值对集合

  • HashTable 和 HashMap 是 Map 的实现类。
  • HashTable 是线程安全的,不能存储 null 值。
  • HashMap 不是线程安全的,可以存储 null 值。

Stack类:继承自Vector,实现一个后进先出的栈。提供了几个基本方法,push、pop、peak、empty、search等。

Queue接口:提供了几个基本方法,offer、poll、peek等。已知实现类有LinkedList、PriorityQueue等。

https://segmentfault.com/a/1190000008101567

Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现,它们都是集合中将数据无序存放的。

1、hashMap去掉了HashTable?的contains方法,但是加上了containsValue()和containsKey()方法

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读