java基础部分面试题

来源:互联网 发布:马歇尔 知乎 编辑:程序博客网 时间:2024/05/16 04:44

1.String类为什么是final类,String类的认识,String类的常用方法有哪些?

主要是为了安全性和效率的缘故:
String类被final修饰,不能被继承,也就不会被重写其中的方法,避免了因为继承引起的安全隐患。
String类经常被使用,不能被继承,可以提高执行效率。

从String类的源码可以看出:
String类是final类,public final class String 
String类的本质是一个字符数组char[],并且其值不可变,private final char value[];


String有三种创建方式:
String s = new String("1");
String s = "1";
String s = "1" + "2";

使用任意一种方式创建字符串,jvm都会去常量池中去判断是否存在相同的字符串对象,不存在,就会添加一个新的字符串,存在,就不会添加。
当使用new关键字来创建子串时,一定会在堆区或栈区创建一个新的对象。


常用方法:
length(),subString(),toUpperCase(),toLowerCase(),replace(oldChar,newChar),indexOf(),trim(),equals(),comapreTo()

2.数组是不可以改变长度的。

3.java反射机制的理解,class.forName()和classloader的区别。

java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的方法和属性。这种动态获取信息以及动态调用对象的方法的功能成为java的反射机制。
java反射机制可以提供下面几个用途:
运行是判断任意一个对象所属的类
运行时构造任意一个类的对象
运行时判断一个类所具有的成员变量和方法
运行时调用任意一个对象的方法

Class.forName()除了将.class文件加载到jvm中外,还会对类进行解释,执行类中的static块。
classloader只是将.class文件加载到jvm中,不会执行static内容,只有在newInstance才会执行static块。

4.java内存泄漏的了解

内存泄漏就是对象已经不被应用程序使用,但是垃圾回收器没有办法回收它们,因为它们还在被引用着。
比如A对象引用B对象,A的生命周期比B的长的多,当B对象没有被A对象使用之后,A对象仍然在引用着B对象,这样垃圾回收器就没办法回收B对象。如果存在很多的这样的对象,就会消耗内存。

5.io里面的常见的类

InputStream,OutpuStream-->File,ByteArray,Object,Buffered,Data
Writer,Reader-->CharArray,String,Filter,Buffered,InputStreamReader(字节流转为字符流),OutputStreamWriter(字符流转为字节流)

6.java线程中,wait()与sleep()方法的区别

sleep()时thread类中的方法,wait()时Object类中的方法。
sleep()必须指定线程阻塞的时间,时间结束后自动恢复运行状态,且不会释放对象锁。
wait()可以指定时间,也可以不指定,当时间结束或者调用notify()方法后获取对象锁进入运行状态,会释放对象锁。

线程的状态:新建、就绪、运行、等待/阻塞/睡眠、死亡:stop()会产生异常;destroy()是强制终止,不会释放锁。

7.final的作用

被final修饰的类,不能被继承,没有子类,final类中的方法默认也都是final的。
final方法不能被子类的方法覆盖,但是可以被继承。
final成员变量表示常量,必须初始化,且只能赋值一次,赋值后不在改变。
final不能用于修饰构造函数。

8.Error和Exception的区别

Error类和Exception类都是Throwable类的子类,区别是:
Error一般是指和虚拟机相关的问题,如系统崩溃、虚拟机错误、内存空间不足、方法调用栈溢等。仅靠程序本身是无法恢复的,建议立即终止程序。
Exception表示程序可以处理的异常,可以捕获且可以恢复。遇到这种异常,应尽可能处理异常,使程序恢复运行。

Exception又可以分为运行时异常(RuntimeException)和受检查的异常(Checked Exception),运行时异常编译可以通过,但运行时会终止。受检查异常要么try,catch处理,要么用throws关键字抛出,交给父类处理,否则编译不能通过。

常见的运行是异常:
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 数组下标越界异常
ArithmaticException 算数异常
IlegalArgumentException 参数不合法异常

9.说一说你对 java.lang.Object 对象中 hashCode  equals 方法的理解。在什么场景下需要重新实现这两个方法。

每个对象都有hashCode方法和equals方法,因为它们是Object类的方法。
两个对象的方法相同,则hashcode方法一定相同。
hashcode方法是根据哈希算法返回对象在内存中的地址,是为了提高在散列存储结构中查找的效率,在线性表比如ArrayList中没有作用。

当需要比较两个对象是否相同,而不是比较它们的内存地址相同的时候。一般实现了equals方法,必须对应的实现hashCode方法。
Java 中的 HashSet 内部是如何工作的。
Java 中的 HashSet 内部是如何工作的。

10.java中HashSet内部是如何工作的。

所有实现了Set接口的类的内部都是用map来进行支撑的。HashSet用HashMap对其内部对象进行排序。
HaseSet的add方法,调用HashMap的put方法,将输入的值作为key,常量"PRESET"作为值传过去。

原创粉丝点击