测测你对java内存的理解

懒得搭理你 2010-12-05 10:48:42
java的内存大致划分:
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。
堆:存放用new产生的数据
静态域:存放在对象中用static定义的静态成员
常量池:存放常量
试试下面的题目,并且给出分析
1.
String str1 = "abc";
  String str2 = "abc";
  System.out.println(str1==str2);
2.
 String str1 =new String ("abc");
  String str2 =new String ("abc");
  System.out.println(str1==str2);
3.
String s0="kvill";
  String s1="kvill";
  String s2="kv" + "ill";
  System.out.println( s0==s1 );
System.out.println( s0==s2 );
4.
String s0="kvill";
  String s1=new String("kvill");
  String s2="kv" + new String("ill");
  System.out.println( s0==s1 );
  System.out.println( s0==s2 );
  System.out.println( s1==s2 );
5.
String s0= "kvill";
  String s1=new String("kvill");
  String s2=new String("kvill");
  System.out.println( s0==s1 );
  System.out.println( "**********" );
  s1.intern();
  s2=s2.intern(); //把常量池中"kvill"的引用赋给s2
  System.out.println( s0==s1);
  System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
6.
String s1=new String("kvill");
  String s2=s1.intern();

  System.out.println( s1==s1.intern() );
  System.out.println( s1+" "+s2 );
  System.out.println( s2==s1.intern() );
7.
final StringBuffer a = new StringBuffer("111");
  final StringBuffer b = new StringBuffer("222");
  a=b;//此句编译不通过
  final StringBuffer a = new StringBuffer("111");
  a.append("222");// 编译通过
8.
String a = "a1";
  String b = "a" + 1;
System.out.println((a == b));
String a = "atrue";
  String b = "a" + "true";
System.out.println((a == b));
String a = "a3.4";
  String b = "a" + 3.4;
  System.out.println((a == b));
9.
String str1 = "ab";
  String str2 = "b";
  String str = "a" + str2;
System.out.println((str1 == str));
10.
String a = "ab";
  final String bb = getBB();
  String b = "a" + bb;
  System.out.println((a == b));
  Public static String getBB() { return "b"; }
11.
public class Test4 {
  private static String a = "ab";
  public static void main(String[] args){
  String s1 = "a";
  String s2 = "b";
  String s = s1 + s2;
  System.out.println(s == a);
  System.out.println(s.intern() == a);
  }
  }
...全文
363 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
clwgm 2010-12-07
  • 打赏
  • 举报
回复
基础的让人无奈呀 看着觉得惭愧 不过内存分配这块是应该了解
lxy15329 2010-12-06
  • 打赏
  • 举报
回复
不错,挺有代表性的
懒得搭理你 2010-12-06
  • 打赏
  • 举报
回复
后面几个题目刚开始时我做错了
椰树海岛 2010-12-06
  • 打赏
  • 举报
回复
这个不错~~又学到了点对象的认识
j357777842 2010-12-06
  • 打赏
  • 举报
回复
不好意思,"直接new一个str1_对象,并放入堆中"这说的不太专业, 应该说是在堆中分配一块内存. 反正就是那个意思,兄弟们就将着理解吧.
j357777842 2010-12-06
  • 打赏
  • 举报
回复
个人对字符串的一点建议:
1. String str1="abc"; 与String str1_=new String("abc");两个语句看似相同,实则有很大差别,前一句是在生成一个对象str1之前,先去常量池中查找有没有"abc",如果有,则直接引用原来的.如果没有,则创建这个对象,并把这个对象放到常量池.而第二句则是直接new一个str1_对象,并放入堆中.所以new 两个相同值的String对象肯定是不等的.而String str1_=new String("abc").intern(), 则str1==str1_为true.
2. 64们机中,一个字符串至少占用64个字节,是不是很恐怖吧.
3. split出来多个字符串,实际上还是指向同一个地址哦.
4. 少用+,多用StringBuffer,StringBuilder
......
antique3158 2010-12-06
  • 打赏
  • 举报
回复
天天从旧东西里面学习到新东西,幸福啊
懒得搭理你 2010-12-06
  • 打赏
  • 举报
回复
等下,我把对上面的解析贴出来,大家分享分享。。。
chao881208 2010-12-06
  • 打赏
  • 举报
回复
哈哈,这么经典的题目都拿出来了。
茫茫大海 2010-12-06
  • 打赏
  • 举报
回复
好贴啊,顶!
H602miss 2010-12-06
  • 打赏
  • 举报
回复
好题好题···
phenix33 2010-12-06
  • 打赏
  • 举报
回复
楼下的继续补充
shaosijun2004 2010-12-06
  • 打赏
  • 举报
回复
1、存储在栈中,
String str1 = "abc";
String str2 = "abc";
当栈中没有"abc"时会分配一块存储String str1 = "abc";
当str1存在的时候,jvm自动寻找有没有"abc"这块域,找到了就直接把引用赋值给str2
所以是true

2、new 出来的东西都是在堆里面的, 每次new都会分配新的堆空间,所以地址肯定不一样了
phenix33 2010-12-06
  • 打赏
  • 举报
回复
/*
先说一下结果:
1) true
2) false
3) true true
4) false false false
5) false false true true
6) false kvill kvill true
7)
8) true true true
9) false
10)false
11)false
*/

楼下的给出分析
lingxuch 2010-12-05
  • 打赏
  • 举报
回复
美女楼主问问题,我喜欢,哈哈哈哈
龙四 2010-12-05
  • 打赏
  • 举报
回复
csdn新手太多

[Quote=引用 5 楼 bao110908 的回复:]

说错了,现在成“日经帖”了,昨天还有一个

http://topic.csdn.net/u/20101204/16/5be7b416-d4d5-4d0e-8382-89597880271c.html
[/Quote]
fable0115 2010-12-05
  • 打赏
  • 举报
回复
还是学到了一些
  • 打赏
  • 举报
回复
说错了,现在成“日经帖”了,昨天还有一个

http://topic.csdn.net/u/20101204/16/5be7b416-d4d5-4d0e-8382-89597880271c.html
  • 打赏
  • 举报
回复
字符串“==”、“产生了多个对象”等问题永远是 CSDN Java 版永远不灭的月经话题!
懒得搭理你 2010-12-05
  • 打赏
  • 举报
回复
要答案干嘛,自己分析呗,否则没意思啦。。。
加载更多回复(2)

62,614

社区成员

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

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