java基础面试

时间:2021-08-03 09:04:11

1. String类为什么是final的。

安全性:如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都

是以字符串的形式传入。

主要作用在于:因为对象不可变,因此对于所有线程都是只读的,多线程访问时,即使不加同步也不会产生数据的不一致,故减少了系统开销

2. HashMap的源码,实现原理,底层结构。

喜欢读源码的尽管去读(哈哈):http://www.cnblogs.com/hzmark/archive/2012/12/24/HashMap.html

3. 说说你知道的几个Java集合类:list、set、queue、map实现类

4. 描述一下ArrayList和LinkedList各自实现和区别

5. Java中的队列都有哪些,有什么区别。

6. 反射中,Class.forName和Classloader的区别

Class.forName(className)装载的class已经被初始化,

而ClassLoader.loadClass(className)装载的class还没有被link。

7. Java7、Java8

8. Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高

9. Java内存泄露的问题调查定位:jmap,jstack的使用等等

10. string、stringbuilder、stringbuffer区别

String 字符串常量 
StringBuffer 字符串变量(线程安全) 
StringBuilder 字符串变量(非线程安全)
String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都是String类的对象。字符串是常量;它们的值在创建之后不能改变。所以可以共享它们。StringBuffer是字符串缓存区,它的内容可以被修改,长度也可以改变,StringBuffer类是线程安全的,也就是说多个线程可以安全的访问StringBuffer对象。StringBuilder与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,如果你只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。值得注意的是StringBuilder是在JDK1.5版本中增加的。以前版本的JDK不能使用该类。
 

11. hashtable和hashmap的区别

13 .异常的结构,运行时异常和非运行时异常,各举个例子

14. String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果

15. String 类的常用方法

16. Java 的引用类型有哪几种

强引用:如果一个对象具有强引用,那垃圾回收器绝不会回收它,如:Person p = new Person();

软引用: 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

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

弱引用: 弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存

虚引用:

17. 抽象类和接口的区别

1.抽象类可以有构造方法,接口中不能有构造方法。  
2.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
3.抽象类中可以有普通成员变量,接口中没有普通成员变量 
4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
7. 一个类可以实现多个接口,但只能继承一个抽象类
 

18. java的基本数据类型和字节大小。

8种:六种数字类型(四个整型,两个浮点型),一种字符类型,还有一种布尔型

byte       1个字节     -128到127
short      2个字节     -32,768到32,767
int         4个字节     -2,147,483,648到2,147,483,647
long       8个字节     -9,223,372,036,854,775,808L到9,223,372,036,854,775,807L

float       4个字节   约+-3.40282347E+38F(6~7个有效的十进制数位)   绝对值:1.4E-45~3.4E38
double    8个字节   约+-1.79769313486231570E+308(15个有效数位)   绝对值:4.9E-324~1.8E308

char        1个字节

boolean   1个字节

低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double

注意:java中如果碰到char、byte和short参与运算时,会自动将这些值转换为int类型然后再进行运算。

19. Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题(建议熟悉 jdk 源码,才能从容应答)

20. 如果不让你用Java Jdk提供的工具,你自己实现一个Map,你怎么做。说了好久,说了HashMap源代码,如果我做,就会借鉴HashMap的原理,说了一通HashMap实现

21. Hash冲突怎么办?哪些解决散列冲突的方法?

22. HashMap冲突很厉害,最差性能,你会怎么解决?从O(n)提升到log(n)咯,用二叉排序树的思路说了一通

23. rehash

24. hashCode() 与 equals() 生成算法、方法怎么重写

http://bijian1013.iteye.com/blog/1972404

原理:http://www.cnblogs.com/dolphin0520/p/3681042.html

hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。

原理:

当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode

值,

如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;

如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址

hashCode有些JVM在实现时是直接返回对象的存储地址,但是大多时候并不是这样,只能说可能存储地址有一定关联

注意:在重写equals方法的同时,必须重写hashCode方法。

25、java各种工具的介绍

java.exe是java虚拟机
javadoc.exe用来制作java文档
jdb.exe是java的调试器
javaprof.exe是剖析工具
 
26、匿名内部类是什么?如何访问在其外面定义的变量?
 
使用的形参为何要为final?

为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。

故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。

 
匿名内部类如何初始化?
一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没有构造器的。
使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果
 
注意:

     1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

2、匿名内部类中是不能定义构造函数的。

3、匿名内部类中不能存在任何的静态成员变量和静态方法。

4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

28、Java 基类Object,equals和hashcode,什么时候重写?

29、 Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。

30、