怎么一会句柄一会对象的???s就是句柄,对象是“asdf”String s = "asdf" 如果已经存在一个这个asdf对象,那么这个语句不会新作成一个对象。如果不存在的话会新做成一个对象String s = new String("asdf")肯定会新生成一个对象就是说String s1 = "asdf";
String s2 = "asdf";
String s3 = "asdf";
String s4 = "asdf";
大家指向的是同一片内存空间
而
String s1 = new String("asdf")
String s2 = new String("asdf")
String s3 = new String("asdf")
String s4 = new String("asdf")
大家指向的是不同的内存空间
String s2 = "asdf";
String s3 = "asdf";
String s4 = "asdf";
大家指向的是同一片内存空间
而
String s1 = new String("asdf")
String s2 = new String("asdf")
String s3 = new String("asdf")
String s4 = new String("asdf")
大家指向的是不同的内存空间
解决方案 »
- 关于 flex4.0 sdk 配置java环境问题
- java连不上mysql 在线等!!!!!!
- 如何定义一个只能输入汉字和字母的组件?
- 简单程序运行不错
- 做JAVA,.NET.ORACLE的人呢?
- 被joc.jar混淆过的文件如何反编译为JAVA文件.有什么好的软件吗?
- 在jScrollPane上添加删除jPanel
- junit 在测试中的System.out.println("sddfssdf");怎么无法输出来呢?但在非测试方法里可以输出来。
- 关于匿名内部类的问题
- ***标准Java初学者--关于HelloWorld
- ActionListener和ItemListener的问题
- 开源项目是什么,要做的话具体怎样实施?
String s = "asdf"和String s = new String("asdf")
有区别吗?
我觉得效果是一样的.
对于String s = "asdf"楼主说s是句柄,不知道有没有根据?
这时候java为字符串文字"asdf"隐式的创建了一个String对象
而String s = new String("asdf")
显示的创建一个对象实例
主要在于Java的垃圾自动回收机制上。
但是对我们的确不是很重要。
String s2 = "asdf";
String s3 = "asdf";
String s4 = "asdf";
大家指向的是同一片内存空间同一片内存空间什么意思?难道s1改变了s2,s3,s4也都会改变吗?
s1改变了,代表它指向的内存空间变了。
s2,s3,s4不受影响,不会改变。
当然,s1指向的内存空间的内容变了,s2,s3,s4指向的内存空间的内容也相应改变。
public class test {
public static void main(String[] args) {
String s1 = "asdf";
String s2 = "asdf";
System.out.println(s1==s2);
}
}
运行结果为true,表示相同句柄。
public class test {
public static void main(String[] args) {
String s1 = new String("asdf");
String s2 = new String("asdf");
System.out.println(s1==s2);
}
}
运行结果为false,表示句柄不同。
是这样的
同意楼上的
这样无形中就创建了2个对象。
对于string来说
用 String s="asdf";比较好!!!
String.equals()方法比较的是字符串的内容。使用了equals()方法,会对字符串中的所有字符一个接一个地进行比较,如果完全相等,那么返回true.
而运算符==比较的是String对象的引用如:
String s0="abc";
String s1=new String("abc");
String s2="a"+"b"+"c";s0.equals(s1); ---->true
s0.equals(s2); ---->true
s0==s1; ---->false
s0==s2; ---->true在这里你或许对s0==s2为true有疑问,这是因为
"abc","a","b","c"是字符串常量,它们在编译期就被确定了。
如s2,它同样在编译期就被解析为一个字符串常量。
Java确保一个字符串常量只有一份拷贝,所以当
"abc"和"a"+"b"+"c"被确定为值相等时,当JVM执行了常量池解析的操作,
Java会设置两个变量的引用为同一个常量的引用。
在constant pool即常量池(在编译期被确定,并已被保存在已编译的.class文件中的一些数据,它包含了方法、类、接口、字符串常量等)中,Java会跟踪所有的字符串常量。
先说这种吧,碰到"asdf"时,JVM在内存中申请一块空间,然后把s1指向它
String s2 = "asdf";
因为刚才JVM已经在内容中申请了一块空间存放“asdf”了,这时只要把s2也指向它就OK了!
所以这一块内容的内容是无法改变的,只有在程序结束的时候释放。
但是对于
String s3 = new String("asdf");
JVM为s3申请空间,然后在这块空间上存放"asdf";
可见对内存的使用情况不同,但是好像意义不大!confusing
Runtime rt=Runtime.getRuntime();
System.out.println(rt.freeMemory());
如果我使用
String s1=new String("abc");
String s2=new String("abc");
String s3=new String("abc");
则freeMemory=1772304
如果用
String s1="abc";
String s2="abc";
String s3="abc";
则freeMemory=1772456
可见用s="abc"要比s=new String("abc");节省空间
1。String s="abc"; s是句柄在栈中存储 "abc"这个东东在静态存储空间存储(常量存贮区)
1。String s=new String("abc"); s是句炳在栈中存储 "abc"这个东东在堆中存储。
String s= new String("asdf");
都是建立一个新的String对象s,他们的形式虽不一样,结果是完全一样的String对象的实例化虽然区别与其他类
但是两种方法都是创建了String的一个实例str,而且在创建前都要检查实例str是否已经存在,如果str已经存在则两种方法都会导致编译器报错,所以它们的效果是完全一样的,只是形式不同
(sun为了方便大家才这么做)不过要注意的是:
String str="String"; 和
str="String"; 是不一样的
前者是创建String的一个实例str,后者是给已经创建好的str赋值
(前提是在两句的上面都没有声明 String str)
String的定义就是public final class
这是一个不变模式,一个String对象一旦创建,他所指向的内存内容就不能改变。比如:
String s = "abc";
现在内存某个地方存储了"abc",s指向它。
如果下一条语句:
s = "xyz";
那么内存中又有了一份"xyz", s现在指向"xyz"原来的"abc"呢?如果没有其他的String指向它,他就会被GC回收。所以:
String s1="abc";
String s2="abc";
如果编译器足够聪明,可以在编译期判断出s1, s2指向同一内容,那就只用一份"abc"就足够了。
所以 (s1==s2) = true;至于
String s1="abc";
String s2=new String("abc");
本质上是一样的,可能编译器一定要给new String("abc")分配新的内存。
结果(s1==s2)=false但是我认为jvm绝不可能在运行时先遍历内存看看有没有现成的"xxxx"
所以你写String x = "xxxx" jvm一定会生成新的"xxxx"而不管内存中是否有没有。
至于优化是在编译期进行的。所以判断s1==s2实在没什么意义。
s1.equals(s2)才是比较他们所指向的内存的内容的。