Java面试知识点1

1.JDK 和 JRE 有什么区别?

JDK是java的开发工具包,包含各类库和工具
JDK->面向->开发人员使用的SDK->用途->1.开发环境 2.运行环境
JRE核心的内容就是JVM(java虚拟机)及核心类库
JRE->面向->程序使用者>用途->1.开发环境 2.运行环境

2.==和equals的区别是什么?

= =是关系运算符,equals是方法,结果都返回布尔值。
= =基本类型比较是否相等,引用类型比较的是两个引用在内存中的地址是否相同,也就是说在内存中的地址是否一样。
equals方法是由Object类提供,可以由子类来进行重写。JDK中的类一般已经重写了equals,比较的是内容。自定义类如果没有重写equals,将调用父类equals,默认的实现只有当对象和自身进行比较时才会返回true,这个时候和“==”是等价的

3.基本类型和包装类对象使用的==和equals进行比较的结果?

1.值不同,都返回false
2.值相同
使用==比较,基本类型-基本类型,基本类型-包装对象->true,包装对象-包装对象->false,缓存中取的包装对象比较返回true(因为JVM缓存部分基本类型常用包装类对象,如Integer-128~127是被缓存的)
使用equals比较,都返回true(因为拆箱和装箱)
3.不同类型的对象对比,返回false

4.什么是装箱?什么是拆箱?装箱和拆箱的执行过程?

装箱:基本类型转换为包装器类型的过程。
拆箱:包装器类型转换为基本类型的过程。
装箱是通过调用包装器类的valueOf方法实现的,拆箱是通过调用包装器类的xxxValue方法实现的,xxx代表对象基本数据类型,如int装箱就是调用Integer的valueOf(int)方法,Integer拆箱就是调用Integer的intValue方法。
整型的包装类valueOf方法返回对象时,在常用的取值范围内,会返回缓存对象,浮点型的包装类valueOf方法返回新的对象,布尔类型的valueOf方法Boolean类的静态常量true|false。
包含算数运算会自动拆箱。存在大量自动装箱的过程,如果装箱返回的包装对象不是从缓存中获取,会创建很多新对象,较消耗内存。

5.hashCode()相同,则equals()也一定为true,对吗?

不一定,反过来,equals为true,hashCode也不一定相同。
类的hashCode方法和equals方法都可以重写,返回的值完全在于自己定义。
hashCode()返回该对象的哈希吗值,equals()返回两个对象是否相等。
两个对象用equals比较返回true,则两个对象的hashCode方法必定返回相同结果;两个对象用equals比较返回false,不重写hashCode方法也一定返回不同值,但最好返回不同值,以提高哈希表性能。
重写equals方法,必须重写hashCode方法。以保证equals方法相等时两个对象hashCode返回相同值。

6.final在java中有什么作用?final、finally、finalize区别,finally语句块一定执行吗?

final在Java中的作用:
1.被final修饰的类,不能被继承。
2.被final修饰的成员变量必须要初始化赋值后不能再赋值(可以调用对象方法修改属性值)。对基本类型来说是其值不可变,对引用变量来说是其引用不可改变,即不能再指向其他对象。
3.被final修饰的方法代表不能重写。

区别
final表示最终的,不可改变的。用于修饰类、方法和变量。final变量必须在声明时给定初值,只能读取,不可修改。final方法也同样只能使用,不能重写,但能够重载。final修饰的对象,对象的引用地址不能变,但对象的属性值可以改变。

finally异常处理的一部分,它只能用在try/catch语句中,变式希望finally语句中的代码最后一定被执行(存在一些情况导致finally语句块不会执行,如jvm结束)

finalize()是在java.lang.Object里定义的,Object的finalize()方法什么都不做,对象被回收时finalize()方法会被调用。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作,在垃圾收集器删除对象之前被调用的。一般情况下,此方法有JVM调用。特殊情况下,可重写finalize()方法,当对象被回收的时候释放一些资源,须调用super.finalize()。

finally语句块一定执行吗?
不一定,存在许多特殊情况导致finally语句块不执行;如
直接返回未执行到finally语句块;
抛出异常未执行到finally语句块;
系统退出未执行到finally语句块等…

7.final与static的区别?

都可以修饰类、方法、成员变量;

区别
static可以修饰类的代码块,而final不可以;
static修饰表示静态或全局,被修饰的属性和方法属于类,可以用类名.静态属性/方法名 访问;
static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,只会被执行一次;
static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次;
static修饰的变量可以被重新赋值;
static方法必须被实现,而不能是抽象的abstract;
static方法只能被static方法覆盖;

final修饰表示常量,一旦创建不能改变;
final标记的成员变量必须在声明的同时赋值,或在该类的构造方法中赋值,不可以重新赋值‘’
final方法不能被子类重写;
final类的不能被继承,没有子类,final类中的方法默认是final的;
final不能用于修饰构造方法;
private类型的方法默认是final类型的;

8.return与finally的执行顺序对返回值的影响

对于try和finally至少一个语句块包含return语句的情况,finally语句会执行;
finally没有return,finally对return变量的重新赋值修改无效;
try和finally都包含有return,return值会以finally语句块return值为准。

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

Math.round() 函数返回一个数字四舍五入后最接近的整数,四舍五入的原理是在参数上加上0.5然后向下取整。
Math.round(-1.5)的返回值是-1.
Math.ceil():返回小数所在两整数间的较大值,如-1.5返回-1
Math.floor():返回小数所在两整数间的较小值,如-1.5返回-2

10.String属于基础的数据类型吗?

String不是基本数据类型,但是String类型却是最常用到的引用类型,java中的基本类型一共有8个,他们分别为:
1.字符类型:byte(一字节,8位),char(2字节,16位);
2.基本整型:short(2字节,16位),int(4字节,32位),long(8字节,64位);
3.浮点型:float(4字节,32位),double(8字节,64位);
4.布尔类型:boolean(逻辑上是1位)。

注意:boolean的大小是未知的,虽然我们看boolean只有:true、false两种情况,可以使用 1 bit 来存储,但是实际上没有明确规定是1bit,因为因为对虚拟机来说根本就不存在 boolean 这个类型。在《Java虚拟机规范》中给出了两种定义,分别是4个字节和boolean数组时1个字节的定义,但是具体还要看虚拟机实现是否按照规范来,1个字节、4个字节都是有可能的。

11.java中操作字符串都有哪些类?他们有什么区别?

String:final修饰,String类的方法都是返回new String,即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象;
StringBuffer:对字符串的操作的方法都加了synchronized,保证线程安全;
StringBuilder:不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append,replace,delete等方法修改字符串。

12.普通类和抽象类有哪些区别?接口和抽象类有什么区别?

抽象类不能实例化;
抽象类可以有抽象方法,抽象方法只需声明,无需实现;
含有抽象方法的类必须声明为抽象类;
抽象类的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类;
抽象方法不能被声明为静态,不能用private修饰,不能用final修饰。

接口是对动作的抽象,抽象类是对根据的抽象。

  1. 接口不能实例化;
  2. 接口只能包含方法声明;
  3. 接口的成员包括方法,属性,索引器,事件;
  4. 接口中不能包含常量,字段(域),构造函数、析构函数,静态成员。

抽象类可以有构造方法,接口不能有构造方法。

  1. 抽象类可以有普通成员变量,接口中无;
  2. 抽象类可以包含非抽象普通方法,接口中所有方法都是抽象的;
  3. 抽象类中的抽象方法的访问权限可以是public类型和default,接口中的抽象方法只能是public类型,默认是public abstract类型。

一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类
接口不可以实现接口,可以继承接口,并且可以多个接口。

13.Java访问修饰符有哪些?权限的区别?

四种权限访问控制符

public:被public修饰的成员变量和方法可以在任何类中都能被访问到;

protected:被protected修饰的成员会被位于同一package中的所有类访问到,也能被该类的所有子类继承下来;

friendly:默认的,缺省的。在成员的前面不写访问修饰符的时候,默认就是友好的,同一package中所有类都能访问(被friendly所修饰的成员只能被该类所在同一个package中的子类所继承下来);

private:私有的,只能在当前类中被访问到。

14.javap的作用是什么?

javap是Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码等;
javap -c TestSynchronzed (反汇编)。

15.throw和throws的区别?

throw:

  1. 表示方法内抛出某种异常对象(只能是一个);
  2. 用于程序员自行产生并抛出异常;
  3. 位于方法体内部,可以作为单独语句使用;
  4. 如果异常对象是非RuntimeException则需要在方法声明时加上该异常的抛出,即需要加上throws语句或者在方法体内try catch处理该异常,否则编译报错;
  5. 执行到throw语句则后面的语句块不再执行。

throws:

  1. 方法的定义上使用throws表示这个方法可能抛出某些异常(可以有多个);
  2. 用于声明在该方法内抛出了异常;
  3. 必须跟在方法参数列表的后面,不能单独使用;
  4. 需要由方法的调用着进行异常处理。

16.常见的异常类有哪些?

异常非常多,Throwable是异常的根类。

Thrwoable包含子类:1. 错误-Error ;2.异常-Exception

Exception 又分为一般异常和运行时异常RuntimeException;
运行时异常不需要代码显示捕获处理。

17.什么是JAVA内部类?

概念:存在于Java类的内部的java类;

分类:成员内部类,方法内部类,匿名内部类,静态嵌套类;

作用:提供了某种进入其继承的类或实现的接口的窗口,与外部类无关,独立继承其他类或实现接口;
特点:内部类仍是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号;

内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否private ;
内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量。

18.什么是反射?有什么作用?

Java反射,就是在运行态中,获取任意类的名称,package信息,所有属性,方法,注解,类型,类加载器,父类,实现接口等;

Java的动态就体现在反射,通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。反射的过度使用会消耗系统资源;

JDK中java.lang.Class类,就是为了实现反射提供的核心类之一,一个jvm中一种Class只会被加载一次。

19.动态代理是什么?怎么实现动态代理?应用场景?

动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法。

Java中实现动态的方式

  1. JDK中的动态代理;
  2. Java类库CGLib。

应用场景

  1. 统计每个api的请求耗时;
  2. 统一的日志输出;
  3. 校验被调用的api是否已经登录和权限鉴定;
  4. Spring的AOP功能模块就是采用动态代理的机制来实现切面编程。

20.Java跨平台运行的原理?

1.Java源文件要先编译成与操作系统无关的.class字节码文件,然后字节码文件再通过Java虚拟机解释称机器码运行;

2.class字节码文件面向虚拟机,不面向任何具体操作系统;

3.不同平台的虚拟机是不同,但它们给JDK提供了相同的接口;

4.Java的跨平台依赖不同操作系统的Java虚拟机。

21.什么是Java序列化?什么情况下需要序列化?

原理:对象序列化转换为字节数组,字节数组存储到磁盘。

序列化就是把是对象转化为字节顺序的过程,反序列化就是把字节转化为对象的过程;
Java序列化:将Java对象转换成字节流的过程。
Java反序列化:将字节流转换成Java对象的过程。

一般序列化实现Serializeable接口,public class xx implements Serializable;
被transient修饰的不序列化;

当Java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理:

  1. 在分布式系统中,需要把对象在网络上传输,就得把对象数据转换为二进制形式,需要共享的数据的JavaBean对象,所以需要序列化;
  2. 服务器钝化:如果服务器某些对象好久没活动了,那么服务器就会把这些内存中的对象持久化在本地磁盘文件中(Java对象转为二进制文件);如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成Java对象,这样能节省服务器内存。
    注意:

某个类可以被序列化,则其子类也可以被序列化;
对象中的某个属性是对象类型,需要序列化时也必须实现Serializable接口;
声明为static和transient的成员变量,不能被序列化。static成员变量是表述类级别的属性,transient表示临时数据;
反序列化读取序列化对象的顺序要保持一致。

22.什么场景要对象克隆?

1.方法需要return引用类型,但又不希望自己持有引用类型的对象被修改;
2.程序之间方法的调用时参数的传递,有些场景为了保证引用类型的参数不被其他方法修改。可以使用克隆后的值作为参数传递。

猜你喜欢

转载自blog.csdn.net/qq_42748009/article/details/111873767