Java基础知识库:
1.JDK 和 JRE 有什么区别?
1)JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
2)JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。
2.i++与++i 的区别
1)i++:前缀自增自减法,先进行自增或者自减运算,再进行表达式运算;
2)++i:后缀自增自减法,先进行表达式运算,再进行自增或者自减运算。
3.break 语句与 continue 语句的作用
1)Break 语句将中断整个循环体,跳出循环,执行后续语句。
2)Continue 语句将结束本次循环,返回到循环开始处,开始新的一次循环。
4.实现一个单独线程中执行一个任务的简单过程
1)将任务代码移到实现了 Runnable 接口的类的 run 方法中,由于 Runnable
是一个函数式接口,则可用 lambda 表达式; Runnable r=()->{task code};
2)Thread t=new Thread(r);
3)t.start();
5.在一个 Java 程序中启动一个外部的程序
String cmd =“外部程序所在目录”;
Process process=Runtime.getRuntime().exec(cmd);使用 Runtime 类执行启动外部程序
6.线程 interrupted 与 isInterrupted 的区别
1)interrupted 方法是一个静态方法,它检测当前的线程是否被中断,调用 interrupted 方法会清除该线程的中断状态。
2)isInterrupted 方法是一个实例方法,可用来检测是否有线程被中断,调用这个方法不会改变线程的中断状态。
7.线程的 6 种状态
1)New 新创建
2)Runnable 可运行
3)Blocked 被阻塞
4)Waiting 等待
5)Timed waiting 计时等待
6)Terminated 终止
8.要确定一个线程的当前状态应调用
确定一个线程的当前状态,应调用 t.getState();
9.如何打印数组中的所有值
利用 Arrays 类的 toString 方法打印数组中的所有值。
例:
Int[ ] a=new Int[6];
System.out.println(Arrays.toString(a));
10. == 和 equals 的区别是什么?
== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
11.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,两个对象的 hashCode()相同,equals()不一定 true;equals()相同,则 hashCode()一定相同。
12.final 在 java 中有什么作用?
1)final 修饰的类叫最终类,该类不能被继承。
2)final 修饰的方法不能被重写。
3)final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
13. java 中的 Math.round(-1.5) 等于多少?
等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。
14.String 属于基础的数据类型吗?
String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
15.java 中操作字符串都有哪些类?它们之间有什么区别?
1)操作字符串的类有:String、StringBuffer、StringBuilder。
2)String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。少量字符串操作可用string,大量字符串则使用StringBuffer和StringBuilder。
3)StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
16.String str="i"与 String str=new String("i")一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。
17.如何将字符串反转?
使用 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
18.String 类的常用方法都有那些?
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():分割字符串,返回一个分割后的字符串数组。
- getBytes():返回字符串的 byte 类型数组。
- length():返回字符串长度。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- substring():截取字符串。
- equals():字符串比较。
19.抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法;
示例代码:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
20.普通类和抽象类有哪些区别?
- 普通类不能包含抽象方法,抽象类可以包含抽象方法。
- 抽象类不能直接实例化,普通类可以直接实例化。
21. 抽象类能使用 final 修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:
22. 接口和抽象类有什么区别?
1)实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
2)构造函数:抽象类可以有构造函数;接口不能有。
3)main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
4)实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
5)访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
6)抽象类强调的是关系从属,接口强调的是功能实现。
7)继承抽象类的子类可以有选择的实现父类的抽象方法;而实现接口的类需要实现接口的所有方法。
23. java 中 IO 流分为几种?
按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
24. BIO、NIO、AIO 有什么区别?
1)BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
2)NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
3)AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
25. Files的常用方法都有哪些?
1)Files.exists():检测文件路径是否存在。
2)Files.createFile():创建文件。
3)Files.createDirectory():创建文件夹。
4)Files.delete():删除一个文件或目录。
5)Files.copy():复制文件。
6)Files.move():移动文件。
7)Files.size():查看文件个数。
8)Files.read():读取文件。
9)Files.write():写入文件。
26.字符串存储的机制是什么?
字符串会存储在常量池中。在给字符串赋值的时候,JVM 会检查常量池中是否已经存在该字符串,如果存在则直接引用该地址,否则会在常量池中创建该字符串然后引用该地址。
27.值传递与引用传递的区别?
1)值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时
的 存储单元(方法内的局部变量),因此性参与实参虽然有着相同的值,但是却有着不用的
存储单 元,因此对形参的改变不会影响实参的值。
2)引用传递:在方法的调用中,传递的是
对象(也可以看做是对象的地址),这时形参与实参指向 同一块存储单元(对象),因此对
形参的修改就会影响实参的值。
28.Instanceof 有什么作用?
Instanceof 的作用是判断一个引用类型的变量所指向的对象是否是一个类的实例。
29.super 与 this 的异同?
不同点:
1)super()主要是对父类构造函数的调用,this()是对重载构造函数的调用
2)super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用;this() 主要是在同一类的不同构造函数中的使用
相同点:
1)super()和 this()都必须在构造函数的第一行进行调用,否则就是错误的
30.构造器如何工作?
Java 在构造实例时的顺序是这样的:
1)分配对象空间,并将对象中成员初始化为 0 或者空,java 不允许用户操纵一个不定值的对象。
2)执行属性值的显式初始化
3)执行构造器
4 )将变量关联到堆中的对象上
31.构造器 Constructor 是否可被 override?
构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload。
Constructor 不能被继承,所以 Constructor 也就不能被 override。每一个类必须有自己的构造函
数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须负责在一开始调用父
类的构造函数。
32.try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally{}里的 code 会不会被
执行,什么时候被执行,在 return前还是后?
会执行,try{}中的 return 执行后在没有返回数据时先去执行 finally{}中的代码,然后再返回。
33.类有哪三个基本特性?各特性的优点?
1)类具有封装性、继承性和多态性。
2)封装性:类的封装性为类的成员提供公有、缺省、保护和私有等访问权限,目的是隐藏类中
的私有变量和类中方法的实现细节。
3)继承性:允许通过继承原有类的某些特性或全部特性而产生全新的类,原有的累称为父类,
产生的新类称为子类。子类不仅可以直接继承父类的共性,而且也可以创建它特有的个性。
4)多态性:是指在基类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现
出不同行为,多态性有两种表现形式:重载和覆盖。
创建一个指定路径的文件,并验证该路径是否有指定文件
File file = new File(pathName); file.createNewFile(); file.exists()返回boolean验证该路径是否存在
指定文件。
35.如何将一个数组转换成一个 List 集合
1)数组的工具类 Arrays 提供了一个静态方法 asList,可以将一个数组转换为一个 List 集合。
2)List<String> list=Arrays.asList(array)。
3)由数组转过来的 List 集合不能增删元素。
36.如何从一个集合得到数组
1)使用 toArray 方法
2)String[ ] values=集合对象.toArray(new String[x])
37.对象的相等与指向它们的引用相等有什么不同?
对象的相等一般指对象本身所包含的内容相等,指向对象的引用相等则是指指向对象的首地址相同,所以两者有着本质的不同。