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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

学习了 ,

点评

技术分也快够了。。这题目,可以抽时间分析分析的。。。还是挺有意思的。。  发表于 2014-8-10 01:14
回复 使用道具 举报
唕 来自手机 中级黑马 2014-8-10 00:59:27
22#
看看和自己想地
回复 使用道具 举报
fantacyleo 发表于 2014-8-10 00:25
嗯,分析是对的。有两处小细节:
1. StringBuffer是在常量池中,这个说法有依据吗?
2. “s2=s1 这一步,不 ...

1.StringBuffer中的值,就是一个个char类型的字符,确实都是在常量池中的,StringBuffer是拼起来的字符,很多字符拼一起,组成了字符串。。。
2.这儿可能我之前的表达不是很严谨,正确的表达,应该是“不能仅仅看作赋值”。。。因为通俗的赋值就是修改了s2中的值,而这里s2本身的值并没有改变,只是修改了指向。。指向了s1的地址。。然后s2 s1指向了同一个地址,是表达不严谨,但是大概意思,也都能理解了吧 ?
回复 使用道具 举报

理解基本对了一半。。。很不错了。。。。
仔细看看,还有一些细节的。。。
回复 使用道具 举报
彬锐 发表于 2014-8-10 00:07
有点晕晕乎乎的。。总是理所当然的纯粹只看里面的值了 然后进行互相添加
哎,看了这个感觉自己基础还是不行 ...

多看看吧 。。这一题我开始也是一样不会。。。
怎么都分析不出来。。

后来还是拿着问的老师。。。
然后想着自己整理下。。。。就整理了这么多。。

后来就想着拿出来和小伙伴们分享一下这题了。。。。{:3_59:}
回复 使用道具 举报
看下答案。。。感觉有点意思
回复 使用道具 举报
M单色调 来自手机 中级黑马 2014-8-10 01:27:12
27#
不懂,看答案了!
回复 使用道具 举报
烟海 发表于 2014-8-10 01:05
1.StringBuffer中的值,就是一个个char类型的字符,确实都是在常量池中的,StringBuffer是拼起来的字符, ...

1. StringBuffer内部有一个字符数组,而数组存在于堆内存中的。所以
  1. String s1 = "abc";
  2.                 String s2 = "abc";
  3.                 System.out.println(s1 == s2); // true
  4.                 StringBuffer buffer1 = new StringBuffer("cde");
  5.                 StringBuffer buffer2 = new StringBuffer("cde");
  6.                 System.out.println(buffer2 == buffer1); // false
复制代码


2. 你的意思我是明白,只是澄清一下概念。s2 = s1确实修改了s2的值。因为s2的值是地址,当然因为java取消了指针操作,你无法直接打印出这个地址值,但Java语言规范还是说了:The reference values (often just references) are pointers to these objects,明确了引用变量的值就是指针,也就是地址
回复 使用道具 举报
icris 中级黑马 2014-8-10 03:47:46
29#
烟海 发表于 2014-8-10 01:07
理解基本对了一半。。。很不错了。。。。
仔细看看,还有一些细节的。。。 ...

我觉得你绕进去了,不用想那么多,运行到哪值是什么都清清楚楚的,为什么要去分析StringBuffer?难道下一次换成StringBuilder就不一样了?难道再下次用反射改字符串就不一样了?
  1. class T4 {
  2.         public static void main(String[] args) {
  3.                 String s1 = new String("hello");
  4.                 String s2 = new String("java");
  5.                 show(s1, s2);
  6.                 System.out.println("=================");
  7.                 System.out.println(s1);
  8.                 System.out.println(s2);
  9.         }

  10.         public static void show(String s1, String s2) {
  11.                 try {
  12.                         append(s1, s2);
  13.                         System.out.println("S1---" + s1);
  14.                         s1 = s2;
  15.                         System.out.println("S2---" + s2);
  16.                         append(s2, s1);
  17.                         System.out.println("S2---" + s2);
  18.                         System.out.println("S1---" + s1);
  19.                 } catch (Exception e) {
  20.                         // TODO Auto-generated catch block
  21.                         e.printStackTrace();
  22.                 }
  23.         }

  24.         private static void append(String s1, String s2)
  25.                         throws NoSuchFieldException, IllegalAccessException {
  26.                 Field value = String.class.getDeclaredField("value");
  27.                 value.setAccessible(true);
  28.                 char[] v1 = (char[]) value.get(s1);
  29.                 char[] v2 = (char[]) value.get(s2);
  30.                 char[] v12 = new char[v1.length + v2.length];
  31.                 System.arraycopy(v1, 0, v12, 0, v1.length);
  32.                 System.arraycopy(v2, 0, v12, v1.length, v2.length);
  33.                 value.set(s1, v12);
  34.         }
  35. }
复制代码

有什么变了吗?
所以有时候不要去看那些细节,那些跟问题没有多少关系,不要自己吓唬自己
回复 使用道具 举报
戒风 来自手机 中级黑马 2014-8-10 06:12:45
30#
有点晕,基础不行呀
回复 使用道具 举报
只看了代码的时候还觉得看得懂,但是看了下面的:dizzy:晕了
回复 使用道具 举报
看看答案。
回复 使用道具 举报
看看答案~~~~~~~~~~~
回复 使用道具 举报
骚年:我来学习来了.........
回复 使用道具 举报
来学习拉
回复 使用道具 举报
赞一个 很不多
回复 使用道具 举报
ddddddddddddddddddddddd
回复 使用道具 举报
搞迷糊了   最后还是弄明白了但是不知道怎么说
回复 使用道具 举报
看下答案 是不是一样
回复 使用道具 举报
这是考验基础啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马