Java 面试基础总结(一)

1、九种基本数据类型的大小以及它们的封装类

java提供的九种基本数据类型:boolean、byte(1)、char(2)、short(2)、int(4)、long(8)、float(4)、double(8)、void 
以及它们的封装类:Boolean、Byte、Character、Short、Integer、Long、Float、Double、Void

2、switch能用string做参数吗

在java7之后可以使用string做参数

3、equals与==的区别

“==”是对比较的两个对象的地址进行比较,Object类中的equals是基于“==”实现的,因此equals方法根据用户的需求自定义来实现同类对象的比较

java中提供的其它类基本都实现了对equals的复写

4、Object有哪些共用方法

Object类有12个成员方法,按照用途可以分为以下几种 
1,构造函数 
2,hashCode和equale函数用来判断对象是否相同, 
3,wait(),wait(long),wait(long,int),notify(),notifyAll() 
4,toString()和getClass, 
5,clone() 
6,finalize()用于在垃圾回收

5、Java中的四种引用,强弱软虚,用到的场景

1、强引用

强引用不会被GC回收,并且在java.lang.ref里也没有实际的对应类型,平时工作接触的最多的就是强引用。Object obj = new Object();这里的obj引用便是一个强引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

2.弱引用(WeakReference)

如果一个对象只有弱引用,就类似一个可有可无的产品,弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期,在垃圾回收线程扫描它所管辖的区域的过程中,一旦发现了弱引用的对象,不管当前内存空间足够与否,都会回收它的存在,不过垃圾回收器是一个优先级很低的线程,因此不一定会可很快发现那些具有若引用的对象

3.软引用(SoftReference)

如果一个对象只具有软引用,那就类似于可有可无的物品,如果内存空间足够,垃圾回收器就不会回收这些对象的内存,只要垃圾回收器没有回收它,该对象就可以被程序使用,软引用可用来实现内存敏感的高速缓存,软引用可以与引用队列(ReferenceQueue)联合使用,如果软引用的对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到关联的引用队列中

4.虚引用(PhantomReference)

"虚引用"顾名思义,就是形同虚设,和其他几种引用都不同,它不会决定一个对象的生命周期,如果一个对象只具有虚应用,那么他就和没有任何引用一样,任何时候都可能被垃圾回收,虚引用主要用来跟踪对象被垃圾回收的活动,虚引用和软引用和弱引用的一个区别在于:虚引用必须和引用队列联合使用,当垃圾回收器准备回收一个对象时,如果发现他还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中,程序可以判断引用队列中是否加入了虚引用,来了解引用的对象是否将要被垃圾回收,程序如果发现某个虚引用被加入到引用队列中,那么就可以在所引用的对象的内存被回收之前采取必要的行动

6、HashCode的作用

可以用来进行对象的比较,不过并不一定可靠,equals比较相同的两个对象,其hashCode一定相同,但是反之并不一定相同

用于在hashTable、HashMap等散列结构中通过hashCode来确定对象在散列结构中的位置

7、ArrayList、LinkedList、Vector的区别

1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

2.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

3.LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

4、当容量不够需要扩容时,ArrayList是扩容50%,Vector是100%

5、由于LinkedList是链式结构,因此在插入和删除方面的性能优于ArrayList,在查询方面不如ArrayList

8、String、StringBuffer与StringBuilder的区别

String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面

1.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String最慢的原因:

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

2.再来说线程安全,在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

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

9、Map、Set、List、Queue、Stack的特点和用法

  • Map

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

  • Set

不包含重复元素的集合,set中最多包含一个null元素 
只能用iterator实现单项遍历,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

10、HashMap和HashTable的区别

1、HashTable是继承Dictionary类,而HashMap是实现的Map接口

2、HashMap是线程不安全的,HashTable是线程安全的

3、HashMap可以使用null作为key和value

HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);

11、HashMap与ConcurrentHashMap的区别

ConcurrentHashMap是线程安全的,使用了锁分离技术,将内部分为若干段(默认情况下分为16段),通过key的hashcode来确定在哪一段,对其操作时,则对需要操作的段进行加锁,因此在默认情况下,如果理想的话可以同时有16个线程对一个ConcurrentHshMap进行操作

 

12、TreeMap、HashMap、LinkedHashMap的区别

TreeMap实现SortMap接口,能够把它保存的记录根据键排序。
  默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。遍历时,取得数据的顺序是完全随机的。
  HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null。
  HashMap不支持线程的同步(即任一时刻可以有多个线程同时写HashMap),可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
  Hashtable与 HashMap类似,它继承自Dictionary类。不同的是:它不允许记录的键或者值为空;它支持线程的同步(即任一时刻只有一个线程能写Hashtable),因此也导致了 Hashtable在写入时会比较慢。

LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。也可以在构造时带参数,按照应用次数排序。
在遍历的时候会比HashMap慢,不过有种情况例外:当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢。因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关

 13、Collection包结构,与Collections的区别

Collection是集合类的一个顶级接口,其直接继承接口有List与Set

而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

14、try/catch finally,try里面有retrun,finally还会执行吗

try里面有return,会在执行finally后再执行return,如果finally里面return,则不会执行try里面的return

finally可以对try中的非基础数据类型的结果产生影响,而基础数据类型不会有影响

15、Exception与Erro包结构,OOM你遇到过哪些情况,SOF你遇到过哪些情况

https://blog.csdn.net/gs_008/article/details/50951617

 

 

 

 

 

 

 

 

posted @ 2018-05-26 12:46  周李科的博客  阅读(136)  评论(0编辑  收藏  举报