1、JDK和JRE的区别?
JDK:Java开发工具包,提供了Java的开发和运行环境
JRE:Java运行环境
2、== 和equals的区别?
== 是关系运算符:
基本类型,比较的是值;
引用类型,比较的是地址;
equals是方法,来自基类Object公共方法。
来自Object的equals方法,比较的是地址。一般子类会通过反写进行内容的比较。
面试相关问题:String类型对象使用equals和==比较结果一致吗?不一致,String类中重写了equals方法,使其用于比较字符串的内容,而==是用来比较是否指向同一个地址。
3、两个对象的hashCode相同,equals一定返回true吗?
不一定;
hashCode:基类返回的hash值是对象的内存地址。但是可以通过重写,使得hash值来自对象的内容。这样如果hash值相同,可能是内容一致的两个对象,未重写的equals比较的是两个对象的地址,就会不返回true。因此重写hashCode就必须重写equals方法。
4、final在Java中有什么作用? 详解
final在Java中
- 修饰基本数据类型变量,则该变量初始化后数值就不可以改变了;
- 修改引用类型变量的时候,该引用类型的地址就不可以改变了,但是地址内存放的内容可以改变;
- 修饰常量,常量会在编译阶段放进常量池;
- 修饰方法,使得所有子类都不可以重写该方法。
- 修饰类,该类不可以被继承。String 类就被final修饰的,因而不可以被继承。
5、String 属于基本数据类型吗?
String 是引用类型,不属于基本类型。
基本类型包括 byte,short,char,int ,long,double,float,boolean。
Java内存模型(JMM)保证除long 和 double 以外的基础数据类型的读写操作是原子性的。
面试相关问题:int类型可以强制转换成boolean类型?不可以
面试相关问题:引用类型与基本类型的区别?举例说明:答案
6、Java中操作字符串有哪些,之间的区别是什么?
String ,StringBuffer,StringBulider
String 是字符串常量,无法改变字符串的内容,如果改变则创建一个新对象指向修改后的内容。所以经常改变的字符串变量不适合用String,StringBuffer和StringBuild是字符串变量,区别就在于 StringBuffer是线程安全的 ,StringBuilder不是线程安全的。但StringBuilder的效率高于StringBuffer
7、String s1= "abc" 和 String s2 = new String("abc") 一样吗?
String类型 的 享元模式的应用
不一样。内存分配方式不一样,前者分配到常量池中,后者分配到堆中。jvm内存相关
String s1 = "abc" :Java虚拟机会将其分配到常量池中。
在栈中创建一个s1的变量的引用,如果String池中没有"abc"存在,就在常量池中创建一个String类型的"abc"对象,有就直接将"abc"的地址赋给s1;
String s2 = new String("abc"):会被分配到堆内存中。
在栈中创建一个s2的变量的引用,如果String池中没有abc的存在,就在常量池中创建一个String类型的"abc",然后通过new关键字在堆中创建一个String对象。并将new创建的对象的地址赋值给s2。
8、如何将字符串反转
可以使用StringBulider 或者 StringBuffer 的 reverse() 方法。源码如下:
9、String 类中常用的方法有哪些?
答案
10、抽象类必须有抽象方法吗?
不一定,抽象类不一定非要有抽象方法。
11、抽象类和普通类有什么区别?
普通类不包含抽象方法,抽象类可以包含抽象方法。
普通类可以直接实例化,抽象类不可以直接实例化。
12、 抽象类能使用final修饰吗?
不可以,定义抽象类是为了让其他类继承,但是final修饰的类是不可以被继承的。
13、抽象类和接口有什么区别?
答案
14、Java中的IO流分几种?
按照功能分:输入流和输出流
按照类型分:字节流和字符流,字节流按照8位传输以字节为单位输入输出数据,字符流按照16位传输以字符为单位输入输出。
15、BIO,NIO,AIO有什么区别?
- BIO 同步阻塞式IO,就是传统IO,并发能力差
- NIO 同步非阻塞式IO,BIO的升级,客户端和服务器端通过channel通讯,实现多路复用
- AIO 异步非阻塞式IO,NIO的升级,异步IO的操作基于事件和回调机制。
16、同步和异步的区别
同步:就是事情必须一件一件的做,一件做完了才可以做下一件,在进程中的表现就发出一个功能调用,未得到结果之前,该请求不可以返回。
异步:只要发布请求即可,无需等待结果返回。线程池和消息队列就是为了达到该目的。