本帖最后由 xiaoxiyang 于 2014-11-25 16:56 编辑
package com.nov25;//我自己创建的包名
public class StringDemo {
public static void main(String[] args) {
//对 String s1="java"; 的说明
/*声明一个字符串类型的对象java,同时我们用变量s1(s1存放在内存的栈中)存放字符串对象java的地址--
* ---也就是我们常说的将s1指向java, 或者说s1是java的引用。
* 为解释方便, 暂时把存放变量s1的区域(栈中的某一小块单独区域)称为a区域,
* 实际的数据java在内存的堆中,它也是一块单独的小区域,暂时称为b区域。
*/
String s1 = "java";
//对 String s2="hello"; 的说明 ------类似对对 String s1="java"; 的说明
/*声明一个字符串类型的对象hello,同时我们用变量s2(s2存放在内存的栈中)存放字符串对象hello的地址--
* ---也就是我们常说的将s2指向hello, 或者说s2是hello的引用。
* 为解释方便, 暂时把存放变量s2的区域(栈中的某一小块单独区域)称为c区域,
* 实际的数据hello在内存的堆中,它也是一块单独的小区域,暂时称为d区域。
*/
String s2 = "hello";
method_1(s1,s2);
System.out.println(s1+"...."+s2); //java....hello
StringBuilder s11 = new StringBuilder("java");
StringBuilder s22 = new StringBuilder("hello");
method_2(s11,s22);
System.out.println(s11+"-----"+s22); //javahello-----hello
}
//这里说下method_1方法干了哪些事
public static void method_1(String s1,String s2){ //在主函数中调用method_1方法时要求传入两个String类型的变量,这里是s1,s2。
s1.replace('a','k'); //s1.replace('a','k')--调用s1的replace方法将字符串s1中所有的字符a替换成字符k,注意是字符a替换字符k。
//该方法执行完之后产生了新的字符串jkvk,注意是产生了新的字符串,可是你这里没有任何接收jkvk的变量。
//如果你在s1.replace('a','k');下面再来一行,另设一个变量String s3=s1.replace('a','k');。s3即为jkvk。
//System.out.println(s1); //---我这里把s1打印出来,打印s1仍然是java。
s1 = s2; //s1=s2做的事----把s2的地址赋值给s1,这样一来,s1的地址和s2的地址是一样的了,
//即指向的内存堆中的内容都是hello。结果自然是s1="hello",s2="hello"。
//System.out.println(s1); //我这里把s1和s2也打印出来,以方便做比较,这时s1和s2都是hello。
//System.out.println(s2);
}
//这里说下method_2方法干了哪些事
public static void method_2(StringBuilder s1,StringBuilder s2){
//在主函数中调用method_2方法时要 求传入两个StringBuilder类型的变量,这里传入的是s11,s22。
s1.append(s2); //这里要说下StringBuilder类对象的特点,s1.append(s2);是直接在s1指向的内存堆中java的后面直接追加s2所指向的内存堆中的内容hello。
//此时s1指向的内存堆中的内容就成了javahello,这里并没有产生新的字符串,是在原字符串基础上直接操作,
//这也是StringBuilder类对象一个很好的特性。并不像String类对象那样会在内存中产生很多对象。
s1 = s2; //与method_1方法中s1=s2;类似。
//System.out.println(s1); //我这里把s1和s2也打印出来方便比较,这时s1是javahello,s2是hello。
//System.out.println(s2);
}
}
中午看到马友们一直在跟帖,有的说的很好,这里贴出来我自己写的和一些说明,个人的一些理解难免有不对的地方,不对的地方希望大家能给指出来。共同讨论一起进步。 |