Fork me on GitHub

Java面试题总结一Java基础

1.String类为什么是final的。
1
主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。
2.HashMap的源码,实现原理,底层结构
1
2
3
4
5
6
7
8
9
总的来说,HashMap就是数组+链表的组合实现,每个数组元素存储一个链表的头结点,本质上来说是哈希表“拉链法”的实现。
  HashMap的链表元素对应的是一个静态内部类Entry,Entry主要包含key,value,next三个元素
  主要有put和get方法,put的原理是,通过hash%Entry.length计算index,此时记作Entry[index]=该元素。如果index相同
  就是新入的元素放置到Entry[index],原先的元素记作Entry[index].next
  get就比较简单了,先遍历数组,再遍历链表元素。
  null key总是放在Entry数组的第一个元素
  解决hash冲突的方法:链地址法
  再散列rehash的过程:确定容量超过目前哈希表的容量,重新调整table 的容量大小,当超过容量的最大值时,取
  Integer.Maxvalue
3.说说你知道的几个Java集合类:list、set、queue、map实现类
1
2
3
List:ArrayList、LinkedList
Set:HashSet、TreeSet
Map:HashMap、LinkedHashMap
4.描述一下ArrayList和LinkedList各自实现和区别
1
2
ArrayList:基于数组实现,由于是List,所以是有序,可以重复,可以为null,查询效率高,增删效率低
LinkedList:基于链表实现,查询效率低(遍历),增删效率高。
5.Java中的队列都有哪些,有什么区别。
1
2
3
4
5
6
7
8
9
10
11
普通队列、阻塞队列、非阻塞队列
区别:阻塞队列与普通队列区别在于,当队列是空时,从队列中获取元素的操作将被阻塞,或者当队列满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新的元素的线程同样会被阻塞,知道其他的线程使得队列重新变的空闲起来,如从队列中溢出一个或多个元素,或者完全情况队列。
举例说明:阻塞队列(LinkedBlockingQueue)和非阻塞队列(ConcurrentLinkedQueue)的区别
相同点:二者都是线程安全的。
不同点:
(1)阻塞队列:按FIFO排序元素。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中最短的元素。新元素插入队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知性能要低。
注意:A:必须要使用take()方法获取的时候达成阻塞结果
B:使用poll()方法产生非阻塞效果
(2)非阻塞队列:基于链接节点的、无界的、线程安全。按FIFO排序元素。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中最短的元素。新元素插入队列的尾部,并且队列检索操作会获得位于队列头部的元素。当许多线程共享访问一个公共Collection时,ConcurrentLinkedQueue是一个恰当的选择。此队列不允许为null元素。
(3)在并发编程中,一般推荐使用阻塞队列,这样实现可以尽量避免程序出现意外错误。阻塞队列使用最经典的场景就是socket客户端数据的读取和解析,读取数据的线程不断将数据放入队列,然后解析线程不断从队列取数据解析。只要符合生产者-消费者模型的都可以使用阻塞队列。
(4)使用非阻塞队列,虽然能即时返回结果(消费结果),但是必须自行编码解决返回为空的情况(以及消费重试等问题)。
6.反射中,Class.forName和classloader的区别
1
2
3
4
共同点
两者都会将用户指定的类加载到内存中,供用户使用
不同点:
Class.forName方法有要不要初始static变量的参数,而ClassLoader.loadClass()没有;Class.forName的重载方法是静态的,而ClassLoader.loadClass不是。
7.Java7、Java8的新特性
1
1.可以用字符串控制Switch语句2.lambda表达式3.用|表示多个异常4.可以为接口添加静态方法和默认实现
8.Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高
1
数组在随机访问数据、随机增加数据、随机删除数据的执行效率上比链表的效率高,数据量越小,两者之间效率的差距越小,数据量越大差距越大
9.Java内存泄露的问题调查定位:jmap,jstack的使用等等
1
2


10.string、stringbuilder、stringbuffer区别
1
2
3
String:不可变,每次修改都生成新对象,线程安全,
StringBuilder:修改不产生新的未使用对象,线程不安全,速度快
StringBuffer:修改不产生新的未使用对象,线程安全,速度慢
11.HashTable和HashMap的区别
1
2
HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。
12.异常的结构,运行时异常和非运行时异常,各举个例子
1
2
3
运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
13.String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果
1
2
3
4
5
6
7
8
9
10
11
String a = "abc";				//
String b = "abc"; //
String c = new String ("abc"); //
String d = "ab"+"c"; //
System.out.println(a==b); //true
System.out.println(a==c); //false
System.out.println(a==d); //true
System.out.println(b==c); //false
System.out.println(b==d); //true
System.out.println(c==d); //false
用==比较的是引用地址,abd三个变量指向的同一个内存地址,c是new出来的对象,在堆内存中。
14.String 类的常用方法
1
length	charAt compareTo concat indexOf toLowerCase toUpperCase trim split
15.Java 的引用类型有哪几种
1
2
3
4
强引用:Java中默认声明的就是强引用,比如Object obj = new Object()
软引用:在内存不足的情况下,软引用将会被自动回收
弱引用:无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收
虚引用:如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收
16.Java的基础类型和字节大小。
基本类型 字节大小
byte 1
short 2
int 4
long 8
float 4
double 8
char 2
boolean
17.Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题(建议熟悉 jdk 源码,才能从容应答)
18.如果不让你用Java Jdk提供的工具,你自己实现一个Map,你怎么做。
19. Hash冲突怎么办?哪些解决散列冲突的方法?
20.HashMap冲突很厉害,最差性能,你会怎么解决?从O(n)提升到log(n)咯,用二叉排序树的思路说了一通
21.rehash
22.hashCode() 与 equals() 生成算法、方法怎么重写

#####