1.JVM、JRE、JDK的关系是什么?
JDK是java的开发工具,JRE是java运行时环境,JVM是java虚拟机,它们的关系是:JDK包含JRE和JVM,而JRE包含JVM
2.什么是字节码,采用字节码的好处?
在java中,将虚拟机可以读懂的代码,称之为字节码。也就是java中的class文件。
Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。
3.java语言有哪些特点?
- 简单易学;
- 面向对象(封装,继承,多态);
- 平台无关性( Java 虚拟机实现平台无关性);
- 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持)
4. java有哪些数据类型?
8中基本数据类型:1)6种数字类型:四种整型:byte、short、int、long 两种浮点型:float、double
2)一种字符类型
3)一种boolean型
5.为什么说Java语言编译与解释共存?
我们可以将高级编程语言按照程序的执行方式分为两种:
- 编译型:编译型语言会通过编译器将源代码一次性翻译成可被平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译型语言有C、C++、Go、Rust等等
- 解释型:解释性语言会通过解释器一句一句的将源代码解释为机器码后再执行。解释性语言开发效率比较快,执行速度比较慢。常见的解释性语言有Python、JavaScript、PHP等。
为什么说Java语言编译与解释共存?是因为Java既具有编译型语言的特征,也具有解释性语言的特征。因为java程序要经过先编译,后解释两个步骤,先经过编译生成字节码文件(.class文件),这种字节码文件必须由java解释器来解释执行。
6.标识符和关键字的区别?
在我们编写程序的时候,需要大量地为程序、类、方法、变量等取名字,于是就有了标识符。简单来说,标识符就是一个名字。而对于关键字,简而言之,是被赋予特殊含义的标识符,比如访问控制符private 、protected、public,程序控制符continue、break、return等等
7.包装类型的缓存机制?
Java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存、提高性能的功能。Java 基本类型的包装类的大部分都提供了对象的缓存,实现方式是在类初始化时提前创建好会频繁使用的包装类对象,当需要使用某个包装类的对象时,如果该对象包装的值在缓存的范围内,就返回缓存的对象,否则就创建新的对象并返回。
Byte
,Short
,Integer
,Long
这 4 种包装类默认创建了数值 [-128,127]
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);
Integer i1=40
这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40)
。因此,i1
直接使用的是缓存中的对象。而Integer i2 = new Integer(40)
会直接创建新的对象。
因此,答案是 false
。
的相应类型的缓存数据,Character
创建了数值在 [0,127] 范围的缓存数据,Boolean
直接返回 True
or False
。
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
Integer c = 128;
Integer d = 128;
System.out.println(c == d);
答案是: a == b输出true; c == d输出false
8.自动装箱和拆箱了解吗?原理是什么?
- 装箱:将基本数据类型用它们对应的引用类型包装起来。
- 拆箱:将包装类型转换为基本数据类型。
原理:装箱其实就是调用了 包装类的valueOf()
方法,拆箱其实就是调用了 xxxValue()
方法。
Integer i = 10
等价于Integer i = Integer.valueOf(10)
int n = i
等价于int n = i.intValue()
;
9. 为什么浮点数运算时,会有精度丢失的风险?如何解决浮点数运算的精度丢失问题?
这个和计算机的存储机制有很大的关系,因为计算机是二进制存储的,且存储数据时,宽度是有限的,无限循环的小数在存储时只能被阶段,这就造成了精度丢失。
BigDecimal可以实现对浮点数的运算,不会造成精度丢失的问题。
10.超过long整型的数据应该如何表示?
基本数据类型都有一个表示范围,超过这个范围就会有数据溢出的风险,在java中,64位long整型是最大的整数类型。
BigInteger内部使用int[]数组来存储任意大小的整形数据。
11.什么是静态变量?静态变量有什么作用?
静态变量也就是被static关键字修饰的变量。它可以被类的所有实例所共享,且无论一个类创建了多少个对象,他们都共享同一份静态变量。也就是说,即使被创建多个对象,静态变量只会被分配一次内存,这样可以节省内存。
12.字符型常量和字符串常量的区别?
从形式上看,字符常量是由单引号引起的一个字符,字符串常量是由双引号引起的0个或若干个字符。
从含义上看,字符常量相当于一个整型值,可以参与表达式运算;字符串常量代表一个地址值,代表该字符串在内存中的存放位置。
从占用内存上来看,字符型常量占两个字节;字符串常量占若干个字节。
13.静态方法为什么不能调用非静态成员?
1.静态方法是属于类的,随着类的加载而加载;而非静态成员术语实例对象的,只有在类实例化过后才能够访问;
2.在类的非静态成员不存在的时候,静态成员就已经存在了,此时调用在内存中还不存在的非静态成员属于非法操作。
14.静态方法和实例方法有何不同?
1.静态方法可以通过类名.方法名的方式进行调用,而实例方法则必须在对象实例化过后通过对象名.方法名的方式调用
2.访问限制不同,静态方法只能访问静态成员(包括静态成员变量和静态成员方法),不允许访问实例成员,而实例方法则不存在这样的限制。
15.重载和重写有何不同?
重载就是在同一个类中,多个同名的方法根据不同的传参,执行不同的逻辑
重写是子类在继承父类时,对父类的方法进行重新改造,外部样子不能改变,内部逻辑可以改变。
16.对象实例和对象引用有何不同?
new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
17.什么是标记性接口?
如果一个接口里没有抽象方法,表示当前的接口是一个标记性接口,Cloneable就是一个标记性接口,标记性接口一旦被类实现了,表示该类的实例对象就可以被克隆,如果没有实现,当前类的对象就不能克隆。
18.深拷贝和浅拷贝的区别?
浅拷贝:创建一个新的对象,不管另一对象中内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来。
浅拷贝:创建一个新的对象,另一对象如果是基本数据类型,则直接拷贝过来;如果是字符串类型,则复用串池里的数据;如果是其他引用数据类型(例如,数组)则会创建新的。下边引用黑马程序员-阿伟的课件讲解:
19.接口和抽象类有什么共同点和区别?
共同点:1.都不能被实例化;2.都包含抽象方法
区别:1.抽象类是一种类,用“class”关键字修饰;接口则用interface关键字修饰。
2.一个类可以实现多个接口;但是只能继承一个抽象类;
3.接口中只能定义常量,即用public static final修饰的变量;而抽象类可以定义普通变量。
20.==和equals()的区别?
==对于基本类型和引用类型的作用效果是不同的:
对于基本数据类型而言,==比较的是值;
对于引用数据而言,==比较的是对象的内存地址
equals()不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。
equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。当类没有重写equals()方法时,等价于通过“==”比较这两个对象,使用的默认是Object类中的equals()方法;当类重写了equals()方法,一般重写equals()方法来比较两个对象中的属性是否相等,若相等,返回true。
21.hashcode()和equals()的关系?
1.如果两个对象通过equals方法进行比较是相等的,那么他们的hashcode()值一定相同。
2.如果两个对象的hashcode()相等,他们也不一定相同,因为会存在“哈希碰撞”。
22. String、StringBuffer、StringBuilder的区别?
String中的对象是不可变的,也就可以理解为常量,是线程安全的;
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的;
StringBuilder并没有对方法加同步锁,所以是非线程安全的
所以适应情况而言,操作少量数据,适用于String;单线程操作大量数据,适用StringBuilder;
多线程操作大量数据,适用于StringBuffer。
23.String为什么是不可变的?
1.在String类中,保存字符串的数组被final且为private的,并且String类中并没有对外暴露修改这个字符数组的方法。
2.String这个类本身也是被final关键字修饰的,被final关键字修饰的类不能被继承,因此也不能通过子类继承修改字符数组。
24.Exception和Error区别?
Exception是程序本身可以处理的异常,可以通过catch来进行捕获。
Error是程序无法处理的错误,不建议通过catch进行捕获,例如java虚拟机内存不足,这种错误发生时,java虚拟机一般会选择终止进程。
25.Checked Exception和Unchecked Exception有什么区别?
Checked Exception即受检查异常,java在编译过程中,如果受检查异常没有被catch或者throws关键字处理的话,就没有办法通过编译。
Unchecked Exception即不受检查异常,java在编译过程中,不做处理也可以正常通过编译。
26.什么是序列化?什么是反序列化?
序列化:将数据结构或对象转换为二进制字节流的过程;
反序列化:将在序列化生成的二进制字节流还原回数据结构或对象的过程。
序列化和反序列化的应用场景:1.对象在进行网络传输之前,需要先被序列化;接收到序列化的对象之后需要再进行反序列化。
2.将对象存储到文件之前,需要先序列化;将对象从文件中读取出来,需要被反序列化。
3.将对象存储到数据库之前,需要用到序列化;将对象从缓存数据库中读取出来,需要用到反序列化。
4.将对象存储到内存之前,需要先序列化;从内存中读取出来,需要被反序列化。
OSI七层协议架构中,表示层做的事情主要就是对应用层的用户数据进行处理并转换为二进制流;而表示层属于TCP/IP四层架构中的应用层。
27.JAVA IO流了解吗?
IO流在java中分为输入流和输出流,而根据数据的处理方式,又分为字节流和字符流
InputStream和Reader是所有输入流的基类,InputStream是字节输入流,Reader是字符输入流。
OutputStream和Writer是所有输出流的基类,OutputStream是字节输出流,Writer是字符输出流。
28.什么是语法糖?java中有哪些语法糖?
语法糖是为了方便程序员开发,在实现相同功能的前提下,使用语法糖往往比不使用语法糖写出来的代码更加简洁。不过,jvm并不认识语法糖,java语法糖想要被正确执行,需要先通过编译器进行解糖,也就是在编译阶段将其转换为jvm认识的基本语法。所以,java中真正支持语法糖的是java编译器,而不是jvm虚拟机。
java中常见的语法糖有:泛型、自动拆箱和自动装箱、增强for循环、变长参数等