阅读一些开源代码与框架,基础知识如果不扎实,阅读理解起来,总感觉雾里看花,这篇博客是自己终将付出的代价,
1、java是传值还是传引用?
比如你看nio源码,发现一些常规的用法就是每次使用selectionKey,后面总会remove掉,如果不remove掉,selector中的selectionKeys(),注册的key将会无线膨胀,将会导致内存溢出。
public class TellMe {
public static void main(String[] args) {
Selector st = new Selector();
st.addElement("中国");
Set<String> citys = st.elements();
//循环移除掉
Iterator<String> iterator = citys.iterator();
while(iterator.hasNext()){
iterator.next();
iterator.remove();
}
System.out.println("selector 里面 还有元素吗?"+ citys.size());
}
}
class Selector{
private Set<String> keyset = new HashSet<String>();
public void addElement(String e){
keyset.add(e);
}
public Set<String> elements(){
return keyset;
}
}
public class Dev2Test {
public static void main(String[] args) {
List<Obj> objs = new ArrayList<Obj>();
Obj Obj = new Obj();
Obj.setAge(10);
objs.add(Obj);
Obj.setAge(20);
Obj = null;
System.out.println(Obj +" /\\ "+objs.get(0).getAge()+" /\\ "+objs.get(0));
System.out.println();
}
}
class Obj{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Obj = null;只是让Obj对象的Obj的引用去掉彼此间的引用关系,
实际objs中还保留了一个引用,所以还是 不会被gc掉的。
这篇文章讲得比较通俗易懂,java对象与引用http://www.thinkingbar.com/2013/08/java%E5%AF%B9%E8%B1%A1%E5%8F%8A%E5%85%B6%E5%BC%95%E7%94%A8/