黑马程序员技术交流社区
标题:
String问题
[打印本页]
作者:
kun1990
时间:
2013-12-14 18:18
标题:
String问题
如果Java中的String中的==是比较的是地址值,但是为什么如下大代码是可以的?
public class PingPang{
public static void main(String[] args){
String[] jia={"a","b","c"};
String[] yi={"x","y","z"};
String[][] zuhe=new String[jia.length][yi.length];
for(int i=0;i<=jia.length-1;i++){
for(int j=0;j<=yi.length-1;j++){
//System.out.println(jia[i]+yi[j]);
if((jia[i]=="a" && yi[j]=="x") || (jia[i]=="c" && yi[j]=="x") ||(jia[i]=="c" && yi[j]=="z") ){
continue;
}
zuhe[i][j]=jia[i]+yi[j];
//System.out.println(zuhe[i]);
}
}
//总共有这么多种情况的出现
for(int i=0;i<zuhe.length;i++){
for(int j=0;j<zuhe[i].length;j++){
System.out.println(zuhe[i][j]);
}
}
}
}
复制代码
作者:
高亮亮
时间:
2013-12-14 18:58
不清楚楼主到底是想问什么.
不过,==的确是比较String的地址.
你的代码结果是这样.
040.jpg
(52.68 KB, 下载次数: 9)
下载附件
2013-12-14 18:52 上传
先看看你里面的判断,就是让二维数中,ax,cx,cz这三种组合成新的字符串放进二维的String数组里面.
你是想说不能用==比较么?
因为单独一个英文字符的话,在建立String型数组的时候,其实只要都是a,他们指向的地址是同一个.
举个例子,如果你
String a1="abc";
String a2="abc";
a1,a2他们指向的是同一个地址.因为声明a1时,在里面创建了一个"abc"字符串,在声明a2时,找到了,就不重新创建了.但假如你a2="bcd";的话,就要重新创建,地址值就不一样了.
不知楼主懂了没有???
作者:
其LovE斤
时间:
2013-12-14 20:10
本帖最后由 其LovE斤 于 2013-12-14 20:31 编辑
楼主 问的是 数组中的字符串地址和 后来用来比较的地址为什么会一样?
比如 jia【i】
== "a"
== 比较的确实是地址值,
首先在API文档中说过:
String 的定义里很明确 public final class String
字符串是个常量
因为 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。注意!是可以共享的。
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
String是一个常量
它在内存中的存放位置 是在 字符串常量池中。
当你 创建了一个 String对象。就会分配内存地址 ,放入字符串常量池中。
当你下次又创建了一个 String对象。首先就会先去字符串常量池中找,看有没有这个String。
如果有 就不会再创建新的内存地址。直接指向了已有的。
ps:插一句自己的想法 我认为 因为字符串是有字符组合成的。而字符是有自己的ASCII码值的。
那么字符串在内存中其实是字符的ASCII码值的组合
或则说 字符串的内存地址 是根据 组成它的 字符的ASCII码值 算出来的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2