java初级对象问题 如果 “” 和 “abc” 在字符常量池中已经存在,则一个对象都不创建。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 选择A 这是我自己的理解 String s1 = "abc";//能编译成功,也能执行,既然s1能有toString属性,那么s1肯定是Object; System.out.println(s1.toString()); String s2 = "";//能编译成功,也能执行,只是输出的也是"",既然s2能有toString属性,那么s2肯定是Object; System.out.println(s2.toString()); // String s3 = null;//可以通过编译,但是运行的时候会抛出NullPointerException,因此次处没有创建新的对象;// System.out.println(s3.toString()); String tp = s2;//此处是s2的地址传给tp,是址传递,所以也没有创建新对象; System.out.println(tp==s2);//输出true System.out.println(tp.equals(s2));//输出true String tp1 = "";/*String类型的数据是放在内存的data segment里面的,而8中基本数据类型是存放在栈中的常量池; 执行此句的时候,虚拟机会首先在内存的data segment搜索是否已经存在空字符串"",如果没有, 则创建.如果已经有了,则直接将tp1指向这个地址,因此也没有创建新的对象,这种机制类似常量池; 这种数据的共享是由编译器完成的,tp1的修改并不会影响到s2; */ System.out.println(tp1==s2);//输出true System.out.println(tp1.equals(s2));//输出true 应该这样问的String s =””,String s1= “abc”,String str =null,String tp = s;String sx= “abc” 创建了两个对象 前面创建了一个对象是空字符, 还有一个是常量字符串 倒数第二个是空地址,没有指向堆中的对象,所以是空对象,最后一个是将s的地址赋值给了tp所以tp也指向空字符字符串对象,所以只创建了两个 对象是 new 出来的 ,存放在 堆中String s =””,String s1= “abc”,String str =null,String tp = s;s 是一个引用 ,存放在 栈 中“” 是一个字符串,存放在 常量池中s1 同 s ,存放在 栈 中 “abc” 同 空串 ,存放在 常量池中 str 存放在 栈 中 ,指向nulltp 和 s 指向 同一块内存地址 ,同样也是存放在 stack 中 分析完了,根本没有 对象出现在 堆中 ,所以 答案应该是 0 String s="abc";abc是放在常量池中的,常量池不是在堆上吗?我记得老师说过:如果abc在常量池中不存在,则会new 一个“abc”存在常量池中所以:String s ="abc";创建0或1个对象;而:String s =new String ("abc");会创建两个对象:一个是new 出的正常的对象 另一个则是为了性能,它会在常量池中备份一个“abc”对象(如果没有的话)所以:String s =new String ("abc");出来1-2个对象 常量池 在方法去 中 ,方法区 不在 堆上,jvm规范在描述 方法区的 时候 用了 non-Heap,就是为了要和 堆 区分开。童鞋,不要那你们老师来吓我哦 如何将断点续传里的多线程中止?? 总是无法找到文件的目录*(testWeb目录下有两个文件 WEB-IN和a.jsp)这是什么原因呢 java时间控制 script调用FLASH java包的学习 使用FlowLayout如何使组件换行显示 关于eclipse生成的界面无法显示的问题 子类的构造函数不调用基类的构造函数,可以吗 求助??在Choice中判断年份的问题?? 大哥们,小弟我准备学JAVA了给推荐几本好书吧!小弟不胜感激啊! jbuilder7注册码 基础问题
这是我自己的理解 String s1 = "abc";//能编译成功,也能执行,既然s1能有toString属性,那么s1肯定是Object;
System.out.println(s1.toString());
String s2 = "";//能编译成功,也能执行,只是输出的也是"",既然s2能有toString属性,那么s2肯定是Object;
System.out.println(s2.toString());
// String s3 = null;//可以通过编译,但是运行的时候会抛出NullPointerException,因此次处没有创建新的对象;
// System.out.println(s3.toString());
String tp = s2;//此处是s2的地址传给tp,是址传递,所以也没有创建新对象;
System.out.println(tp==s2);//输出true
System.out.println(tp.equals(s2));//输出true
String tp1 = "";/*String类型的数据是放在内存的data segment里面的,而8中基本数据类型是存放在栈中的常量池;
执行此句的时候,虚拟机会首先在内存的data segment搜索是否已经存在空字符串"",如果没有,
则创建.如果已经有了,则直接将tp1指向这个地址,因此也没有创建新的对象,这种机制类似常量池;
这种数据的共享是由编译器完成的,tp1的修改并不会影响到s2;
*/ System.out.println(tp1==s2);//输出true
System.out.println(tp1.equals(s2));//输出true
String s =””,String s1= “abc”,String str =null,String tp = s;String sx= “abc”
“” 是一个字符串,存放在 常量池中
s1 同 s ,存放在 栈 中
“abc” 同 空串 ,存放在 常量池中
str 存放在 栈 中 ,指向null
tp 和 s 指向 同一块内存地址 ,同样也是存放在 stack 中
分析完了,根本没有 对象出现在 堆中 ,
所以 答案应该是 0
abc是放在常量池中的,常量池不是在堆上吗?
我记得老师说过:
如果abc在常量池中不存在,则会new 一个“abc”存在常量池中
所以:
String s ="abc";创建0或1个对象;
而:
String s =new String ("abc");
会创建两个对象:一个是new 出的正常的对象 另一个则是为了性能,它会在常量池中备份一个“abc”对象(如果没有的话)
所以:String s =new String ("abc");出来1-2个对象
常量池 在方法去 中 ,方法区 不在 堆上,jvm规范在描述 方法区的 时候 用了 non-Heap,就是为了要和 堆 区分开。
童鞋,不要那你们老师来吓我哦