来自《java程序员 ——上班那点事儿》4.4 内存控制效率优化的启示
1、new String(“asdf”)和"asdf"
对于 String 这个类来说它可以用两种方法进行建立:
和
String s = new String("asdf");
String s = "asdf";
用这两个形式创建的对象是不同的, 第一种是用new()来创建对象的, 它是在堆上开辟 空间,每调用一次都会在堆上创建一个新的对象。
而第二种的创建方法则是先在栈上创建一个String 类的对象引用,然后再去查找栈中 有没有存放"asdf",如果没有,则将"asdf"存放进栈,并让 str 指向"asdf",如果已经有 "asdf" 则直接把 str 指向"abc"。
我们可以通过"= ="判断是否相等来验证栈上面的数据共享的问题。
例1:
String s1 = "asdf"; String s2 = "asdf"; System.out.println(s1==s2);
该程序的运行结果是,"true",那么这说明"s1"和"s2"都是指向同一个对象的。
例2:
String s1 =new String ("asdf"); String s2 =new String ("asdf"); System.out.println(s1==s2);
该程序的运行结果是,"false",这说明用 new 的方式是生成的对象,每个对象都指向不同 的地方。
2、StringBuffer比String省内存和时间
3、二维数组比一维数组占用更多内存空间
有时候我们一厢情愿的认为:
二维数组的占用内存空间多无非就是二维数组的实际数组元素数比一维数组多而已,那 么二维数组的所占空间,一定是实际申请的元素数而已。
但是, 事实上并不是这样的, 对于一个二维数组而言, 它所占用的内存空间要远远于大 它开辟的数组元素数
开辟了"1024*1024*2"即2M 的数组元素的一维数组, 运行这个程序得到的结果提示"已占用内存:3M"。
当我们把申请的元素数量未变, 只是将二维数组的行数定为"1024*1024"列数定为"2",和刚 才的那个一维数组 "1024*1024*2"的数量完全一致,但我们得到的运算结果竟然占用达到了29M 的空间。
4、用 HashMap 提高内存查询速度,但是增加赋值时间和内存占用
普通数组:
取值结果:3145728
赋值循环时间:2464ms
获取循环时间:70msJava 可控内存:1016M
已占用内存:128M
HashMap:
取之结果:3145727
赋值循环时间:16454ms
获取循环时间:0ms
Java 可控内存:1016M
已占用内存:566M
代价:
赋值循环时间:
HashMap:16454ms
普通数组:2464ms
占用内存:
HashMap:566M
普通数组:128M
5、用"arrayCopy()"提高数组截取速度