A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈浩 黑马帝   /  2012-1-29 00:21  /  2190 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈浩 于 2012-1-29 11:22 编辑

请问String str =“abc”是否等同于String str =new string ("abc")?而且为什么前一句代码不会报错,照理说字符串是不能直接赋值给对象的? 该贴已经同步到 陈浩的微博

评分

参与人数 1技术分 +1 收起 理由
admin + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 荣凯旋 于 2012-1-29 02:08 编辑

看看能不能帮助你兄弟 赫赫
String:

              java中的字符串。 String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,
 String  s1 = "abc";  
    String  s2= "def";   
    String  s2 = s1;
 //这样操作之后s1是"abc",s2也是"abc".

           String 有两种赋值方式:①直接赋值:String  s1 = "abc";
                                                   ②用new开辟空间:String str1 = new String(“abc”) ;

      区别:①先看下面这个程序,看结果是否相等
                public static void main(String args[]) {
                            //都是采用直接赋值的方式
                            String str1 = "abc";
                            //String能否采用new的方式赋值呢?
                            String str2 = new String("abc");
                            String str3 = str2;
                            System.out.println(str1);
                            System.out.println(str2);
                            //String该如何比较是否相等呢
                            System.out.println(str1==str2);
                            System.out.println(str2==str3);
                          }

运行结果:abc
                   abc
                   false
                   true

出现上述运行结果的原因: “==”如果直接应用在字符串上进行比较,则表示比较的是内存地址的值。在
String str1="abc";证明栈内存中有个str1,在堆内存中的内容就是abc,只会产生一个对象;而在String str1 = new String(“abc”) ;代码中我们知道“abc”是匿名对象,那么在堆内存中就会有块空间是“abc”,紧接着new String("abc") 使用new在堆内存中又开辟了一个空间“abc”,最后String str1 = new String("abc") ;代码将最后生成的“abc”内存地址指向str1,最早的一个“abc”就没使用上。 即使用new 关键字开辟,则会产生两个对象 。
  


           ②直接赋值法,在堆内存中只会产生一个对象,而用new开辟空间法,最后在堆内存中是产生了两个对象。

          String str1="abc";                                                                                                                  

  
String str1 = new String("abc") ;




          String 类提供的成员执行以下操作有:比较 String 对象;返回 String 对象内字符或字符串的索引;复制 String 对象的值;分隔字符串或组合字符串;修改字符串的值;将数字、日期和时间或枚举值的格式设置为字符串;对字符串进行规范化。
             使用 Compare、CompareOrdinal、CompareTo、Equals、EndsWith 和 StartsWith 方法进行比较。                                                
                使用  IndexOf、IndexOfAny、LastIndexOf 和 LastIndexOfAny 方法可获取字符串中子字符串或 Unicode 字符的索引。
                使用 Copy 和 CopyTo 可将字符串或子字符串复制到另一个字符串或 Char 类型的数组。
             使用 Substring 和 Split 方法可通过原始字符串的组成部分创建一个或多个新字符串;
                使用 Concat 和 Join 方法可通过一个或多个子字符串创建新字符串。
                使用 Insert、Replace、Remove、PadLeft、PadRight、Trim、TrimEnd 和 TrimStart 可修改字符串的全部或部分。
                使用 ToLower、ToLowerInvariant、ToUpper 和 ToUpperInvariant 方法可更改字符串中 Unicode 字符的大小写。
                使用 Format, 可将字符串中的一个或多个格式项占位符替换为一个或多个数字、日期和时间或枚举值的文本表示形式。
                使用 Length 属性可获取字符串中 Char 对象的数量;使用 Chars 属性可访问字符串中实际的 Char 对象。
                使用 IsNormalized 方法可测试某个字符串是否已规范化为特定的范式。使用 Normalize 方法可创建规范化为特定范式的字符串。
   

          "=="与equals的区别:“==”表示比较的是内存地址的值
                                                  equals表示比较两个字符串的内容是否相等

若把上面的程序改为如下程序,再看运行结果是什么:
   public static void main(String args[]) {
                            //都是采用直接赋值的方式
                            String str1 = "abc";
                            //String能否采用new的方式赋值呢?
                            String str2 = new String("abc");
                            String str3 = str2;
                            System.out.println(str1);
                            System.out.println(str2);
                            //String该如何比较是否相等呢
                            System.out.println(str1.equals(str2);
                            System.out.println(str2.equals(str3);
                          }
   
运行结果:abc
                   abc
                   true
                   true

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
LS已说得够详细,我只简单说两句。String是一种特殊的类,它可以直接赋值,也可new。而一般对象,是要new的,不能直接赋值。String直接赋值,存放在常量池(栈),存取速度快;new的,对象的引用存放在栈里,而值存放在堆里的。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
陈浩 来自手机 黑马帝 2012-1-29 11:20:47
板凳
谢谢帮助,我明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马