1.Java运行时内存分为线程共享和线程私有两部分
线程共享:方法区和堆
线程私有:Java虚拟机栈,程序计数器,本地方法栈
2.new java.util.SortedMap().put("key","value");这种实例方式是错误的因为SortedMap是一个接口
3.for循环执行的顺序
for(初始化语句;布尔表达式;更新语句){
正文过程;
}
初始话语句仅在循环开始前执行一次
布尔表达式用于决定是否继续执行正文过程,表达式中异常则结束循环
正文过程,如果过程中存在break,return或者异常,循环结束(不会执行更新语句)如果遇到continue则会执行更新语句后进入下一轮循环
更新语句,注意更新语句不做到逻辑真假判断,到这里一轮循环结束
布尔表达式,进入新一轮循环
.........
4. byte b = (byte)129;
正向溢出:最小值+余数-1
负向溢出:最大值-余数+1
byte存储范围[-128,127]
129为正向溢出,结果为-128+(129%127)-1 = -127
若为-129负向溢出,结果为127-(129/128)+1 = 127
5. String s = "test";//该方法定义类加载器会从常量池判断是否有这个字符串存在,存在直接用s指向,不存在则创建
String s1 = new String("test");//直接在堆中new一个对象
s==s1为false,因为s指向的是常量池中的字符串变量
而s1指向的是堆中的字符串duix
6. -12%-5 的值为-2
取模运算,商的值和被除数符号相同
7.Java区分为两大类
共享线程区:方法区和堆
私有线程区:程序计数器,虚拟机栈和本地方法栈
程序计数器:
堆是jvm所管理的最大的一块内存空间,主要存放各种类的实例对象
在Java中堆被划分为两个不同的区域:新生代和老年代
新生代又被划分为三个区:
Eden,From Survivor,To Survivor 这样的划分是为了使jvm能够更好的管理堆内存中的对象,堆的内存模型大致为
8. 不会初始化子类的几种方式:
1). 调用的是父类的static方法或者字段
2). 调用的是父类的final方法或者字段
3). 通过数组来引用
SuperCLass [] sca = new SuperClass[10];
当初始化一个类时,如果发现其父类没有初始化回就会先初始化它的父类
9. 四种引用类型
1). 强引用:一个对象赋给一个引用就是强引用,比如new一个对象,一个对象被赋值一个对象
2). 软引用:用softreference类实现,一般不会轻易回收,只有不够内存才会回收
3). 弱引用:用weakReference类实现,一但垃圾回收以启动就会回收
4). 虚引用:不能单独存在,必须和引用队列联合使用,主要作用时跟踪对象被回收的状态
10. final修饰变量,则等同于常量。
final修饰方法中的参数,则为最终参数。
final修饰类,则类不能被继承。
final修饰方法,则方法不能被重写。
final不能修饰抽象类
final如果修饰引用变量的话,引用变量所指向的值是可以改变的,只是这个引用只能指向这个地址而已,也就是引用本身的值不能变。