java for 面试题_java面试题汇总

一.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则会导致对对象的访问不是线程安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值