黑马程序员技术交流社区

标题: String问题 [打印本页]

作者: kun1990    时间: 2013-12-14 18:18
标题: String问题
如果Java中的String中的==是比较的是地址值,但是为什么如下大代码是可以的?
  1. public class PingPang{
  2.         public static void main(String[] args){
  3.                 String[] jia={"a","b","c"};
  4.                 String[] yi={"x","y","z"};
  5.                 String[][] zuhe=new String[jia.length][yi.length];
  6.                 for(int i=0;i<=jia.length-1;i++){
  7.                         for(int j=0;j<=yi.length-1;j++){
  8.                                 //System.out.println(jia[i]+yi[j]);
  9.                                 if((jia[i]=="a" && yi[j]=="x") || (jia[i]=="c" && yi[j]=="x") ||(jia[i]=="c" && yi[j]=="z") ){
  10.                                  continue;
  11.                                 }
  12.                                 zuhe[i][j]=jia[i]+yi[j];
  13.                                 //System.out.println(zuhe[i]);
  14.                         }
  15.                 }
  16.                 //总共有这么多种情况的出现
  17.                 for(int i=0;i<zuhe.length;i++){
  18.                         for(int j=0;j<zuhe[i].length;j++){                               
  19.                                 System.out.println(zuhe[i][j]);
  20.                         }
  21.                 }
  22.        
  23.         }

  24. }
复制代码




作者: 高亮亮    时间: 2013-12-14 18:58
不清楚楼主到底是想问什么.
不过,==的确是比较String的地址.
你的代码结果是这样.


先看看你里面的判断,就是让二维数中,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