原文地址https://blog.csdn.net/fangchao2011/article/details/89184058
Java基础
1.JDK和JRE的区别?
- JDK:Java Development Kit的简称,Java开发工具包,提供了Java的开发环境和运行环境
- JRE:Java Runtime Environment的简称,Java运行环境,为Java提供了所需环境
JDK包含JRE,同时包含Java的源码编译器javac,还包含了很多Java程序调试和分析的工具
简单来说:如果你需要运行Java程序,只需安装JRE就可以了,如果需要编写Java程序,就需安装JDK
2.==和equals的区别?
- ==用来比较基本类型,比较的是值是否相同,用来比较引用类型,比较的是引用地址是否相同
- equals本质上就是==,只不过String和Integer等重写了equals的方法
//equals的源码,实际上也是用==
public boolean equals(Object obj) {
return (this == obj);
}
//String类重写了Object的equals的源码,将引用比较变成了值比较
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
总结:==对于基本类型来说是值比较,对于引用类型来说是比较的引用地址;而equals默认情况下是引用比较,只是很多类重写了equals的方法,比如String、Integer等把它变成了值比较,所以一般情况下equals是表的值是否相等
3.俩个对象的hashCode相同,则equals()也一定为true,对吗?
不对,俩个对象的hashCode()相同,则equals()不一定为true,把它变成了值的比较
String str1 = "通话";
String str2 = "重地";
//str1:1179395 | str2:1179395
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2)); //false
4.final在Java中的作用
- final修饰类叫最终类,该类不能不继承。
- final修饰方法,该方法不能被重写。
- final修饰变量叫常量,常量必须初始化,初始化之后值就不能被改变
5.java 中的 Math.round(-1.5) 和Math.round(1.5)分别等于多少?
等于 -1和2。
6.String 属于基础的数据类型吗?
String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
7.java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。
- String是不可变对象,每次操作都会生成新的对象,StringBuffer、StringBuilder可变
- StringBuffer是线程安全的,效率较低;StringBuilder是线程不安全的,效率较高。
8.String str="i"与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
9.如何将字符串反转?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba
10.String 类的常用方法都有那些?
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():分割字符串,返回一个分割后的字符串数组。
- getBytes():返回字符串的 byte 类型数组。
- length():返回字符串长度。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- substring():截取字符串。
- equals():字符串比较。
11.抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法
12.普通类和抽象类有哪些区别?
- 普通类不能包含抽象方法,抽象类可以包含抽象方法。
- 抽象类不能直接实例化,普通类可以直接实例化。
13.抽象类能使用 final 修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,编辑器也会提示错误信息:
14.接口和抽象类有什么区别?
- 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。
- main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
15.java 中 IO 流分为几种?
按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。
16.BIO、NIO、AIO 有什么区别?
- BIO:BLOCK IO 同步阻塞IO,就是我们平常使用的传统IO。它的特点是模式简单,使用方便。并发处理能力低。
- NIO:New IO同步非阻塞IO,是传统IO的升级,客户端和服务端通过Channel(通道)通讯,实现了多路复用。
AIO:Synchronized IO,是NIO的升级,也将NIO,实现了异步非堵塞IO,异步IO的操作基于事件和回调机制。
17.Files的常用方法都有哪些?
- Files.exists():检测文件路径是否存在。
- Files.createFile():创建文件。
- Files.createDirectory():创建文件夹。
- Files.delete():删除一个文件或目录。
- Files.copy():复制文件。
- Files.move():移动文件。
- Files.size():查看文件个数。
- Files.read():读取文件。
- Files.write():写入文件。