不多说上代码问题在下面
public class Main { public static void main(String[] args) {
String reference = null;  
                //String reference; 
WeakReferenceCache cache = new WeakReferenceCache();
for (int i = 0; i < 1000; i++) {
String str = i + "str";
cache.add(Integer.toString(i), str);
if (i == 100) {
reference = str;
System.out.println(reference);
}
}
System.out.println(cache.get("100"));
System.gc();
System.out.println(cache.get("100"));
// System.out.println(reference);
}
}
WeakReferenceCache 的代码
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;public class WeakReferenceCache implements IZMMemCache<String, String> {
private LinkedHashMap<String, WeakReference<String>> maps; public WeakReferenceCache() {
maps = new LinkedHashMap<String, WeakReference<String>>();
} @Override
public void add(String key, String value) {
maps.put(key, new WeakReference<String>(value));
} @Override
public void remove(String key) {
maps.remove(key);
} @Override
public String get(String key) {
WeakReference<String> refer = maps.get(key);
if (refer != null) {
return refer.get();
}
return null;
} @Override
public int getSize() {
return maps.size();
} public HashMap getMap() {
return maps;
} @Override
public ArrayList<String> getKeys() {
ArrayList<String> array = new ArrayList<String>();
Iterator<Map.Entry<String, WeakReference<String>>> iterator = maps.entrySet().iterator();
while (iterator.hasNext()) {
array.add(iterator.next().getKey());
}
return array;
} @Override
public void clear() {
maps.clear();
}}
String reference = null;  
//String reference; 
就上面写法有区别吗?允许看看   说说自己的分析希望大家讨论先买个馆子

解决方案 »

  1.   

    这和新手不新手有嘛个关系,倒是LZ的0结贴率让人眼前一暗String reference = null;
    代表已申请了一个名叫reference 的变量引用,并且对其进行null赋值,这代表这个变量已经在内存中有地址列表
    String reference;
    只是申请了一个变量引用,但是没有赋值,在被赋值前不能被任何一个地址调用这问题其实不该被问到...基础性知识...
      

  2.   

    如果我要在项目里面使用reference 变量
      

  3.   

    晕..不小心按了快捷键回复如果我要在项目里面使用reference 变量
    1、声明String reference =null;使用内存。
    2、声明String reference;没有使用内存,单纯占个变量字段
    是这样分析的吗?2种形态,在项目中,分别在什么情况下使用?了解的朋友讲解下!感谢
      

  4.   

    试了一下,原来Java里的弱引用对于是否有 =null 这么敏感,学习了。另外楼主把问题放在代码的注释里会更好一点...另外第二段代码里的implements IZMMemCache<String, String>是不需要的。
      

  5.   


    看字节码更清楚:
    String reference = null; 比String reference;多了最开始的两行:
       0: aconst_null
       1: astore_1
    后面的字节码一模一样,reference都是第一个局部变量。
      

  6.   

    从程序的输出结果来看,
    String reference = null; //这里是一个强引用
    String reference; //这里貌似没有任何的引用
    有点意思!
      

  7.   

    在语义是有区别,
    String re = null;//定义变量re,并初始化为null
    String re1; //纯定义变量,未初始化在使用的过程应该没有区别的,编译器会给re1自动初始化为null,这是java的特性之一,任何时候想要变量,随时定义。
      

  8.   


    对这就是想说的,看字节码。java文件都生成class文件直接把class文件托到eclipse中(前提有对应的工程)就可以看到为什么了。
    上面是我想说的第一点
    第二点:编译器优化问题,在java编程思想上提到编译器优化一个高级for循环忘了是那一节了。我想说自己认同的观点:为了提高效率请不要把List 换成 数组。(这里说上写的一句话,意思这应该是编译器去优化的事情),当然必要的优化是需要做的。有人可能不赞同这种说法 数组 的确比List要节约内存因为自己是新手自己有学了点东西所以说出来。看看自己理解对吗
      

  9.   

    public class A {
    String a;
    public void print(){
    String b;
    for(int i =0 ;i<1;i++){
    System.out.println(a);
    // System.out.println(b); //error
    }

    System.out.println(a);
    // System.out.println(b); //error
    }
    }
    这是作用域原因。