黑马程序员技术交流社区

标题: 关于指向的小问题 [打印本页]

作者: 党传才    时间: 2012-4-16 17:30
标题: 关于指向的小问题
public class TestString {
public static void operater(StringBuffer m,StringBuffer n)
{
  m.append(n);
  n = m;
}
public static void operater(String m,String n)
{
  m +=n;
  n = m;
}
public static void main(String[] args) {
  StringBuffer a = new StringBuffer("A");
  StringBuffer b = new StringBuffer("B");
  
  String x = "A";
  String y = "B";
  
  operater(a,b);
  operater(x,y);
  
  System.out.println("a="+a+"  b="+b);
  System.out.println("x="+x+"  y="+y);
}
}

为什么结果是: a=AB  b=B
x=A  y=B
作者: 岳民喜    时间: 2012-4-16 17:46
StringBuffer的很好理解,append添加内容。

而String字符容器,可以和任意字符串、字符相加,
但字符串常量不能相加
作者: 张卯    时间: 2012-4-16 17:49

我怀疑可能是这样的,也可能不对~
public class TestString {
public static void operater(StringBuffer m,StringBuffer n)
{
  m.append(n);//只有这句运行了
  n = m;//这句可能没有运行
}
public static void operater(String m,String n)
{
  m +=n;//这句可能没有运行
  n = m;//这句可能没有运行
}
public static void main(String[] args) {
  StringBuffer a = new StringBuffer("A");
  StringBuffer b = new StringBuffer("B");
  
  String x = "A";
  String y = "B";
  
  operater(a,b);
  operater(x,y);
  
  System.out.println("a="+a+"  b="+b);
  System.out.println("x="+x+"  y="+y);
}
}
作者: 蒋亮    时间: 2012-4-16 18:01
StringBuffer提供了可变的字符串,调用append方法会在原来的字符串末尾加上传进去的参数,自始至终只有一个对象。
String提供了不可变的字符串,对String对象进行操作,并没有改变原来对象的内容,而是重新生成了一个新的对象。
作者: 黑马罗坚    时间: 2012-4-16 18:25
StringBuffer是按址传递  String是按值传递 不管new 没new 所以打印的是a 和b
至于StringBuffer打印的是AB 和B
是因为传递过去的是2个地址oper方法只把其中一个地址的值修改了 定一个地址的值并没有修改  
public class TestString {
public static void operater(StringBuffer m,StringBuffer n)
{
  m.append(n);//这句修改了传过来的内存空间里的值所以调用它的变量里的值也改变了
  n = m;//这句只是把这个方法里面的m的内存空间地址赋值给了n 调用它的地方的b变量对应的内存空间里的值并没有该 所以打印的是B
}
public static void operater(String m,String n)
{
  m +=n;//这句可能没有运行
  n = m;//这句可能没有运行
}
public static void main(String[] args) {
  StringBuffer a = new StringBuffer("A");
  StringBuffer b = new StringBuffer("B");
  
  String x = "A";
  String y = "B";
  
  operater(a,b);
  operater(x,y);
  
  System.out.println("a="+a+"  b="+b);
  System.out.println("x="+x+"  y="+y);
}
}
作者: 黑马罗坚    时间: 2012-4-16 20:51
public class TestString {
public static void operater(StringBuffer m,StringBuffer n)//6.在栈内存中开辟m和n 把0FA23,OFF33赋值给m,n
{
  m.append(n);//7 把栈内存中句柄m指向的堆内存中的0FA23的值进行append运算 由于0FA23值改变了所以主函数的变量a的值也改变了
  n = m;//8 把栈内存中的m句柄指向的堆内存首地址OFA23赋值给栈内存中的句柄n 栈内存主函数区y句柄指向的堆内存0FF33的值并没变
}       //变的只是栈内存operater方法区n句柄的值
public static void operater(String m,String n)//10 在栈内存中开辟m指向栈内存中的"A" 在栈内存中开辟n指向栈内存中的"B"
{
  m +=n;//11 把栈内存中的"AB"指向给栈内存的m 但是并不影响栈内存的"A".因为栈内存主函数区的x还在指向栈内存的"A"所以并不会释放
  n = m;//12 把栈内存的M指向的值"AB"赋值给栈内存n  
}
public static void main(String[] args) {
  StringBuffer a = new StringBuffer("A"); //1. 在栈内存开辟空间存储句柄a指向new StringBuffer("A");在堆内存开辟的首地址如0FA23
  StringBuffer b = new StringBuffer("B");//2. 在栈内存开辟空间存储句柄b指向new StringBuffer("B");在堆内存开辟的首地址如0FF33
  
  String x = "A"; //3.在栈内存中开辟空间存放x x的值为栈内存的"A"
  String y = "B"; //4.在栈内存中开辟空间存放y y的值为栈内存的"B"
  
  operater(a,b); //5.执行operater方法 把栈内存中a和b句柄的值传递给该方法
  operater(x,y); //9 执行operater方法 把栈内存中x指向的栈内存"A"和y指向的"B"传递给该方法
  
  System.out.println("a="+a+"  b="+b);//13因为堆内存中的OFA23的值改变成了"AB" 堆内存OFF33的值并没有改变 所以地一行是 "AB" "B"
  System.out.println("x="+x+"  y="+y);//14应为栈内存x,y指向的栈内存的"A","B"还在 所以打印的是"A" "B"
}
}




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