大神们快过来帮帮我(关于String类中的substring方法)
大神们快过来帮帮小弟我(关于String类中的substring方法)
代码如下;
问题如下;
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源码
首先==是比较的地址,str3与str4都是字符串的子集所以由源码来看是new string()得来的自然不是相同的内存地址,故str3与str4不相等。而str5截取后得到的是字符串本身,也就是字符串str1的地址,str6得到的是str2的地址。再看开始,你定义了str1=“11”;str2="11;"那么会在常量池中放入"11",两个字符串都指向该常量地址。所以str5与str6自然相等。
代码如下;
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自然相等。