文章目录
- 1.什么是java?
- 2.Java语言有哪些特点?
- 3.JVM,JDK,JRE有什么区别?
- 4.Java有哪些数据类型?
- 5.自动类型转换,强制类型转换?
- 6.什么是自动拆箱,自动装箱?
- 7.&和&&有什么区别?
- 8.switch的作用范围?
- 9.break,continue,return的区别?
- 10.最有效的方法2乘以8?
- 11.面向对象和面向过程的区别?
- 12.重载(@overload)和重写(@Override)的区别?
- 13.访问修饰符 public、private、protected、以及不写(默认)时的区别?
- 14.抽象类(abstract class)和接口(interface)有什么区别?
- 15.final 关键字有什么作用?
- 16.==和 equals 的区别?
- 17.hashCode 与 equals? 为什么重写 quals 时必须重写 hashCode ⽅法?为什么两个对象有相同的 hashcode 值,它们也不⼀定是相等的?
- 18.什么是深拷贝和浅拷贝?
- 19.Java创建对象有几种方式?
- 20.Object类的常用方法?
- 21.Java 中异常处理体系?
- 22.什么是BIO、NIO、AIO?
- 23.什么是序列化?什么是反序列化?
- 24.说说有几种序列化方式?
- 25.Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
- 26.说一下你对注解的理解?
- 27.什么是反射?应用?原理?
- 28.反射的原理?
- 29.java8新特性?
- 30.Stream流操作?
1.什么是java?
Java是一门摒弃了C++的多继承,指针等概念,面向对象的编程语言。
2.Java语言有哪些特点?
1.平台无关性:由于Java文件编译生成.class文件,在JVM虚拟机中执行,所以只要安装了JVM虚拟机的平台都可以使用Java,实现了“一次实现,多处运行”
2.面向对象:Java具有封装,继承,多态等特点。
3.支持多线程:相比于C++要调用操作系统的多线程,Java本身就具有多线程
4.编译与解释并行:在其他语言中,有编译型语言,解释型语言,但是在Java中编译与解释并行,使用javac将java文件编译成.class文件给虚拟机,虚拟机再通过内部机制将.class文件解释成对应的字节码文件。
3.JVM,JDK,JRE有什么区别?
JVM(JAVA Virtual machine):Java虚拟机,针对不同系统,实现不同的Java虚拟机,因此Java实现跨平台性
JRE:JRE是Java的运行环境,包含JVM虚拟机,并还包括了Java的一些常用的类库,Java命令,和一些其他的构件。
JDK(Java development Kit):它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
4.Java有哪些数据类型?
1.基本数据类型:数值型(byte,short,int,long)、浮点型(float,double)、字符型(char)、布尔型(boolean)
2.引用数据类型:类(class),接口(interface),数组([])
5.自动类型转换,强制类型转换?
Java所有的数值型变量可以互相转换,将一个范围较小的变量或数值直接赋给范围较大的变量,可以自动转换;反之则需要强制转换。
6.什么是自动拆箱,自动装箱?
装箱:将基本数据类型用其对应的引用类型包装起来
拆箱:将包装类型转换为基本数据类型
Java中可以实现自动拆箱和装箱
7.&和&&有什么区别?
&&:短路与运算,如果前者不满足,则不会再判断后者
&:逻辑与,前后都会进行比较
tips:|和||或运算也是同理
8.switch的作用范围?
Java5以前只能是byte、short、char、int
从Java5开始,引入了枚举类型(Enum)
Java7开始,引入了String类型
但不能作用于Long类型
9.break,continue,return的区别?
break直接跳出循环,continue跳过当次循环执行下一次循环,return程序返回,不再执行下面的代码
10.最有效的方法2乘以8?
位运算2<<3,得到2的3次方
11.面向对象和面向过程的区别?
面向过程:分析出解决问题所需要的步骤,用函数一步一步将其实现
面向对象:把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事件在解决整个问题的过程所发生的行为。 目的是为了写出通用的代码,加强代码的重用,屏蔽差异性。
12.重载(@overload)和重写(@Override)的区别?
重载 :在同一个类中,同一个方法名,参数类型不同,个数不同叫做重载
重写:在父类与子类中,子类继承父类的方法并将相同名称的方法重写,被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)
13.访问修饰符 public、private、protected、以及不写(默认)时的区别?
default: 在同一包内可见,不使用任何修饰符。可以修饰在类、接口、变量、方法。
private : 在同一类内可见。可以修饰变量、方法。注意:不能修饰类(外部类)
public : 对所有类可见。可以修饰类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。可以修饰变量、方法。注意:不能修饰类(外部类)。
14.抽象类(abstract class)和接口(interface)有什么区别?
1.接口的方法一般为public,所有方法均不能被实现;抽象类可以有非抽象方法
2.接口中除了static和final,不能有其他变量;抽象类中不一定
3.一个类可以实现多个接口,但只能实现一个抽象类。接口本身可以通过extends关键字扩展多个接口
4.接口方法默认是public,抽象方法可以是public,protected,default
15.final 关键字有什么作用?
1.被final修饰的类不可以被继承
2.被final修饰的变量不可以被更改
3.被final修饰的方法不可以被重写
16.==和 equals 的区别?
1.==:比较基本数据类型是比较“值”,引用数据类型比较地址
2.equals():没有被重写以前和“==”相等,被重写后由自定义的对象的值决定是否相等
17.hashCode 与 equals? 为什么重写 quals 时必须重写 hashCode ⽅法?为什么两个对象有相同的 hashcode 值,它们也不⼀定是相等的?
hashcode:作用是获取哈希码,也称为散列码,通常将对象的内存地址转换成整数返回
如果两个对象相等,则 hashcode ⼀定也是相同的。两个对象相等,对两个对象分别调⽤ equals ⽅法都返回 true。反之,两个对象有相同的 hashcode 值,它们也不⼀定是相等的 。因此,equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖。
因为可能会碰撞, hashCode() 所使⽤的散列算法也许刚好会让多个对象传回相同的散列值。越糟糕的散列算法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同的 hashCode )。
18.什么是深拷贝和浅拷贝?
浅拷贝:拷贝对象的成员变量的值,也就是基本数据类型的值,和引用数据类型变量的地址值,而对于引用类型变量指向的堆中的对象不会拷贝。
深拷贝:完全拷贝一个对象,拷贝被拷贝对象的成员变量的值,堆中的对象也会拷贝一份。
19.Java创建对象有几种方式?
1.new创建对象
2.通过反射机制
3.采用clone机制克隆对象
4.通过序列化方式
20.Object类的常用方法?
21.Java 中异常处理体系?
22.什么是BIO、NIO、AIO?
BIO:同步阻塞IO,一个连接一个线程,发起请求,一直阻塞
NIO同步非阻塞IO,一个请求一个线程,多个连接多路复用一个线程(有Buffer缓冲区和channel)
AIO:异步非阻塞IO,一个有效请求一个线程
23.什么是序列化?什么是反序列化?
序列化:把java对象转为二进制字节流,方便存储和传输
反序列化:把二进制流恢复成对象
对于不想进行序列化的变量,使用transient关键字修饰。
24.说说有几种序列化方式?
1.java对象序列化:Java 原生序列化方法即通过 Java 原生流(InputStream 和 OutputStream 之间的转化)的方式进行转化,一般是对象输出流 ObjectOutputStream和对象输入流ObjectInputStream。
2.json序列化:Json 序列化的选择很多,一般会使用 jackson 包,通过 ObjectMapper 类来进行一些操作,比如将对象转化为 byte 数组或者将 json 串转化为对象
3.protoBuff序列化:是一种轻便高效的结构化数据存储格式,ProtoBuff 序列化对象可以很大程度上将其压缩,可以大大减少数据传输大小,提高系统性能。
25.Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
泛型是jdk1.5中引入的新特性,提供了编译时类型安全监测机制,允许检测到非法的类型
泛型有三种使用方式:
1.泛型类 2.泛型接口,3.泛型方法
常用的通配符:T、E、K、V、?
?:表示不确定的java类型
T(type):表示一个具体的java类型
K、V:key和value
E:代表Elemnt
java的泛型是伪泛型,在java编译期间,所有类型信息都会被擦掉,在运行时没有泛型
之所以要将其擦除,是为了向下兼容,因为JDK5以下不支持
26.说一下你对注解的理解?
注解本质上是一个标记,可以标记在类,方法,属性上。标记本身也可以设置一些值
注解生命周期有三大类:
- RetentionPolicy.SOURCE:给编译器用的,不会写入 class 文件
- RetentionPolicy.CLASS:会写入 class 文件,在类加载阶段丢弃,也就是运行的时候就没这个信息了
- RetentionPolicy.RUNTIME:会写入 class 文件,永久保存,可以通过反射获取注解信息
27.什么是反射?应用?原理?
我们通常都是利用new方式来创建对象实例,这可以说就是一种“正射”,这种方式在编译时候就确定了类型信息。
而如果,我们想在时候动态地获取类信息、创建类实例、调用类方法这时候就要用到反射。
通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。
反射最核心的四个类:
- class类:正在运行中的所有类的都是该类的实例对象,每个class类都包含本类的信息(基类)
- Field类:…对象
- Constructor类:…构造器
- Method类:…方法
我们使用 Spring 的时候 ,一个@Component注解就声明了一个类为 Spring Bean,都是基于反射操作类
28.反射的原理?
我们都知道 Java 程序的执行分为编译和运行两步,编译之后会生成字节码(.class)文件,JVM 进行类加载的时候,会加载字节码文件,将类型相关的所有信息加载进方法区,反射就是去获取这些信息,然后进行各种操作。
29.java8新特性?
- 接口默认方法:Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字修饰即可
- Lambda表达式和函数式接口:Lambda 表达式本质上是一段匿名内部类,也可以是一段可以传递的代码。Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中),使用 Lambda 表达式使代码更加简洁,但是也不要滥用,否则会有可读性等问题,《Effective Java》作者 Josh Bloch 建议使用 Lambda 表达式最好不要超过 3 行。
- Stream API:使用 Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。
简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
- 日期时间 API:Java 8 引入了新的日期时间 API 改进了日期时间的管理。
- **Optional 类:**用来解决空指针异常的问题
30.Stream流操作?
如果喜欢我的文章的话“一键三连”支持一下作者叭~,后续将不断更新,你的支持就是我持续更新的动力!