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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© (_演绎、青春 中级黑马   /  2014-8-19 23:16  /  2110 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

【字符串一旦初始化就不可以被改变。】
解释:这句话指的是字符串的内容不能发生改变,并没有说字符串的引用不可以改变。
问题:还是不理解上面的解释。请
看下面代码:
            String s = "hello";
               s+="world"; // 后面追加
        System.out.println(s);
               
                String n = "ni"; // 初始化了
                     n = "hao"; // 这儿不是把内容改了吗?
                System.out.println(n);

21 个回复

倒序浏览
老师 应该告你了  String赋的值在方法区   假设'ni'的地址为1号地址 “hao”的地址为2号地址  由于最后执行n=“hao”;所以n的地址值由1变为2了。 但是1号地址的值还是“ni”表示值没变
回复 使用道具 举报
冷锋也温柔 发表于 2014-8-19 23:44
老师 应该告你了  String赋的值在方法区   假设'ni'的地址为1号地址 “hao”的地址为2号地址  由于最后执行 ...

你的意思是变的只是那串带哈希值的地址?
回复 使用道具 举报
(_演绎、青春 发表于 2014-8-20 20:37
你的意思是变的只是那串带哈希值的地址?

对,字符串类型与别的数据类型不一样。
回复 使用道具 举报
曾小贤OL 发表于 2014-8-20 20:43
对,字符串类型与别的数据类型不一样。
  1. public class StringTest {
  2.         public static void main(String[] args) {
  3.                 String a = "hello";
  4.                 System.out.println(a);
  5.                 System.out.println(a.hashCode());
  6.                 a = "world";
  7.                 System.out.println(a);
  8.                 System.out.println(a.hashCode());
  9.         }
  10. }       
复制代码


这样,地址值是变了,但是输入内容还是一样变了啊:dizzy:
回复 使用道具 举报
一块地,把换了树

地表示指向,树是值
这块地换了树,树是边了,地还是那块地
回复 使用道具 举报
(_演绎、青春 发表于 2014-8-20 20:47
这样,地址值是变了,但是输入内容还是一样变了啊

字符串类型你在看一遍吧!毕老师已经说了:java中用String类进行描述。对字符串进行了对象的封装。这样的好处是可以对字符串这种常见数据进行方便的操作。对象封装后,可以定义N多属性和行为。

如何定义字符串对象呢?String s = "abc";只要是双引号引起的数据都是字符串对象。

特点:字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。
------------------------------------------------------
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 。

System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true ,字符串中equals比较的是字符串内容是否相同。
也就是说一个字符串的出现就有一个哈希值,hello 有对应的哈希值,world有对应的哈希值,认为是赋值给a是错误的,改变的是a的值,你再来一个字符串也会不一样的
回复 使用道具 举报
曾小贤OL 发表于 2014-8-20 20:58
字符串类型你在看一遍吧!毕老师已经说了:java中用String类进行描述。对字符串进行了对象的封装。这样的 ...

也就说一个北京,一个上海,是固定的,你再怎么搞北京和上海都不是一个地方的
回复 使用道具 举报
能改变引用,不能改变内容,也就是说“ni”没有被改变,而是把n的引用指向了"hao"这个内容
回复 使用道具 举报
(_演绎、青春 发表于 2014-8-20 20:37
你的意思是变的只是那串带哈希值的地址?

嗯哪  地址变了  由于不同地址存储不同内容,所以输出的内容变了  
回复 使用道具 举报
都是大牛啊,学习下
回复 使用道具 举报
看了这个理解更加深了
回复 使用道具 举报
冷锋也温柔 发表于 2014-8-20 22:29
嗯哪  地址变了  由于不同地址存储不同内容,所以输出的内容变了

谢谢你:handshake
回复 使用道具 举报
曾小贤OL 发表于 2014-8-20 21:01
也就说一个北京,一个上海,是固定的,你再怎么搞北京和上海都不是一个地方的 ...

谢谢:handshake
回复 使用道具 举报
看了 受教了
回复 使用道具 举报
酋长第一 发表于 2014-8-20 20:58
一块地,把换了树

地表示指向,树是值

:handshake
回复 使用道具 举报
icris 中级黑马 2014-8-21 16:23:34
17#
只要带等号,就是这个对象已经不指向以前的地址了,他看起来不一样了只是因为他不再用来表示以前的字符串了,以前的地址放着的以前的字符串没有变。

  1.                 Field field = String.class.getDeclaredField("value");
  2.                 field.setAccessible(true);
  3.                 field.set("abc", "hello".toCharArray());
  4.                 System.out.println("abc");
复制代码

这才叫变了…
回复 使用道具 举报
指向变了吧。。
回复 使用道具 举报
常量池的享元模式~
回复 使用道具 举报
内容改的是引用啊,"ni"这个对象是没有改变的
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马