core java interview point (1)

J2SE基础

1. 八种基本数据类型的大小,以及他们的封装类。

short, int, long, float, double, byte, char, boolean

Short, Integer, Long, Float, Double, Byte, Char, Boolean

 

2. Switch能否用string做参数?

java1.7开始可以

 

3. equals与==的区别。

equals比对类型和数值是否一样;==要求完全是同一对象,在内存地址中一致。

 

4. Object有哪些公用方法?

toString(), clone(), hashCode(), wait(), getClass(), equals(), notify(), notifyAll(), 

 

5. Java的四种引用,强弱软虚,用到的场景。

强引用,软引用,弱引用,虚引用

StrongReference:强引用,使用最普遍的Object obj = new Object()方式,垃圾回收器不会回收一个强引用的对象obj 。这时候如果内存不足,会抛出异常OutOfMemoryError

要弱化一个强引用,使用obj = null,垃圾回收期在达到生命周期时候或者gc认为不用存在时候回收。

ArrayList数组使用clear方法回收。

 

SoftReference:软引用,程序内存足够时候,就不需要回收,反之垃圾回收器回收。软引用用来实现对内存敏感的缓存,例如浏览器的后退功能,就可以使用软引用。

String st = new String("st"); //强引用

SoftReference<String> softRef=new SoftReference<String>(str); // 软引用

软引用可以和一个引用队列联合使用,如果软引用所引用的对象被垃圾回收器回收,java虚拟机就会把这个软引用加入到与之关联的引用队列中。 

 

WeakReference:弱引用具有更加短暂的生命周期,在垃圾回收器线程工作时候就会将其回收。但是因为垃圾回收线程的优先级低,因此一般弱引用存在时间不定。

WeakReference<String> st= new WeakReference<String>(str);

一个对象只是偶尔使用,在使用时候又能随时获取到,这个对象又有自己的生命周期,又不想影响该对象的垃圾收集,就可以使用弱引用。

 弱引用对象的垃圾回收判断中不会产生任何附加影响,直接回收。

弱引用可以和一个引用队列联合使用,如果弱引用所引用的对象被垃圾回收器回收,java虚拟机就会把这个弱引用加入到与之关联的引用队列中。 

 

PhantomReference:虚引用,意为形同虚设,虚引用不会决定对象的生命周期,就和没有这个对象一样,任何时候都可能被垃圾回收期回收。

虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用必须和引用对队列(ReferenceQueue)联合使用,当垃圾回收器回收一个对象时候,如果发现还有虚引用,就会在回收对象之前,将该虚引用加入到与之关联的引用队列中。

ReferenceQueue queue = new ReferenceQueue();

PhantomReference ph = new PhantomReference(new Object(), queue);

程序可以通过判断引用队列中是否已经加入虚引用,来了解被引用的对象是否已经被垃圾回收器回收。

 

6. Hashcode的作用。

hash:散列,就是将不同的输入参数,通过算法输出为固定位数输出。即为散列。

散列中1.不同的关键字输出可能相同,称之为碰撞;2.散列值不同,原始输入的参数必定不同;3.如果散列表中存在和原始输入K相同的记录,那么K一定在f(K)的存储位置上。

 

hashCode():

在java中 1.HashCode的设计目的主要是确定任意对象的唯一性和程序查找的快捷性,HashCode用来在散列存储结构中确定对象的内存地址;

2.如果对象的equals相同,hashCode必定相同;

3.如果对象的equals方法被重写,hashCode也应该尽量重写;

4.如果两个对象hashCode相同,不代表对象等同,只是这两个对象在散列存储结构中,存放的一样

 

作用:

使用hashCode值取模的方式,简化数组或者队列的对比次数。

例如:假设数组中有1,2,3,4,如果现在有个新参数,放在以上的任意位置,那么在以后使用查找时候就需要一个个找。

使用hashCode%4取模方式,放在模所在的位置上,找的时候直接找这个位置就可以。

 

 

7. ArrayList、LinkedList、Vector的区别。

三者都是作为List集合接口子类实现,用来存储一些列对象的引用的集合。

1.Arraylist LinkedList是非线程安全的,Vector线程安全。

2.ArrayList Vector使用数组形式存储数据,LinkedList使用链表。

3.向Arraylist和Vector这样使用数组形式增加元素超出当前数组的长度,他们都需要扩展长度。Vector默认自动增长一倍,Arraylist默认50%,因此最后你获得的这个集合真实占用空间比实际大。

现在ArrayList数组初始化大小可以自己设置。

3.ArrayList和Vector从指定的位置index检索一个对象或者在集合末尾插入、删除一个对象需要的时间一样。其它位置时候是线性增长O(n-i) n元素个数,i索引位置,因为要执行n-i个元素位移操作。

4.LinkedList中,任何位置的增删查改都是一样。但是在查找一个元素时候比较慢,O(i)

 

当操作一些列元素的访问。或者仅改变元素的首尾操作,适合Arraylist;大量增加删除任意位置的元素LinkedList.

 

 

8. String、StringBuffer与StringBuilder的区别。

String和StringBuilder非线程安全。StringBuffer线程安全。

1.String是final对象,一旦创建不可更改。当对其改变时候实际上是该引用指向重新创建新的对象。这样大量新对象会挤压内存,GC回收导致程序性能低下;StringBuffer是每次都对原来对象本身进行操作。

2.在String对象的字符串拼接被JVM看成是StringBuffer拼接。String st = "this is a " + "string" == "this is a string"。

3.StringBuffer线程安全的可变字符序列。类似String的字符串缓冲区,本身不能修改,通过append() insert()方法修改该序列的内容和长度。该字符串缓冲区安全地用于多个线程,必要时候对这些方法进行同步,同步顺序与每个线程顺序一致。append(str)方法将字符加载缓冲区末端,insert(index, str)方法加在指定的点。

4.StringBuilder于JDK1.5新增,提供了StringBuffer兼容的API,但是不同步。用于字符串缓冲区被单个线程使用,比StringBuffer快两者方法基本相同。

 

 

9. Map、Set、List、Queue、Stack的特点与用法。

集合类是java中用于集中存储对各数据的。

Collection:一个位置只能一个元素

List Arraylist/LinkedList/Vector 有序可重复

Set HashSet/SortedSet接口的TreeSet 无序不可重复

Queue,先进先出,无法随机访问队列中的元素,poll返回队列头元素

  PriorityQueue,该实现类不是按照元素的加入队列顺序而是按照元素大小重新排序

  Deque接口,双端队列,可以同时从两端添加删除元素

    ArrayQueue基于数组的双端队列。

 

Stack,继承自Vector,先进后出。 

 

Map,键值对。

  HashMap 无序

    LinkedHashMap 有序的HashMap子类

  HashTable实现类Properties子类,处理属性文件,properties类会将Map对象和属性文件关联

  SortedMap
  WeakHashMap,只保存对象的弱引用

  IdentityHashMap,与HashMap类似,只是在key1==key2时候,IdentityHashMap相等。

 

 

 

10. HashMap和HashTable的区别。

1.HashTable是基于Dictionary类,HashMap是Java1.2后Map接口的实现类。

2.HashMap非线程安全,HashTable线程安全。但是Collections集合工具类synchronziedMap(Map)方法提供可返回了线程安全的对象。

3.HashMap中允许key值为null或者没有找到时候,get()返回null,使用containKey()判断

 

Properties类继承自HashTable,使用store() load()分别将对象的内容存储在文件中,load()读取文件,getProperty() setProperty()改变对象。

猜你喜欢

转载自flycw.iteye.com/blog/2375060
今日推荐