基础复习

垃圾回收:
  垃圾回收分为年轻代,年老代,持久代。
  新创建的对象属于年轻代,有A、B区,A区满了,就会调用垃圾回收机制,通过引用计数法或者引用可达法就行筛选,没有的进行回收,有用的进行复制,复制到B区。
  B区满了,再重复以上操作。
  循环15次之后,就会属于年老代,进入年老区,C区,当C区达到一定比例之后,也会进行一次垃圾回收,跟年轻区的垃圾回收有些差别,具体差别还不太清楚。
  当年老区满了,则进行全盘清理,Full Gc。

能够触发执行全盘清理的四个条件:
  年老区满了。
  持久区满了。
  调用System.gc()显性方法
  上次全盘清理之后....(这个不太懂)

容易造成内存泄漏的操作:
  创建大量无用对象。eg:对于一个需要很多次拼接的字符串,使用String,而不是StringBuilder
  创建大量静态集合类
  不关闭连接。eg:数据库连接、IO流
  监听器的使用。

传递参数其实就是值传递,值得是将值进行复制,而不是将原值给它。但是需要注意引用对象的传递,当将一个引用对象给定另外一个值时,就相当于将该对象的地址给了另外一个值,所以两个值只要有一
个改变对象,那么对象就会被改变。

创建对象的步骤
  先分配内存空间,并完成成员变量的初始化或者默认值。
  执行属性值的显示初始化(系统默认的无参构造器就是隐式的,不是系统默认的就是显示的)
  执行构造方法
  返回对象的地址给对象

Integer对象的学习
public static void main(String[] args) {
Integer int1 = 2;
Integer int2 = 2;

Integer int3 = Integer.valueOf(222);
Integer int4 = 222;

/**
* Integer对象中存在缓存,缓存比较常见的数值,大小范围是-128-127 只要是这个范围内的数字则从缓存中拿,不在这个范围则需要new一个新对象。
*/
System.out.println(int1 == int2); //返回true
System.out.println(int3 == int4); //返回false
}
相关源码(下面源码就是Integer的缓存信息):
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];

static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
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);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;

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

// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}

private IntegerCache() {}
}


原文地址:https://www.cnblogs.com/qcq0703/p/12099354.html