Java 基础
1. JDK 和 JRE 有什么区别?
JDK(Java Development Kit):Java开发工具包,是整个java的核心,它包含了jre,java工具(java,javac,jdb等)和java基础类库。它面向开发人员。
JRE(Java Runtime Environment):java运行环境,包含了jvm,java核心类库。它面向程序使用者,它不包含任何开发工具比如编译器和调试器。
(JVM是整个java实现跨平台的最核心的部分,能够运行以java语言写作的软件程序)
二者最明显的区别在于JDK的bin目录下有javac,而JRE没有。
2. == 和 equals 的区别是什么?
==:若是基本数据类型,比较的是二者的值;若是引用类型,比较的是二者的地址值。
equals(Object o):不能比较基本数据类型,基本数据类型不是类类型。
具体内容参考:https://blog.csdn.net/qq_36522306/article/details/80550210
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
错误。
若x.equals(y)返回true,那么俩对象的hashCode()值相等;
若x.equals(y)返回false,那么俩对象的hashCode()值可能相等,可能不等。
4. final 在 Java 中有什么作用?
a) final可以修饰类,这样的类不能被继承。
b) final可以修饰方法,这样的方法不能被重写。(重写:只要子类方法与父类方法同名同参数就是重写)
c) final可以修饰变量,这样的变量的值不能被修改,是常量。
5. Java 中的 Math.round(-1.5) 等于多少?(-1)
Math.round原理是参数+0.5,然后在向下取整,返回值long类型。
-1.5+0.5=-1.0,向下取整是-1。
向下取整(是说取比它小的第一个整数或者和它相等的整数):Math.floor(),返回值double类型
向上取整(是说取比它大的第一个整数或者和它相等的整数):Math.ceil(),返回值double类型
具体内容参考:https://blog.csdn.net/fenggering/article/details/55806408
6. String 属于基础的数据类型吗?
不属于。
基础类型有8个:
整数类型:byte,short,int,long
浮点类型:float,double
逻辑类型:boolean
字符类型:char
7. Java 中操作字符串都有哪些类?它们之间有什么区别?
String:不可变类(指的是不能修改字符串本身),线程不安全
StringBuffer:可变类,线程安全
StringBuilder:可变类,线程不安全,和stringBuffer类似
StringTokenizer:分割字符串的工具类
1).四个字符串类型底层都是使用char数组进行实现.
2).从jdk1.7以后,StringBuffer和StringBuilder均继承自AbstractStringBuilder。提供的方法基本相似,StringBuffer不提供线程同步,StringBuilder是线程同步的,故StringBuilder效率不如StringBuffer
3).对字符串进行操作时,由于String、StringBuffer、StringBuilder都是由char数组实现的,类似append的操作都会重新产生一个新char数组,只不过由于StringBuffer和StringBuilder的char数组并不是final的,所以表现为没有产生新的StringBxxxxx对象,但是内部的char数组value的指向是发生了变化的。
4).对字符串进行操作时,由于String的char数组是final的所以任何对String的操作都会产生一个新的对象,StringBuffer和StringBuilder可以反推。
8. String str="i"与 String str=new String(“i”)一样吗?
""创建的字符串保存在常量池中,而new一个实例会保存在内存中。
二者的==返回false,equals()返回true。
具体内容参考:https://blog.csdn.net/Qian15116170940/article/details/80673949
9. 如何将字符串反转?
String str = "Hello World!";
str.reverse();
10. String 类的常用方法都有那些?
String();equals();length();toLowerCase();toUpperCase();trim();replace()...
具体内容参考:https://blog.csdn.net/qq_25406669/article/details/79021911
11. 抽象类必须要有抽象方法吗?
抽象类可以没有抽象方法,但抽象方法必须有抽象类。
抽象类的定义可参考:https://blog.csdn.net/dove_dove_1802/article/details/82054417
12. 普通类和抽象类有哪些区别?
1).抽象类不能被实例化。
2).抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
3).抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
4).含有抽象方法的类必须申明为抽象类
5).抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。
13. 抽象类能使用 final 修饰吗?
final关键字不能用来抽象类和接口。
final用法参考:https://www.cnblogs.com/huiyuantang/p/5422317.html
14. 接口和抽象类有什么区别?
接口:由全局静态常量和抽象方法组成
抽象类:必须用abstract关键字声明,可以声明抽象方法
二者的共同点:
I).都不能被实例化
II).抽象方法都没有方法体
III).二者的子类都只有实现了他们当中的所有抽象方法后才能被实例化
IIII).如果接口的实现类不能全部实现当中抽象方法,那么该类只能是抽象类,抽象类也是一样,他的继承类不能全部实现当中全部抽象方法,它也只能是抽象类
不同点:
I).接口中只能声明抽象方法;
抽象类中既可以声明抽象方法,还可以实现普通方法;
II).接口中的成员变量只能public static final,即使不用关键字声明,也是一样的;
抽象类的成员变量和普通类的一样;
III).接口中的抽象方法只能是public abstract的,即使不用关键字声明,也是一样的;
抽象类中的抽象方法必须用abstract声明,且不能是private的,不能是static的,因为要被子类实现
IIII).接口可以多实现;
抽象类只能单继承
15. Java 中 IO 流分为几种?
根据处理类型的不同分为:字节流和字符流,
根据流向的不同分为:输入流和输出流
具体内容参考:https://www.cnblogs.com/QQ846300233/p/6046388.html
16. BIO、NIO、AIO 有什么区别?
BIO:线程发起IO请求,不管内核是否准备好数据,线程一直阻塞,直到IO操作完成。
##同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
NIO:线程发起IO请求,立即返回。内核做好数据准备后,通过调用注册的回调函数通知线程做IO操作,线程阻塞,直到操作完成。
##同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
AIO:线程发起IO请求,立即返回。内核做好数据准备后,并且进行IO操作,直到操作完成或者失败,再通过调用注册的回调函数通知线程操作成功或失败。
##异步非阻塞,服务器实现模式为一个有效请求一个线程,即客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
具体内容参考:https://blog.csdn.net/u013068377/article/details/70312551
17. Files的常用方法都有哪些?
请参考:https://www.cnblogs.com/wangjinlong-padan/p/6382924.html
---------------------------------------------------------------------------------------------------------------------------