黑马程序员技术交流社区

标题: 关于String的一个问题 [打印本页]

作者: (_演绎、青春    时间: 2014-8-19 23:16
标题: 关于String的一个问题
【字符串一旦初始化就不可以被改变。】
解释:这句话指的是字符串的内容不能发生改变,并没有说字符串的引用不可以改变。
问题:还是不理解上面的解释。请
看下面代码:
            String s = "hello";
               s+="world"; // 后面追加
        System.out.println(s);
               
                String n = "ni"; // 初始化了
                     n = "hao"; // 这儿不是把内容改了吗?
                System.out.println(n);

作者: 冷锋也温柔    时间: 2014-8-19 23:44
老师 应该告你了  String赋的值在方法区   假设'ni'的地址为1号地址 “hao”的地址为2号地址  由于最后执行n=“hao”;所以n的地址值由1变为2了。 但是1号地址的值还是“ni”表示值没变
作者: (_演绎、青春    时间: 2014-8-20 20:37
冷锋也温柔 发表于 2014-8-19 23:44
老师 应该告你了  String赋的值在方法区   假设'ni'的地址为1号地址 “hao”的地址为2号地址  由于最后执行 ...

你的意思是变的只是那串带哈希值的地址?
作者: 曾小贤OL    时间: 2014-8-20 20:43
(_演绎、青春 发表于 2014-8-20 20:37
你的意思是变的只是那串带哈希值的地址?

对,字符串类型与别的数据类型不一样。
作者: (_演绎、青春    时间: 2014-8-20 20:47
曾小贤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:58
一块地,把换了树

地表示指向,树是值
这块地换了树,树是边了,地还是那块地
作者: 曾小贤OL    时间: 2014-8-20 20:58
(_演绎、青春 发表于 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 21:01
曾小贤OL 发表于 2014-8-20 20:58
字符串类型你在看一遍吧!毕老师已经说了:java中用String类进行描述。对字符串进行了对象的封装。这样的 ...

也就说一个北京,一个上海,是固定的,你再怎么搞北京和上海都不是一个地方的
作者: 黄霄仪    时间: 2014-8-20 22:16
能改变引用,不能改变内容,也就是说“ni”没有被改变,而是把n的引用指向了"hao"这个内容
作者: 冷锋也温柔    时间: 2014-8-20 22:29
(_演绎、青春 发表于 2014-8-20 20:37
你的意思是变的只是那串带哈希值的地址?

嗯哪  地址变了  由于不同地址存储不同内容,所以输出的内容变了  
作者: happymouse    时间: 2014-8-20 23:30
都是大牛啊,学习下
作者: 亨利大帝    时间: 2014-8-20 23:40
看了这个理解更加深了
作者: (_演绎、青春    时间: 2014-8-21 01:37
冷锋也温柔 发表于 2014-8-20 22:29
嗯哪  地址变了  由于不同地址存储不同内容,所以输出的内容变了

谢谢你:handshake
作者: (_演绎、青春    时间: 2014-8-21 01:38
曾小贤OL 发表于 2014-8-20 21:01
也就说一个北京,一个上海,是固定的,你再怎么搞北京和上海都不是一个地方的 ...

谢谢:handshake
作者: 谢建平    时间: 2014-8-21 01:55
看了 受教了
作者: (_演绎、青春    时间: 2014-8-21 02:18
酋长第一 发表于 2014-8-20 20:58
一块地,把换了树

地表示指向,树是值

:handshake
作者: icris    时间: 2014-8-21 16:23
只要带等号,就是这个对象已经不指向以前的地址了,他看起来不一样了只是因为他不再用来表示以前的字符串了,以前的地址放着的以前的字符串没有变。

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

这才叫变了…
作者: 毛富强    时间: 2014-8-21 16:33
指向变了吧。。
作者: 笑脸迷人    时间: 2014-8-21 17:37
常量池的享元模式~
作者: 小洁呵呵    时间: 2014-8-22 09:38
内容改的是引用啊,"ni"这个对象是没有改变的
作者: 滔哥    时间: 2014-8-22 09:42
请教一个有关String类的一个小问题,有点不解?
http://bbs.itheima.com/thread-138624-1-1.html
(出处: 黑马程序员IT技术论坛)

作者: (_演绎、青春    时间: 2014-8-22 10:53
滔哥 发表于 2014-8-22 09:42
请教一个有关String类的一个小问题,有点不解?
http://bbs.itheima.com/thread-138624-1-1.html
(出处: 黑 ...

谢滔哥:handshake




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2