关于java:java面试题汇总

41次阅读

共计 4311 个字符,预计需要花费 11 分钟才能阅读完成。

一.Java 根底

1.JDK 和 JRE 有什么区别?

JDK:是 Java 开发运行环境。
JRE:是 Java 运行环境,是运行编译后的 Java 程序所必须的包,蕴含 JVM,Java 根底类库,Java 命令和其余基础设施,但不能用于创立新程序。
JDK 蕴含了 JRE,JRE 中蕴含了虚拟机 JVM。
JDK 蕴含的根本组件包含:
javac:编译器,将源程序转成字节码
jar:打包工具,将相干的类文件打包成一个文件。
javadoc:文档生成器,从源码正文中提取文档
java:运行编译后的 java 程序(.class 后缀的)

2.== 和 equals 的区别?

== 是判断两个变量或实例是不是指向同一个内存空间,equals 是判断两个变量或实例所指向的内存空间的值是不是雷同。
== 是指对内存地址进行比拟,equals()是对字符串的内容进行比拟
== 指援用是否雷同,equals()指的是值是否雷同。

3. 两个对象的 hashCode()雷同, 则 equals()也肯定为 true, 对吗?

不对,两个对象的 hashCode()雷同,equals()也不肯定 true。
因为在散列表中,hashCode()相等即两个键值对的哈希值相等, 然而哈希值相等, 并不一定能得出键值对相等。

4.final 在 java 中有什么作用?

final 润饰的类叫做最终类,不能被继承
final 润饰的办法不能被重写
final 润饰的变量叫做常量,常量必须初始化,初始化之后值就不能被批改。

5.java 中的 Math.round(-1.5)等于多少?

Math.round_() 函数返回一个数字四舍五入后最靠近的整数,所有等于 1

6.String 属于根底的数据类型吗?

String 不属于根本数据类型,根本数据类型只有 8 中,byte、boolean、short、char、int、float、long、double。其余都是援用类型。

7.java 中操作字符串都有哪些类? 它们之间有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 申明的是不可变的对象,每次操作都会生成新的 String 对象,而后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 能够在原有对象的根底上进行操作,所以在常常扭转字符串内容的状况下最好不要应用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程平安的,而 StringBuilder 是非线程平安的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下举荐应用 StringBuilder,多线程环境下举荐应用 StringBuffer。
在运行速度上:StringBuilder>StringBuffer>String
String 为字符串常量,而 StringBuider 和 StringBuffer 均为字符串变量,即 String 对象一旦创立之后该对象是不可更改的,但后两者的对象时变量,是能够更改的。
String:实用于大量的字符串操作的状况
StringBuilder:实用于单线程下在字符缓冲区进行大量操作的状况
StringBuffer:应用多线程下在字符缓冲区进行大量操作的状况。

8.String str=”abc” 与 String str=new String(“abc”)一样吗?

不一样。认为内存的调配形式不一样,String str=”abc” 的形式,java 虚构机会将调配到常量池中,而 String str=new String(“i”) 则会被分到堆内存中。

9. 如何将字符串反转?

1. 利用 StringBuffer 或 StringBuilder 的 reverse 成员办法:

return new StringBuilder(str).reverse().toString();

2. 利用 String 的 toCharArray 办法先将字符串转化为 char 类型数组,而后将各个字符进行从新拼接:

char[] chars = str.toCharArray();
String reverse = "";
for (int i = chars.length - 1; i >= 0; i--) {reverse += chars[i];
}

3. 利用 String 的 CharAt 办法取出字符串中的各个字符:

String reverse = "";
int length = str.length();
for (int i = 0; i < length; i++) {reverse = str.charAt(i) + reverse;
}
10.String 类的罕用办法都有哪些?

indexOf(): 返回指定字符的索引
charAt(): 返回指定索引处的字符
replace(): 字符串替换
trim(): 去除两端的空白
concat(): 在原有的前面拼接指定数据
endswith(): 判断是否已指定数据结尾
lastIndexOf(): 获取最初一次呈现的索引值
isEmpty(): 判断字符串是否为空
replace(): 把原有的 a 替换成 b
startwith(): 判断字符串是否已指定数据开始
substring(): 从下标为指定数据的地位开始向后截取字符串
toUpperCase(): 把字符串转化为大写
getBytes(): 把字符串的数据存入 byte[] 中
split(): 依照规定, 切割字符串

11. 抽象类必须要有形象办法吗?

不须要,抽象类不肯定非要有形象办法。然而如果你的一个类曾经申明成了抽象类,即便这个类没有形象办法,也不能再实例化,即不能间接构建一个该类的对象。

12. 一般类和抽象类的区别有哪些?

一般类不能蕴含形象办法,抽象类能够蕴含形象办法。
一般类能够间接实例化,抽象类不能间接实例化。

13. 抽象类能应用 final 润饰吗?

不能,定义抽象类就是让其余类继承的,如果定义为 finnal 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能润饰抽象类。

14. 接口和抽象类有什么区别?

相同点:
抽象类和接口都是形象层;
都不能被实例化。
不同点:
构造方法:抽象类里有,接口没有
成员变量:抽象类里有,接口里没有,接口中都是常量
成员办法:抽象类能够有一般办法和形象办法,但接口里都是形象方(JDK1.8 当前能够有一般办法)
抽象类里没有简写模式,但接口外面有

15. java 中 IO 流分为几种?

IO 流按性能划分:输出流(input)、输入流(output)
按类型划分:字节流和字符流
字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 为传输以字符为单位输入输出数据。

16.BIO、NIO、AIO 有什么区别?

BIO:(BlicI/O)同步阻塞 I / O 模式,数据的读取写入必须阻塞在一个线程内期待其实现。能够让每一个连贯专一于本人的 I/O 并且编程模型简略,也不必过多思考零碎的过载、限流。特点是模式简略使用方便,并发解决能力低。
NIO:(NewI/O)一种同步非阻塞的 I / O 模型,是传统 IO 的降级,它反对面向缓冲的,基于通道的 I / O 操作方法。客户端和服务器端通过 Channel(通道)通信,实现了多路复用。
AIO:(AsynchronousI/O)是 NIO 的降级,也叫 NIO2,异步 IO 是基于事件和回调机制实现的,也就是利用操作之后会间接返回,不会梗塞在那里,实现了异步非梗塞 IO,异步 IO 的操作基于工夫和回调机制。

18.break 和 continue 的区别有哪些?

break 和 continue 都能够让循环停下来,break 是立即停,continue 这次停下次还能够。
break 和 continue 不是哪里都能用的,是用在循环构造中的。
break 和 continue 关键字的前面不能够呈现呢代码,否则就是 Unreachable code(执行不到的代码)。

19.for、while、do…while 三种循环的区别?

for(开始地位;循环条件;变动条件){循环体}
while(循环条件){循环体}
do{循环体}while(循环条件)
相同点:for 循环须要晓得开始地位,并且晓得要循环多少次,还要晓得数据变动的法则
while 和 do…while 不须要晓得从哪开始循环多少次,只须要指定条件就行。
while– 是要先满足了判断条件才执行
do…while– 是要起码执行 1 次循环体

20. 重载(Overload)和重写(Override)的区别?

重载:是在同一个类当中有很多个名称雷同办法,但各个雷同办法的参数列表不同。
重写:产生在不同的类中,存在继承关系,重写是办法名字和参数列表雷同,当父类的方发不能满足时,子类重写为本人须要的。

21.this 和 super 的区别?

(1)代表的事物不同
super 代表的是父类空间的援用
this 代表的是所属函数的调用者对象
(2) 应用前提不同
super 必须要有继承关系能力应用
this 不须要继承关系也能应用
(3) 调用的构造函数不同
super:调用父类的构造函数
this:调用所属类的构造函数

22. 讲讲动态代码块、结构代码块和部分代码块?

动态代码块 – 地位:在成员地位(类里办法外)。– 作用:实现我的项目初始化 – 触发节点:类加载时。
结构代码块 – 地位:在成员地位(类里办法外)。– 作用:抽取构造方法的共性。– 触发节点:创建对象时。
部分代码块 – 地位:在部分地位(办法里)。– 作用:控制变量的作用范畴。– 触发节点:办法执行时。
执行程序:动态代码块 > 结构代码块 > 部分代码块

23. 过程和线程的区别?

过程:指的是正在运行的程序,有的程序依赖一个过程,有的程序能够依赖多个过程。
线程:是操作系统可能调度的最小单位,过程蕴含线程。(单线程程序效率低,多线程程序效率高)

24. 并发和并行的区别?

并发: 是指同一时刻,共享资源被多个线程抢占。
并行:同一时刻,能够执行多个工作,然而不产生抢占资源的景象,各干各的相互不烦扰。

25. 线程的状态有哪些?

线程有五种状态。
新建状态(刚 new 进去的线程)
就绪状态(期待 CPU 的调度)
运行状态(正式开始执行工作)
阻塞状态(线程以各种形式进入阻塞状态)期待阻塞、同步阻塞、其余阻塞
死亡状态(线程执行完或因异样退出)

26. 懒汉式和饿汉式的区别?

饿汉式(线程平安,调用率高,然而不能提早加载)。
饿汉式是线程平安的,在类创立的同时就曾经创立好一动态的对象共零碎应用,当前不在扭转
懒汉式(线程平安,调用效率不高,能够提早加载)
懒汉式如果在创立实例对象时不加上 synchronized 则会导致对对象的拜访不是线程平安。

正文完
 0