如果 “” 和 “abc” 在字符常量池中已经存在,则一个对象都不创建。
解决方案 »
- 怎样获取qq好友的ip
- java 串口编程,JAVA读取串行接口数据问题,等了两天两夜, 在线急等。。。。。。。。。。。。
- 请问一下下面代码怎么改?
- 使用httpURLConnection转发http请求时不能获得响应信息
- 求书!java 2 图形设计卷II swing
- 大家快来这里呀这里有好多JAVA视频下载
- 在JAVASCRIPT中执行APPLET实体方法,出错!!请帮帮忙
- Eclipse是否有类似于VC++的右击类的视图自动生成成员变量、方法的功能?
- 请问如何在服务器端根据数据生成一个饼图文件(格式不限)?
- 关于100人围圈喊14的退出 递归 报错 栈内存溢出 跪求大神来解围
- 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,就是为了要和 堆 区分开。
童鞋,不要那你们老师来吓我哦