JVM(java虚拟机)
说一下jvm的主要组成部分?及其作用?
1. Class Loader 类加载器
加载.class文件,check .class文件,只要符合check标准就通过并加载,然后交给Execution Engine运行。
需要详细了解check标准的话,可以仔细阅读《JVM Specification》的第四章“The class File Format”
2. Execution Engine 执行引擎
执行引擎也叫做解释器(Interpreter),负责解释命令,提交操作系统执行。
3. Native Interface本地接口
本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序,Java诞生的时候是C/C++横
行的时候,要想立足,必须有一个聪明的、睿智的调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。目前该方法使用的是越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机,或者Java系统管理生产设备,在企业级应用中已经比较少见,因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等等(两台联网的计算机之间交换数据的技术),不多做介绍。4. Runtime data area运行数据区
5. Stack 栈
6. Heap 堆内存
7. Method Area 方法区
8. PC Register 程序计数器
每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令。
几乎不占内存,用于取下一条指令
9. Native Method Stack 本地方法栈
java基础
jdk和jre有什么区别
jdk就是sdk,开发工具包。jdk基本都是用java语言编写的
jre的核心是jvm,以及java核心部分。java核心部分是c语音写的。
所有安装jdk时会连带安装jre,不然jdk无法运行
两个对象的hashCode()相同,则equals()也一定为true,对吗?
不对
hashCode是所有java对象的固有方法,如果不重载的话,返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同。
哈希算法
哈希表是结合了直接寻址和链式寻址两种方式,所需要的就是将需要加入哈希表的数据首先计算哈希值,其实就是预先分个组,然后再将数据挂到分组后的链表后面,随着添加的数据越来越多,分组链上会挂接更多的数据,同一个分组链上的数据必定具有相同的哈希值,java中的hash函数返回的是int类型的,也就是说,最多允许存在2^32个分组,也是有限的,所以出现相同的哈希码就不稀奇。
final在java中有什么作用?
1.修饰类当用final去修饰一个类的时候,表示这个类不能被继承。
2. 修饰方法
被final修饰的方法不能被重写。
3. 修饰全局变量
a. 必须要赋初始值,而且是只能初始化一次。
4.修饰局部变量(方法体中的变量)
a. 必须初始化值。
b. 被fianl修饰的成员变量赋值,有两种方式:1、直接赋值 2、全部在构造方法中赋初值。
c. 如果修饰的成员变量是基本类型,则表示这个变量的值不能改变。
d. 如果修饰的成员变量是一个引用类型,则是说这个引用的地址的值不能修改,但是这个引用所指向的对象里面的内容还是可以改变的。
java中的Math.round(-1.5)等于多少?
-1
-1.4 -1
-1.6 -2
-1.50 -1
-1.51 -2
1.50 1
1.51 2
java中操作字符串都有哪些类?它们之间有什么区别?
String、StringBuffer、StringBuilder
String : final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append、replace、delete等方法修改字符串。String str="Hello"和String str=new String("Hello")一样吗?
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1 == str2); false
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str3 == str4); false
String str5 = "Hello";
String str6 = "Hello";
System.out.println(str5 == str6); true
new的直接在堆里建个新的。
不是new的去栈里找有没有指向堆里相同内容的,有就直接指向。没有的话在堆里建个新的。