一道题看看你是不是新手

xtdhwl1 2012-11-12 02:13:18
不多说上代码问题在下面
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;
就上面写法有区别吗?允许看看 说说自己的分析

希望大家讨论先买个馆子
...全文
421 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtdhwl1 2012-11-17
  • 打赏
  • 举报
回复
局部变量不会自动初始化,必须手动初始化。 是对的
xtdhwl1 2012-11-17
  • 打赏
  • 举报
回复
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
	}
}
引用 10 楼 huntor 的回复:
局部变量不会自动初始化,必须手动初始化。
这是作用域原因。
xtdhwl1 2012-11-17
  • 打赏
  • 举报
回复
引用 9 楼 goldenfish1919 的回复:
引用 2 楼 beiouwolf 的回复:这和新手不新手有嘛个关系,倒是LZ的0结贴率让人眼前一暗 String reference = null; 代表已申请了一个名叫reference 的变量引用,并且对其进行null赋值,这代表这个变量已经在内存中有地址列表 String reference; 只是申请了一个变量引用,但是没有赋值,在被赋值前不能被任何一……
对这就是想说的,看字节码。java文件都生成class文件直接把class文件托到eclipse中(前提有对应的工程)就可以看到为什么了。 上面是我想说的第一点 第二点:编译器优化问题,在java编程思想上提到编译器优化一个高级for循环忘了是那一节了。我想说自己认同的观点:为了提高效率请不要把List 换成 数组。(这里说上写的一句话,意思这应该是编译器去优化的事情),当然必要的优化是需要做的。有人可能不赞同这种说法 数组 的确比List要节约内存 因为自己是新手自己有学了点东西所以说出来。看看自己理解对吗
huntor 2012-11-13
  • 打赏
  • 举报
回复
局部变量不会自动初始化,必须手动初始化。
若鱼1919 2012-11-13
  • 打赏
  • 举报
回复
引用 2 楼 beiouwolf 的回复:
这和新手不新手有嘛个关系,倒是LZ的0结贴率让人眼前一暗 String reference = null; 代表已申请了一个名叫reference 的变量引用,并且对其进行null赋值,这代表这个变量已经在内存中有地址列表 String reference; 只是申请了一个变量引用,但是没有赋值,在被赋值前不能被任何一个地址调用 这问题其实不该被问到..……
看字节码更清楚: String reference = null; 比String reference;多了最开始的两行: 0: aconst_null 1: astore_1 后面的字节码一模一样,reference都是第一个局部变量。
TheRealBo 2012-11-13
  • 打赏
  • 举报
回复
引用 2 楼 beiouwolf 的回复:
这和新手不新手有嘛个关系,倒是LZ的0结贴率让人眼前一暗 String reference = null; 代表已申请了一个名叫reference 的变量引用,并且对其进行null赋值,这代表这个变量已经在内存中有地址列表 String reference; 只是申请了一个变量引用,但是没有赋值,在被赋值前不能被任何一个地址调用 这问题其实不该被问到..……
结帖率为0有什么奇怪,他第一次发贴,马上就要结帖了?
haorengoodman 2012-11-13
  • 打赏
  • 举报
回复
木有结过贴
桃园闲人 2012-11-13
  • 打赏
  • 举报
回复
引用 2 楼 beiouwolf 的回复:
这和新手不新手有嘛个关系,倒是LZ的0结贴率让人眼前一暗 String reference = null; 代表已申请了一个名叫reference 的变量引用,并且对其进行null赋值,这代表这个变量已经在内存中有地址列表 String reference; 只是申请了一个变量引用,但是没有赋值,在被赋值前不能被任何一个地址调用 这问题其实不该被问到..……
灰常同意。
liu4626846 2012-11-13
  • 打赏
  • 举报
回复
不知道你的考量新手的说法是什么原因,。
咖啡机 2012-11-13
  • 打赏
  • 举报
回复
在语义是有区别, String re = null;//定义变量re,并初始化为null String re1; //纯定义变量,未初始化 在使用的过程应该没有区别的,编译器会给re1自动初始化为null,这是java的特性之一,任何时候想要变量,随时定义。
若鱼1919 2012-11-13
  • 打赏
  • 举报
回复
从程序的输出结果来看, String reference = null; //这里是一个强引用 String reference; //这里貌似没有任何的引用 有点意思!
kilimanjaroup 2012-11-12
  • 打赏
  • 举报
回复
试了一下,原来Java里的弱引用对于是否有 =null 这么敏感,学习了。 另外楼主把问题放在代码的注释里会更好一点... 另外第二段代码里的implements IZMMemCache<String, String>是不需要的。
orangleliu 2012-11-12
  • 打赏
  • 举报
回复
私有变量没有初始值好像编译不通过吧。。。 一般都会建议初始化,即使是成员变量。
sadfasdf23213213 2012-11-12
  • 打赏
  • 举报
回复
引用 3 楼 ts333888 的回复:
如果我要在项目里面使用reference 变量
晕..不小心按了快捷键回复 如果我要在项目里面使用reference 变量 1、声明String reference =null;使用内存。 2、声明String reference;没有使用内存,单纯占个变量字段 是这样分析的吗? 2种形态,在项目中,分别在什么情况下使用?了解的朋友讲解下!感谢
sadfasdf23213213 2012-11-12
  • 打赏
  • 举报
回复
如果我要在项目里面使用reference 变量
beiouwolf 2012-11-12
  • 打赏
  • 举报
回复
这和新手不新手有嘛个关系,倒是LZ的0结贴率让人眼前一暗 String reference = null; 代表已申请了一个名叫reference 的变量引用,并且对其进行null赋值,这代表这个变量已经在内存中有地址列表 String reference; 只是申请了一个变量引用,但是没有赋值,在被赋值前不能被任何一个地址调用 这问题其实不该被问到...基础性知识...
aaaabbbccd9876 2012-11-12
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧