1. String s="abc";
   s= s+"def";//主要是这里
   System.out.println(s);
2. String str = new String("aaa");
   System.out.println(str==str.substring(0,3));//结果是 true吧
为什么?给个理由

解决方案 »

  1.   

    1.字符串拼接,有没问题吗?s本来的值是abc,连接"def",赋值,结果肯定是abcdef!在拼接的时候,底层它是用的StringBuilder2.==比较的是内存地址,new 的时候开辟一块内存,变量str 指向这块内存地址。当你substring的时候,它并不是直接去截它的值,而是在操作内存,你从开始内存地址截取到它结束的内存地址,内存地址并没有变,当然是true。 String str = new String("aaa");
    System.out.println(str == "aaa".substring(0,3));
    结果为false所以,很显然,==并不是在比较值。。
      

  2.   

    第一个有什么问题吗?s=s+"def"就是将现有的s中的字符串与"def"字符串拼接,然后重新赋给s的。可以简单的这么认为。
      

  3.   

    LZ先帮你温习下== 和 equals 的区别,看下面了
    -----------------------------------------------------------------------在讲 == 和 equals 的区别前我们需要确认一下 Java 中的数据类型。在Java中有基本数据类型和引用数据类型两种。
    1、8种基本数据类型:
    四种整数类型(byte、short、int、long)
    两种浮点数类型(float、double)
    一种字符类型(char)
    一种布尔类型(boolean)
    2、引用数据类型:除了上面我们说的 8 种基本数据类型外,其他在Java中出现的类型都是引用数据类型。如我们自己写了一个Dog类,而在上面说的8种基本数据类型中不包括Dog类型,所以Dog类型是隶属于
    引用数据类型的。==的理解:要理解 == 我们学要从两个方面来理解:(1) == 两边为 8 中基本数据类型时:
        当 == 两边为8中基本数据类型时, == 判断的是两边变量中存放的内容是否相等。例:
    public class Test { public static void main(String[] args) {
      int a = 10;
      int b = 10;
      if (a == b) {
       System.out.println("变量a和变量b中的值相等");
      }
     }}上面的例子的运行结果是在控制台中输出"变量a和变量b中的值相等"  我们可以看出当 == 两边为8种基本数据类型时比较的时内容换句话说就是比较变量的值。(2) == 两边为引用数据类型时:
         当 == 两边为引用数据类型事,== 判断的是引用数据类型的对象的内存地址是否一样,如果 == 比较的内存地址一样表示 == 两边是同一个对象,否则 == 两边不是同一个对象。例:
    public class Test { public static void main(String[] args) {
                //在8中数据类型中没有String类型所以String是属于引用数据类型的
      String str1 = new String("abc");
                //在这里在创建一个str2对象让他的值和str1一样
      String str2 = new String("abc");
                //我们在用 == 来进行判断会发现 str1 == str2条件不成立我们可以看出这里比较的不是str1和str2的值
      if (str1 == str2) {
       System.out.println("对象str1和对象str2是同一对象,他们的内存地址相同");
      } else {
       System.out.println("对象str1和对象str2不是同一对象,他们的内存地址不相同");
      }
     }
    }equals的理解:
    equals的理解就容易多了,equals他是一个方法,而方法只有对象才能拥有,所以equals的左边一定是一个对象他的语法格式因该是:对象名.equals(比较的内容)。
    例:public class Test { public static void main(String[] args) {
      String str1 = new String("abc");
            //equals的括号中可以直接写入要比较的内容
      if (str1.equals("abc")) {
       System.out.println("对象str1的内容和 abc 相同");
      }  String str2 = new String("abc");
            //equals括号中也可以是一个要比较的对象,注意这里比较的是str1对象和str2对象的内容
      if (str1.equals(str2)) {
       System.out.println("对象str1的内容和 str2 的内容相同");
      } }
    }
      

  4.   

    现在回答你的问题:
    ------------------------------------------------------------------
    JAVA为字符串提供了特别的连接操作符(+),可以把其它各种类型的数据类型转换成字符串,并前后连接成新在字符串。连接操作符(+)的功能是通过StringBuffer类和它的append方法实现的。
    String x="a"+4+"c";编译时等效于String x=new StringBuffer.append.("a").append.(4).append("c").toString;
    所以你的第一个问题连接成一个新的字符串sdef
    ----------------------------------------------------------------------------------
    第二个问题:
    ==两边是引用类型,所以他们比较是内存地址查帮助文档可知:
    public String substring(int beginIndex,
                            int endIndex)返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,一直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。 
    示例:  "hamburger".substring(4, 8) returns "urge"
     "smiles".substring(1, 5) returns "mile"
     
    参数:
    beginIndex - 开始处的索引(包括)。
    endIndex - 结束处的索引(不包括)。 
    返回:
    指定的子字符串。 ---------------------
    str.substring(0, 3)的结果是aaa,因为他们是同一个对象,str == str.substring(0, 3)结果是true
    -------------------------------------------------------------------------------------------
    如果改成这样
    String str = new String("aaa");
    String str1 = new String("aaa");
    System.out.println(str == str1.substring(0, 3));// 结果是false,因为引用对象不同