A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kun1990 中级黑马   /  2013-12-14 18:18  /  1659 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果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. }
复制代码



2 个回复

倒序浏览
不清楚楼主到底是想问什么.
不过,==的确是比较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: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码值 算出来的。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马