大神们快过来帮帮我(关于String类中的substring方法)

大神们快过来帮帮小弟我(关于String类中的substring方法)
代码如下;
public class Demo03 
{
public static void main(String[] args) 
{
String str1="11";
String str2="11";
String str3=str1.substring(0,1);
String str4=str1.substring(0,1);
String str5=str1.substring(0,2);
String str6=str2.substring(0,2);
if(str3==str4)
{
System.out.println("1");
}
System.out.println("-------");
if(str5==str6)
{
System.out.println("1");
}
}
}

问题如下;
1、为什么str5等于str6而str3不等于str4的,他们的值不是都是1吗,这是什么原因的??
请具体说明情况!!!
------解决思路----------------------
两个等号比较的内存地址,str5,str6的值都是String常量池中存在的"11",所以直接把内存地址赋给了这两个变量,str3和str4结果是字符串1,常量池中没有所以重新分配内存地址,如果你提前声明个变量str0="1",str3和str4应该就相等了,顺便说一下,如果你要比较两个字符串内容是否一致的时候要用equals这个方法
------解决思路----------------------
楼上的回答有问题哦!

其实这个和String类的substring方法的实现有关系,substring的具体实现如下:

    public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }

1.为什么str3不等于str4呢?
   参照substring方法的实现可以,如果原字符串被部分截取时,使用new String()生成新的对象,而new String()生成的对象在堆中,自然是两个不同的对象。
2.为什么str5等于str6呢?
   因为对字符串进行全部截取时,返回的是字符串本身,即使缓存在栈中的数据。所以两个值是相等的。
------解决思路----------------------
看一下这是string的substring源码
 public String substring(int beginIndex, int endIndex) {  
        if (beginIndex < 0) {  
            throw new StringIndexOutOfBoundsException(beginIndex);  
        }  
        if (endIndex > value.length) {  
            throw new StringIndexOutOfBoundsException(endIndex);  
        }  
        int subLen = endIndex - beginIndex;  
        if (subLen < 0) {  
            throw new StringIndexOutOfBoundsException(subLen);  
        }  
        return ((beginIndex == 0) && (endIndex == value.length)) ? this  
                : new String(value, beginIndex, subLen);  
    }  
  

首先==是比较的地址,str3与str4都是字符串的子集所以由源码来看是new string()得来的自然不是相同的内存地址,故str3与str4不相等。而str5截取后得到的是字符串本身,也就是字符串str1的地址,str6得到的是str2的地址。再看开始,你定义了str1=“11”;str2="11;"那么会在常量池中放入"11",两个字符串都指向该常量地址。所以str5与str6自然相等。