Java|Java基础整理(全是干货)( 二 )


sun.misc.VM.getSavedProperty(\"java.lang.Integer.IntegerCache.high\");
if (integerCacheHighPropValue != null) {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i Integer.MAX_VALUE - (-low) -1);

high = h;
cache = new Integer[(high - low) + 1
;
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k
= new Integer(j++);
private IntegerCache() {

这个类就是在Integer类装入内存中时 , 会执行其内部类中静态代码块进行其初始化工作 , 做的主要工作就是把一字节的整型数据(-128 , 127)装包成Integer类并把其对应的引用存入cache数组中 , 这样在方法区中开辟空间存放这些静态Integer变量 , 同时静态cache数组也存放在这里 , 供线程享用 , 这也称静态缓存 。
所以当用Integer声明初始化变量时 , 会先判断所赋值的大小是否在-128到127之间 , 若在 , 则利用静态缓存中的空间并且返回对应cache数组中对应引用 , 存放到运行栈中 , 而不再重新开辟内存 。 若不在则new 一个新的对象放入堆中 。
五.类的初始化过程
/*父类*/
public class Person {
public Person() {
System.out.println(\"im person_1\");

{
System.out.println(\"im person_2\");

static {
System.out.println(\"im person_3\");


/*子类*/
public class test extends Person {
public test() {
System.out.println(\"im test_1\");

{
System.out.println(\"im test_2\");

static {
System.out.println(\"im test_3\");

public static void main(String[
args) throws Exception {
new test();


输出:
im person_3
im test_3
im person_2
im person_1
im test_2
im test_1
解释:在类中变量初始化时 , 顺序为 static→变量→构造方法 。
六.值传递 , 引用传递
public class test {
String s=\"hello\";
char[
ch={'a''b''c';
Character ck='k';
public static void main(String[
args) throws Exception {
test tt = new test();
tt.change(tt.stt.chtt.ck);
System.out.println(\"--------\");
System.out.println(\"s+\"+tt.s.hashCode());
System.out.println(\"ch+\"+tt.ch.hashCode());
System.out.println(\"ck+\"+tt.ck.hashCode());
System.out.println(\"--------\");
System.out.println(tt.s);
System.out.println(tt.ch);
System.out.println(tt.ck);

public void change(String strchar[
chCharacter ck){
str=\"world\";
ch[0
='d';
ck='c';
System.out.println(\"str+\"+str.hashCode());
System.out.println(\"ch+\"+ch.hashCode());
System.out.println(\"ckl+\"+ck.hashCode());


输出:
str+113318802
ch+1828682968
ckl+99
--------
s+99162322
ch+1828682968
ck+107
--------
hello
dbc
k
可见 , String类型是不会被修改的 , 在编译时 , 方法栈里有world , 如果是输入赋值给String应该会变 , char数组传递的是数组的引用 , Character传递的是值
传值不会修改原来的 , 传引用会修改原来的 。
七.i++与++i
public static void main(String[
args) throws Exception {
int a=1;
int b=a++; //先执行b=a再执行a++
System.out.println(b++); //先执行print(b) , 再执行b++

输出:1
八.==与equals的区别
==:
1.在==中 , 如果比较的是intlongshort这种基本数据类型 , 那么==比较的是它们的值
2.若比较的引用数据类型 , 如类 , String , 那么比较的是它们的内存地址 , 除非是同一个new一个出来的对象 , 此时地址相同 , 返回ture , 否则返回false
如:
String a= new String(\"abc\");
String b=a;
sout(a==b); //ture
若:
String c= new String(\"c\");
String c1= \"c\";
sout(c==c1);//false
equals:
1.所有类都继承自Object , 若不重写equals()方法 , 那么调用Object类中的equals()方法 , 源代码:
public boolean equals(Object obj) {
return (this == obj);