1、整型表达式(*)和局部变量必须初始化的问题
1.1、ava语言中的数组元素下标总是从0开始,下标可以是整数或整型表达式。(正确)
例如平时有这样的用法
for(int i=0;i<10;i++)
{
a[i+1]=a[i]
}
这个i+1就是整数型表达式 或者a[5+3]就是a[8]
1.2、 局部变量必须初始化的问题&局部变量的细节知识点
下列代码中的错误原因是(尚未初始化变量)
(1) public class Test
(2) {
(3) public static void main(String [] args)
(4) {
(5) int i;
(6) i+=1;
(7) }
(8) }
尚未初始化变量
类变量(静态变量static)在类加载过程的准备阶段会进行一次赋值,一般是空值或constantValue属性值,同时在初始化阶段会调用类构造器再进行一次赋值。
而实例变量在创建对象时会调用实例构造器进行一次赋值。
因此无论是类变量还是实例变量,在使用前都是非空的。
而局部变量没有初始化过程,在使用前必须赋值,初始化。
局部变量:方法定义中或者方法声明上。
局部变量:在内存的栈中。
局部变量:随方法的调用而存在,随着方法的调用完毕而消失。
局部变量:没有默认值,必须定义,赋值,然后才能使用
2、对字符串对象的引用指向理解及toUpperCase方法的测试
String x="fmn";
x.toUpperCase();
String y=x.replace('f','F');
y=y+"wxy";
System.out.println(y);
本题输出结果是Fmnwxy
针对本题掌握了如下知识点:
String x="fmn"; “fmn”是在常量池里的不可变对象。
x.toUpperCase(); 在堆中new一个"FMN"对象,但无任何引用指向它。
String y=x.replace('f','F'); 在堆中 new一个"Fmn"对象,y指向它。
y=y+"wxy"; 在堆中 重新new一个"Fmnwxy"对象, 修改y指向,现在y指向它。
作用:用于把字符串中转换为大写
语法:stringObject.toUpperCase()
返回:一个新的全部大写的字符串。
提示:原字符串不改变。
我们做了如下测试:
构建字符串,如果只对字符串调用这个方法,那么相当于在堆上搞了一个对象出来,但是没有引用指向这个对象。
即: 在堆中new一个"全大写的"对象,但无任何引用指向它。
如果声明一个字符串型变量String1指向它,测试结果如下
然后这个toUpperCase()方法是将字符串中全部小写转换成大写字母。
3、final修饰符
排除三个,选C
final的作用:
1. 修饰变量,变量的引用地址不可变,但是地址中的内容可以变。
2. 修饰方法,方法不可被重写,但是还是可以重载
3. 修饰类,类不可继承。
不可变类,说的是一个类一旦被实例化,就不可改变自身的状态。常见的比如String和基本数据类型的包装类,对于这种不可变类,一旦在进行引用传递的时候,形参一开始就和实际参数指向的不是一个地址,所以在方法中对形参的改变,并不会影响实际参数。
不可变类(Immutable Class)是一旦被实例化就不会改变自身状态(或值)的类。
String就是一种典型的不可变类。
不可变类的主要用途是在多线程环境下确保对象的线程安全。
不可变类一般建议使用final来修饰(比如String就是final类),否则子类可以通过继承不可变类的方式,增加setter方法,从而改变对象的状态,破坏了不可变的约束。
这一题我个人认为答案C也可以算作是final的作用,只不过ABD是更加常见和直接的final用法。
4、向左向右移位
public class Test {
public static void main(String args[]) {
int x, y;
x = 5 >> 2;
y = x >>> 2;
System.out.println(y);
}
}
向左移位 >>
向右移位 >> 向右一位相当于 除以 2
但是移位的运算速度大于除以2的速度
例如二分法中的mid=(right-left)>>1+right;
5、JVM中关于堆:
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
堆的内存模型大致为:
从图中可以看出: 堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。
本人使用的是 JDK1.6,以下涉及的 JVM 默认值均以该版本为准。
默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。
老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。
默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。
JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。
因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。