文章目录
- 前言
- 一、Java基础题
-
- 1.什么是Java?
- 2.Jdk和Jre和JVM的区别?
- 3.Java语言有哪些特点?
- 4.Java有哪些数据类型?
- [5.switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String上?](#5.switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String上?)
- [6.用最有效率的方法计算 2 乘以 8](#6.用最有效率的方法计算 2 乘以 8)
- [7.Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?](#7.Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?)
- [8.float f=3.4;是否正确?](#8.float f=3.4;是否正确?)
- [9.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?](#9.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?)
- 10.Java语言采用何种编码方案?有何特点?
- 11.什么Java注释?
- [12.== 和 equals 的区别是什么?](#12.== 和 equals 的区别是什么?)
- [13.两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?](#13.两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?)
- [14.final 在 Java 中有什么作用?](#14.final 在 Java 中有什么作用?)
- [15.Java 中的 Math. round(-1. 5) 等于多少?](#15.Java 中的 Math. round(-1. 5) 等于多少?)
- [16.String 属于基础的数据类型吗?](#16.String 属于基础的数据类型吗?)
- [17.Java 中操作字符串都有哪些类?它们之间有什么区别?](#17.Java 中操作字符串都有哪些类?它们之间有什么区别?)
- [18.String str="i"与 String str=new String("i")一样吗?](#18.String str="i"与 String str=new String(“i”)一样吗?)
- [19. String 类的常用方法都有那些?](#19. String 类的常用方法都有那些?)
- [20. 抽象类必须要有抽象方法吗?](#20. 抽象类必须要有抽象方法吗?)
- [21. 普通类和抽象类有哪些区别?](#21. 普通类和抽象类有哪些区别?)
- [22. 抽象类能使用 final 修饰吗?](#22. 抽象类能使用 final 修饰吗?)
- [23. 接口和抽象类有什么区别?](#23. 接口和抽象类有什么区别?)
- [24. Java 中 IO 流分为几种?](#24. Java 中 IO 流分为几种?)
- [25. Files 的常用方法都有哪些?](#25. Files 的常用方法都有哪些?)
- [26. Java 容器都有哪些?](#26. Java 容器都有哪些?)
- [27. Collection 和 Collections 有什么区别?](#27. Collection 和 Collections 有什么区别?)
- [28. HashMap 和 Hashtable 有什么区别?](#28. HashMap 和 Hashtable 有什么区别?)
- [29. 如何决定使用 HashMap 还是 TreeMap?](#29. 如何决定使用 HashMap 还是 TreeMap?)
- [30. 说一下 HashMap 的实现原理?](#30. 说一下 HashMap 的实现原理?)
- 二、设计模式
- 三、Java虚拟机(JVM)
-
- 1.为什么说java是跨平台语言?
- [2.说一下 JVM由那些部分组成,运行流程是什么?](#2.说一下 JVM由那些部分组成,运行流程是什么?)
- [3.说一下 JVM 运行时数据区?](#3.说一下 JVM 运行时数据区?)
- 4.详细的介绍下程序计数器?
- 5.详细介绍下Java虚拟机栈?
- 6.一个方法调用另一个方法,会创建很多栈帧吗?
- 7.栈指向堆是什么意思?
- 8.递归的调用自己会创建很多栈帧吗?
- 9.你能给我详细的介绍Java堆吗?
- 10.能不能解释一下本地方法栈?
前言
毕业季意味着即将找工作面试,以下是我整理的部分Java面试题目,以供面试者参考。
一、Java基础题
1.什么是Java?
答:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
2.Jdk和Jre和JVM的区别?
答:Java官方的图片,Jdk中包括了Jre,Jre中包括了JVM
JDK :Jdk还包括了一些Jre之外的东西 ,就是这些东西帮我们编译Java代码的, 还有就是监控Jvm的一些工具 Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也
包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等
JRE :Jre大部分都是 C 和 C++ 语言编写的,他是我们在编译java时所需要的基础的类库 JavaRuntime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线
程、异常处理类等,系统缺省加载这个包如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
Jvm:在倒数第二层 由他可以在(最后一层的)各种平台上运行 Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台
3.Java语言有哪些特点?
答:简单易学(Java语言的语法与C语言和C++语言很接近)
面向对象(封装,继承,多态)
平台无关性(Java虚拟机实现平台无关性)
支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)
支持多线程(多线程机制使应用程序在同一时间并行执行多项任)
健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)
安全性好
4.Java有哪些数据类型?
答:定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同
大小的内存空间。
分类
基本数据类型
数值型
整数类型(byte,short,int,long)
浮点类型(float,double)
字符型(char)
布尔型(boolean)
引用数据类型
类(class)
接口(interface)
数组([])
5.switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String上?
答:在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的
6.用最有效率的方法计算 2 乘以 8
答:2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)
7.Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
答:Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整
8.float f=3.4;是否正确?
答:不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成 floatf =3.4F。
9.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
答:对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换
10.Java语言采用何种编码方案?有何特点?
答:Java语言采用Unicode编码标准,Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的
11.什么Java注释?
答:定义:用于解释说明程序的文字
分类
单行注释
格式: // 注释文字
多行注释
格式: /* 注释文字 /
文档注释
格式:/ * 注释文字 */
作用
在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。
注意事项:多行和文档注释都不能嵌套
12.== 和 equals 的区别是什么?
答:== 对于基本类型和引用类型 == 的作用效果是不同的,如下所示:
基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;
代码示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(xy); // true
System.out.println(xz); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。
首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false
== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
13.两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
答:不对,两个对象的 hashCode() 相同,equals() 不一定 true。
代码示例:
String str1 = "通话";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2.
hashCode()));
System. out. println(str1. equals(str2));
执行的结果:
str1:1179395 | str2:1179395
false
代码解读:很显然"通话"和"重地"的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
14.final 在 Java 中有什么作用?
答:final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
15.Java 中的 Math. round(-1. 5) 等于多少?
答:等于 -1,Math. round 四舍五入大于 0. 5 向上取整的。
16.String 属于基础的数据类型吗?
答:String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
17.Java 中操作字符串都有哪些类?它们之间有什么区别?
答:操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用
StringBuilder,多线程环境下推荐使用 StringBuffer。
18.String str="i"与 String str=new String("i")一样吗?
答:不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而String str=new String("i") 则会被分到堆内存中。
19. String 类的常用方法都有那些?
答:indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
20. 抽象类必须要有抽象方法吗?
答:不需要,抽象类不一定非要有抽象方法。
示例代码:
abstract class Cat {
public static void sayHi() {
System. out. println("hi~");
}
}
上面代码,抽象类并没有抽象方法但完全可以正常运行。
21. 普通类和抽象类有哪些区别?
答:普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
22. 抽象类能使用 final 修饰吗?
答:不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:
编译器保存图
23. 接口和抽象类有什么区别?
答:默认方法实现:抽象类可以有默认的方法实现;接口不能有默认的方法实现。
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
24. Java 中 IO 流分为几种?
答:按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。
25. Files 的常用方法都有哪些?
答:Files. exists():检测文件路径是否存在。
Files. createFile():创建文件。
Files. createDirectory():创建文件夹。
Files. delete():删除一个文件或目录。
Files. copy():复制文件。
Files. move():移动文件。
Files. size():查看文件个数。
Files. read():读取文件。
Files. write():写入文件。
26. Java 容器都有哪些?
答:Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:
Collection
List
ArrayList
LinkedList
Vector
Stack
Set
HashSet
LinkedHashSet
TreeSet
Map
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable
27. Collection 和 Collections 有什么区别?
Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。
Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections. sort(list)。
- List、Set、Map 之间的区别是什么?
List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。
28. HashMap 和 Hashtable 有什么区别?
答:存储:HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。
29. 如何决定使用 HashMap 还是 TreeMap?
答:对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。
30. 说一下 HashMap 的实现原理?
答:HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的
value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
二、设计模式
1.什么是设计模式?
答:设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计
模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
2.设计模式分类
答:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享
元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令
模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
3.设计模式的六大原则
答:开放封闭原则(Open Close Principle)
原则思想:尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化
描述:一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,我们就应该在设
计的时候尽量适应这些变化,以提高项目的稳定性和灵活性。
优点:单一原则告诉我们,每个类都有自己负责的职责,里氏替换原则不能破坏继承关系的体系。
里氏代换原则(Liskov Substitution Principle)
原则思想:使用的基类可以在任何地方使用继承的子类,完美的替换基类。
大概意思是:子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方
法,但不能覆盖父类的非抽象方法,子类中可以增加自己特有的方法。
优点:增加程序的健壮性,即使增加了子类,原有的子类还可以继续运行,互不影响。
依赖倒转原则(Dependence Inversion Principle)
依赖倒置原则的核心思想是面向接口编程.
依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,
这个是开放封闭原则的基础,具体内容是:对接口编程,依赖于抽象而不依赖于具体。
接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的
意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级
和维护方便。所以上文中多次出现:降低依赖,降低耦合。
例如:支付类的接口和订单类的接口,需要把这俩个类别的接口变成俩个隔离的接口
迪米特法则(最少知道原则)(Demeter Principle)
原则思想:一个对象应当对其他对象有尽可能少地了解,简称类间解耦
大概意思就是一个类尽量减少自己对其他对象的依赖,原则是低耦合,高内聚,只有使各个模块之
间的耦合尽量的低,才能提高代码的复用率。
优点:低耦合,高内聚。
单一职责原则(Principle of single responsibility)
原则思想:一个方法只负责一件事情。
描述:单一职责原则很简单,一个方法 一个类只负责一个职责,各个职责的程序改动,不影响其
它程序。 这是常识,几乎所有程序员都会遵循这个原则。
优点:降低类和类的耦合,提高可读性,增加可维护性和可拓展性,降低可变性的风险
4.什么是单例?
答:保证一个类只有一个实例,并且提供一个访问该全局访问点
5.哪些地方用到了单例模式?
答:(1). 网站的计数器,一般也是采用单例模式实现,否则难以同步。
(2). 应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显
示。
(3). 多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制
(4). Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个
(5). windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。
6.单例优缺点
答:优点:
(1). 在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这
样就防止其它对象对自己的实例化,确保所有的对象都访问一个实例
(2). 单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩
性。
(3). 提供了对唯一实例的受控访问。
(4). 由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例
模式无疑可以提高系统的性能。
(5). 允许可变数目的实例。
(6). 避免对共享资源的多重占用。
缺点:
(1). 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据
的错误,不能保存彼此的状态。
(2). 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
(3). 单例类的职责过重,在一定程度上违背了"单一职责原则"。
(4). 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致
共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是
垃圾而被回收,这将导致对象状态的丢失。
7.单例模式使用注意事项
答:(1). 使用时不能用反射模式创建单例,否则会实例化一个新的对象
(2). 使用懒单例模式时注意线程安全问题
(3). 饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承
(如登记式模式)
8.单例防止反射漏洞攻击
答:private static boolean flag = false;
private Singleton() {
if (flag == false) {
flag = !flag;
} else {
throw new RuntimeException("单例模式被侵犯!");
}
}
public static void main(String[] args) {
}
9.如何选择单例创建方式?
答:如果不需要延迟加载单例,可以使用枚举或者饿汉式,相对来说枚举性好于饿汉式。 如果需要延
迟加载,可以使用静态内部类或者懒汉式,相对来说静态内部类好于懒韩式。 最好使用饿汉式
10.什么是工厂模式?
答:它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻
辑,并且是通过使用一个共同的接口来指向新创建的对象。实现了创建者和调用者分离,工厂模式
分为简单工厂、工厂方法、抽象工厂模式
三、Java虚拟机(JVM)
1.为什么说java是跨平台语言?
答:这个夸平台是中间语言(JVM)实现的夸平台
Java有JVM从软件层面屏蔽了底层硬件、指令层面的细节让他兼容各种系统
2.说一下 JVM由那些部分组成,运行流程是什么?
答:JVM包含两个子系统和两个组件: 两个子系统为Class loader(类装载)、Execution engine(执行引擎); 两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。
Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method area。
Execution engine(执行引擎):执行classes中的指令。
Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。
Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。
流程 :首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要
调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。
3.说一下 JVM 运行时数据区?
答:Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有些区域随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销毁。简单的说就是我们java运行时的东西是放在那里的
程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;
为什么要线程计数器?因为线程是不具备记忆功能
Java 虚拟机栈(Java Virtual Machine Stacks):每个方法在执行的同时都会在Java 虚拟机栈中创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
栈帧就是Java虚拟机栈中的下一个单位
本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
Native 关键字修饰的方法是看不到的,Native 方法的源码大部分都是 C和C++ 的代码
Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;
方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据
4.详细的介绍下程序计数器?
答:(1). 程序计数器是一块较小的内存空间,它可以看作是:保存当前线程所正在执行的字节码指令的地址(行号)
(2). 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储。称之为"线程私有"的内存。程序计数器内存区域是虚拟机中唯一没有规定OutOfMemoryError情况的区域。
总结:也可以把它叫做线程计数器
例子:在java中最小的执行单位是线程,线程是要执行指令的,执行的指令最终操作的就是我们的电脑,就是 CPU。在CPU上面去运行,有个非常不稳定的因素,叫做调度策略,这个调度策略是时基于时间片的,也就是当前的这一纳秒是分配给那个指令的。
5.详细介绍下Java虚拟机栈?
答:(1). Java虚拟机是线程私有的,它的生命周期和线程相同。
(2). 虚拟机栈描述的是Java方法执行的内存模型: 每个方法在执行的同时 都会创建一个栈帧(StackFrame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
解释:虚拟机栈中是有单位的,单位就是栈帧,一个方法一个栈帧。一个栈帧中他又要存储,局部变量,操作数栈,动态链接,出口等。
解析栈帧:
(1). 局部变量表:是用来存储我们临时8个基本数据类型、对象引用地址、returnAddress类型。
(returnAddress中保存的是return后要执行的字节码的指令地址。)
(2). 操作数栈:操作数栈就是用来操作的,例如代码中有个 i = 6*6,他在一开始的时候就会进行操作,读取我们的代码,进行计算后再放入局部变量表中去
(3). 动态链接:假如我方法中,有个 service.add()方法,要链接到别的方法中去,这就是动态链接,存储链接的地方。
(4). 出口:出口是什呢,出口正常的话就是return 不正常的话就是抛出异常落
6.一个方法调用另一个方法,会创建很多栈帧吗?
答:会创建。如果一个栈中有动态链接调用别的方法,就会去创建新的栈帧,栈中是由顺序的,一个栈帧调用另一个栈帧,另一个栈帧就会排在调用者下面
7.栈指向堆是什么意思?
答:栈指向堆是什么意思,就是栈中要使用成员变量怎么办,栈中不会存储成员变量,只会存储一个应用地址
8.递归的调用自己会创建很多栈帧吗?
答:递归的话也会创建多个栈帧,就是在栈中一直从上往下排下去
9.你能给我详细的介绍Java堆吗?
答:java堆(Java Heap)是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区
域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。
在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
java堆是垃圾收集器管理的主要区域,因此也被成为"GC堆"。
从内存回收角度来看java堆可分为:新生代和老生代。
从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区。
无论怎么划分,都与存放内容无关,无论哪个区域,存储的都是对象实例,进一步的划分都是为了更好的回收内存,或者更快的分配内存。
根据Java虚拟机规范的规定,java堆可以处于物理上不连续的内存空间中。当前主流的虚拟机都是可扩展的(通过 -Xmx 和 -Xms 控制)。如果堆中没有内存可以完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
10.能不能解释一下本地方法栈?
答:(1). 本地方法栈很好理解,他很栈很像,只不过方法上带了 native 关键字的栈字
(2). 它是虚拟机栈为虚拟机执行Java方法(也就是字节码)的服务方法
(3). native关键字的方法是看不到的,必须要去oracle官网去下载才可以看的到,而且native关键字修饰的大部分源码都是C和C++的代码。
(4). 同理可得,本地方法栈中就是C和C++的代码
以上是部分面试题目,获取更多更全题目:https://download.csdn.net/download/weixin_43516258/89295995