【java面试题详细阐释】
1、java中的值传递和引用传递
http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html
Java 编程语言只有值传递参数
Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
http://zhangbreeze.blog.163.com/blog/static/163877078201151463348275/
但是在使用自动装箱的时候要注意一些问题.
在java中为了节省创建对象的时间和空间,对于一些常用的对象,会将它在内存中缓存起来.就像String一样.
直接使用String s = "str" 这种形式来产生String对象的话,如果内存中有一个也是这种方式产生的String对象的话,那么就不会新建对象,
而是直接使用之前建立的那个String对象.实际上.对于如下的范围内的简单数据类型:拆装箱都和String类型一样的
1. boolean类型的值
2.所有的byte的值
3.在-128~127的short类型的值
4.在-128~127的int类型的值
5.在\ u0000~\ u 00ff 之间的char类型的值.
都会先在内存中区查找.
http://www.cnblogs.com/qq78292959/archive/2011/07/25/2116123.html
在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期。从申请分配、到使用、再到最后的释放。这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露。
GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果GC线程通过这种方式,无法跟踪到某一块堆内存,那么GC就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。
一般来说内存泄漏有两种情况。
一种情况如在C/C++语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);
另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。