不多说上代码问题在下面
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;
就上面写法有区别吗?允许看看 说说自己的分析希望大家讨论先买个馆子
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;
就上面写法有区别吗?允许看看 说说自己的分析希望大家讨论先买个馆子
代表已申请了一个名叫reference 的变量引用,并且对其进行null赋值,这代表这个变量已经在内存中有地址列表
String reference;
只是申请了一个变量引用,但是没有赋值,在被赋值前不能被任何一个地址调用这问题其实不该被问到...基础性知识...
1、声明String reference =null;使用内存。
2、声明String reference;没有使用内存,单纯占个变量字段
是这样分析的吗?2种形态,在项目中,分别在什么情况下使用?了解的朋友讲解下!感谢
看字节码更清楚:
String reference = null; 比String reference;多了最开始的两行:
0: aconst_null
1: astore_1
后面的字节码一模一样,reference都是第一个局部变量。
String reference = null; //这里是一个强引用
String reference; //这里貌似没有任何的引用
有点意思!
String re = null;//定义变量re,并初始化为null
String re1; //纯定义变量,未初始化在使用的过程应该没有区别的,编译器会给re1自动初始化为null,这是java的特性之一,任何时候想要变量,随时定义。
对这就是想说的,看字节码。java文件都生成class文件直接把class文件托到eclipse中(前提有对应的工程)就可以看到为什么了。
上面是我想说的第一点
第二点:编译器优化问题,在java编程思想上提到编译器优化一个高级for循环忘了是那一节了。我想说自己认同的观点:为了提高效率请不要把List 换成 数组。(这里说上写的一句话,意思这应该是编译器去优化的事情),当然必要的优化是需要做的。有人可能不赞同这种说法 数组 的确比List要节约内存因为自己是新手自己有学了点东西所以说出来。看看自己理解对吗
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
}
}
这是作用域原因。