开发面试题 Jmeter 二代征信 angularjs servlets razor background alertifyjs android经典项目开发实战 angular视频 jquery的点击事件 linux下载器 如何升级python matlab图像滤波 python数据类型转换 python网络编程 python环境变量 python获取字典的值 java继承 java使用 javapattern java遍历 java的输入 java中random java系统学习 真实女友补丁 phpqrcode 迅雷免费会员号共享 ae脚本管理器 wine模拟器 程序员面试宝典 模拟人生2夜生活 pdf安装包官方下载 正当防卫4存档 cdr怎么画波浪线 发射爱心的图片 斑驳纹理 js给标签添加属性 fireworks下载 appdata是什么文件夹
当前位置: 首页 > 学习教程  > 编程语言

Java面试知识点1

2020/12/28 20:16:57 文章标签:

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

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位)。

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.程序之间方法的调用时参数的传递,有些场景为了保证引用类型的参数不被其他方法修改。可以使用克隆后的值作为参数传递。


本文链接: http://www.dtmao.cc/news_show_550457.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?