这两种写法都可以创建一个String对象。在用赋值运算符进行字符串初始化时,JVM自动为每个字符串生成一个String类的实例。 The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class.
String password=new String("ok"); 这样也没有错。 但是String password="ok";利用到了字符串缓冲池,也就是说如果缓冲池中已经存在了相同的字符串,就不会产生新的对象,而直接返回缓冲池中的字符串对象的引用。 如: String a = "ok"; String b = "ok"; String c = new String("ok"); String d = new String("ok");System.out.println(a==b);//将输出"true";因为两个变量指向同一个对象。 System.out.println(c==d);//将输出"flase";因为两个变量不指向同一个对象。虽然值相同,只有用c.equals(d)才能返回true. 所以实际中,建议用第一种,可以减少系统资源消耗。
The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class.
String("xxx");
String(new StringBuffer());
这两条语句的效果是一样的String password="ok";
String password=new String("ok");不同的是,第一条现在内存中创建了"ok"这个String,然后将reference赋给password,如果这个时候还有一条语句String pwd = "ok";那么JVM将不再创建"ok",而是直接将第一个"ok"的reference赋给pwd,也就是说,password和pwd是使用同一块内存,而如果加上String pwd = new String("ok");那JVM将在内存中再创建一块区域放上“ok”这个字符串。
String password=new String("ok"); 是等价的
这样也没有错。
但是String password="ok";利用到了字符串缓冲池,也就是说如果缓冲池中已经存在了相同的字符串,就不会产生新的对象,而直接返回缓冲池中的字符串对象的引用。
如:
String a = "ok";
String b = "ok";
String c = new String("ok");
String d = new String("ok");System.out.println(a==b);//将输出"true";因为两个变量指向同一个对象。
System.out.println(c==d);//将输出"flase";因为两个变量不指向同一个对象。虽然值相同,只有用c.equals(d)才能返回true.
所以实际中,建议用第一种,可以减少系统资源消耗。
=============
原来一切就是这么简单
java里面每个类都继承至java.lang.Object而Object中就有一个public 的方法叫equals(),如果你没有重载这个方法,equals就是判断两个对象是否同一个,是同一个才返回true,这是和==一样的.但绝大多数的类都重载了方法,例如String,它们重载这个方法的目的就是用来判断两个对象的值是否相同,而不再是判断对象本身是否为同一个。至于值相同怎么判断,每个类就都有每个类不同的算法了。
==永远都是判断是否为同一个对象。基本类型除外,因为他们根本不算是对象。
讲的不是很清楚,还有疑问再讨论。
那么好象不能用String类的方法,除非是static
如果用String a = new String("xx");
那么a就可以用String类的方法,如a.method(object o);
{
public static void main(String[] args)
{
String s = "A man of many talents";
String s1 = s.toUpperCase();
int start = s1.indexOf("AL");
int end = s1.lastIndexOf("AL");
String s2 = s1.substring(0, start);
String s3 = s1.substring(end + 2);
String s4 = s2 + s3;
System.out.println(s);
System.out.println(s4);
}
}
这样总结,各位没有什么异议吧。如果大家还有什么高见,请与我分享一下。拜谢!
多谢你的回答,看看我的理解对不对,==相当于在C里面判断指针是否相同,equals相当于内容上是否相同。是不是因为在Java里没有办法像C里面那样直接比较指针,所以把==默认为比较指针(相当于C的指针)。
另外,我不大同意lanyunfeng(蓝色咖啡) 的观点,String就是Java里的一个类,跟内置类型还是有区别的。
至于colin1022(暗夜要爪哇)说,
String s="dfas";声明的是会被其他相同值的变量代替的,在缓冲里的对象。
我也有一些问题,在《Java核心技术》中所,String的值是不可以改变的,我理解就是如果你给它重新赋值,不是改变它原先指向的那块内存的内容,而是重新拿来一块内存(或像这种直接赋值的,直接找到"dfas"的内存),用它的reference指向这块内存。