java stringbuffer 转数组_String类,StringBuffer类转字符数组

String不可变类型和StringBuffer可变类型

String类和StringBuffer类都是字符串表示类,区别在于String对象引用变量是不可变的,而StringBuffer类对象引用变量是可变的。

方法传参,基本数据类型传的是常量值,而引用数据类型传的是地址值。但是String对象也是引用类型,传参方法原值同样没有发生改变

public classTest {public static voidmain(String[] args) {

String str= "java";

StringBuffer sbf= new StringBuffer("java");

fun(str,sbf);

System.out.println("String类型str:"+str+"\nStringBuffer类型sbf:"+sbf);

}public static voidfun(String str,StringBuffer sbf){

str= str + "world";

sbf.append("world");

}

}

20190413150339199734.png

这虽然也能解释String是不可变的,StringBuffer是可变的,但还是很牵强。

后面查了下资料,意思是说String类是不可改变类(图来自上面提到的博客),也就是说String类也有那么一个属性由fina修饰,在构造方法初始化,存储字符串的值。

20190413150339771023.png

之后我也去看了一眼String的源码,果然就是这样

//String部分源码

public final classStringimplements java.io.Serializable, Comparable, CharSequence {private final charvalue[];publicString(String original) {this.value =original.value;this.hash =original.hash;

}

}

可以看到它确实是有个final,private修饰char数组类型属性,其实我看到这又迷惑了,数组是引用类型,而final修饰引用类型只是锁定它的地址值不会被改变,它本身存的值还是可以改变的,但是下面这个有参构造解开了我的疑惑,String对象初始化赋值时,会将自己的value属性指向输入字符串的value属性,而这个value属性是没有setter方法,所以一旦初始化,则里面的值是不会改变的。String还有一个有参构造,参数是传入一个字符数组,如果在方法中是将value属性指向这个字符数组,那只要改变传入的字符数组值该String对象值也会跟着改变,岂不是违反了前面所说的String不可变。之后我找到这个方法。

20190413150339924343.png

可以看到它并没有将value属性直接指向传入的value字符数组,而是创建了新的字符数组复制于传入的数组,将这个新数组赋值给value属性。

直到这为止我对String不可变这个概念也有了一个比较清晰的认识了。

StringBuffer源码比较复杂一点,但是由于是可变类型,可以把它理解为普通实体类拥有一个非fina属性即可。

String对象和StringBuffer对象转字符数组

String类型:

String str = "abc";//1.直接调用String对象的toCharArray()方法就可以得到该字符数组

char[] chars =str.toCharArray();//2.调用String对象的getChars()方法,

char values_1[] = new char[str.length()];

str.getChars(0,str.length(),values_1,0);//3.遍历

char values_2[] = new char[str.length()];for (int i=0;i

values_2[i]=str.charAt(i);

}//4.调用String对象的split()方法,

String[] split = str.split("");

其中第四个方法是转换成了String类型的数组

String类型转char类型(String对象值为一个字符时)

String c1 = "a";char c2 = c1.charAt(0);

StringBuffer类型:

StringBuffer sb = new StringBuffer("abc");//1.StringBuffer的getChars()方法

char sbValues_1[] = new char[sb.length()];

sb.getChars(0,sb.length(),sbValues_1,0);//2.遍历

char sbValues_2[] = new char[sb.length()];for (int i=0;i

sbValues_2[i]=sb.charAt(i);

}

其中String和StringBuffer的getChars()方法,下面是官方文档介绍

注:如果字符数组长度小于StringBuffer类对象剪切的字符串长度,会出现数组下标超出边界异常

StringBuffer (Java Platform SE8 ) public void getChars(intsrcBegin,intsrcEnd,char[] dst,intdstBegin)

字符从该序列复制到目标字符数组dst 。 要复制的第一个字符是索引srcBegin ; 要复制的最后一个字符在索引srcEnd-1 。

要复制的srcEnd-srcBegin总数为srcEnd-srcBegin 。 字符被复制到的子阵列dst开始于索引dstBegin和在索引结束:

StringBuffer (Java Platform SE8) 参数

srcBegin-以此偏移开始复制。

srcEnd-在此偏移处停止复制。

dst-将数据复制到的数组。

dstBegin- 偏移到 dst 。

以上就是这篇随笔的所有内容,由于这是本人开通博客写的第一篇随笔,而且我自己目前也只是个初学者,所以上面难免有很多不严谨和错误的地方,请大家多多指正,大家一起学习,谢谢大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值