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

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

我当时学的时候也会很不理解这个可变不可变的区别,后面看了一篇博客才懂了这个意思(https://www.cnblogs.com/yumiaoxia/p/9010721.html#commentform)。

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

public class Test {
public static void main(String[] args) {
String str = "java";
StringBuffer sbf = new StringBuffer("java");
fun(str,sbf);
System.out.println("String类型str:"+str+"\nStringBuffer类型sbf:"+sbf);
}
public static void fun(String str,StringBuffer sbf){
str = str + "world";
sbf.append("world");
}
}

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

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

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

//String部分源码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
}

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

可以看到它并没有将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<str.length();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<sb.length();i++){
sbValues_2[i] = sb.charAt(i);
}

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

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

StringBuffer (Java Platform SE 8 ) public void getChars(int srcBegin,
int srcEnd,
char[] dst,
int dstBegin)
字符从该序列复制到目标字符数组dst 。 要复制的第一个字符是索引srcBegin ; 要复制的最后一个字符在索引srcEnd-1 。
要复制的srcEnd-srcBegin总数为srcEnd-srcBegin 。 字符被复制到的子阵列dst开始于索引dstBegin和在索引结束: StringBuffer (Java Platform SE 8 ) 参数 srcBegin - 以此偏移开始复制。
srcEnd - 在此偏移处停止复制。
dst - 将数据复制到的数组。
dstBegin - 偏移到 dst 。

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

String类,StringBuffer类转字符数组的更多相关文章

  1. Java 中 常用API概述之 Math, Object, String,StringBuffer类,Arrays,Integer类

    Math Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数. 与StrictMath类的一些数字方法不同,Math类的StrictMath所有Math都没有定义为返回比特位相同 ...

  2. Java从零开始学三十(String和StringBuffer类)

    一.StringBuffer连接字符操作 当一个字符串的内容需要被经常改变时就要使用StringBuffer 在StringBuffer中使用append()方法,完成字符串的连接操作   二.Str ...

  3. java 中的Number类 Character类 String类 StringBuffer类 StringBuilder类

    1. Number类 Java语言为每一个内置数据类型提供了对应的包装类.所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类.这种由编 ...

  4. Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类

    一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String b ...

  5. Java—API/Obiect类的equals toString方法/String类/StringBuffer类/正则表达式

    API  Java 的API(API: Application(应用) Programming(程序) Interface(接口)) 就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来 ...

  6. [常用类]StringBuffer 类,以及 StringBuilder 类

    线程安全,可变的字符序列. 字符串缓冲区就像一个String ,但可以修改. 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容. 字符串缓冲区可以安全地被多个线程使 ...

  7. java学习(四)--- String 、StringBuffer、StringBuilder 和 数组

    对于 String.StringBuffer.StringBuilder比较一下 主要说说三者的不同 String 长度大小不可变 StringBuffer 和 StringBuilder 长度可变 ...

  8. String与基本类型,字符数组,字节数组的转换

    String与基本数据类型 * 基本数据 --->字符串(String) * 1.基本数据类型值 +"" --->最简单 * 2.使用包装类中的toString(参数类 ...

  9. string str将str转字符数组以及字符数组初始化

    c和指针(<pointers on c>) 8.1.11 一个字符串,如"hello",一般为字符串常量,可以用它对字符指针赋值,或初始化,相当于把这个字符串常量的首地 ...

  10. String类-StringBuffer类-StringBuilder类的比较

    package LC20130929; /**  * 字符串处理类: StringBuffer ~~ StringBuilder 〉〉 String   效果一样但是,性能却大不一样!         ...

随机推荐

  1. $(document).ready和window.onload的区别

    $(document).ready比window.onload先执行.window.onload只执行一次. $(document).ready和window.onload都是在都是在页面加载完执行的 ...

  2. 分组PARTITION BY及游标CURSOR的用法

    基础数据表: select * from dbo.RecommendationChanelVersionRelation: 数据如下: 要求按照ChannelVersionID分组,对每组中的Orde ...

  3. LeetCode.atoi

    请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之 ...

  4. java 冒泡排序 day003

    一.冒泡排序: 利用冒泡排序对数组进行排序 二.基本概念: 依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数, ...

  5. MySQL-mysql 8.0.11安装教程

    网上的教程有很多,基本上大同小异.但是安装软件有时就可能因为一个细节安装失败.我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的. 安装环境:win7 1.下载zip安装包: MySQL ...

  6. LoadRunner学习笔记(二)

    LoadRunner Controller简介: 当虚拟用户脚本开发完成后,使用controller将这个执行脚本的用户从单用户转化为多用户,从而,模拟大量用户操作, 进而形成负债(多用户单循环,多用 ...

  7. python爬取安居客二手房网站数据(转)

    之前没课的时候写过安居客的爬虫,但那也是小打小闹,那这次呢, 还是小打小闹 哈哈,现在开始正式进行爬虫书写 首先,需要分析一下要爬取的网站的结构: 作为一名河南的学生,那就看看郑州的二手房信息吧! 在 ...

  8. RabbitMQ安装手册

    1.   下载 下载地址:http://www.rabbitmq.com/download.html 2.   windows下安装 2.1.  安装Erlang 下载:http://www.erla ...

  9. brew本地安装包

    brew --cache # 输出本地缓存 一般位置 ~/Library/Caches/Homebrew # 将下载下来文件mv到缓存路径 download目录 # 重命名成没有下载下来的文件名 xx ...

  10. 【JavaScript】 使用Async 和 Promise 完美解决回调地狱

    很久以前就学习过Async和Promise,但总是一知半解的. 今天在写NodeJS的时候,发现好多第三方库使用回调,这样在实际操作中会出现多重回调,这就是传说中的JS回调地狱. 举个例子 有一个方法 ...