小小搬运工,学习过程中发现自己字符数组和字符串的相互转换难记住特此进行一些拓展、整理、汇总,参考链接如下:
参考链接:https://blog.csdn.net/qq_43349112/article/details/109319233
参考链接:https://blog.csdn.net/weixin_35940165/article/details/114616716
参考链接:https://blog.csdn.net/xiyafei122/article/details/109206447
参考链接:https://www.cnblogs.com/weibanggang/p/9455926.html
字符数组与字符串的相互转换
1. 字符数组转字符串
char[] chs = {'a', 'b', 'c', 'd', 'e'};
//通过构造函数,整体转换:传递一个参数,即字符数组名字
String str1 = new String(chs);
System.out.println(str1); //abcde
//通过构造函数,部分转换:传递三个参数,即字符数组名字, 开始的下标,转换的长度
String str2 = new String(chs, 1, 3);
System.out.println(str2); //bcd
//通过String.valueOf()方法,整体转换:传递一个参数,即字符数组名字
String str3 = String.valueOf(chs);
System.out.println(str3); //abcde
2. 字符串转字符数组
String str = "abcde";
//调用String的toCharArray()方法
char[] chs1 = str.toCharArray();
System.out.println(Arrays.toString(chs1)); //[a, b, c, d, e]
//调用String的charAt()方法遍历
char[] chs2 = new char[str.length()];
for (int i = 0; i < chs2.length; i++) {
chs2[i] = str.charAt(i);
}
System.out.println(Arrays.toString(chs2)); //[a, b, c, d, e]
String & StringBuffer & StringBuilder
1. String & StringBuffer & StringBuilder 的要点
-
要点一
在Java中字符串使用String类进行表示,但是String类表示字符串有一个最大的问题:“字符串常量一旦声明则不可改变,而字符串对象可以改变,但是改变的是其内存地址的指向。”所以String类不适合于频繁修改的字符串操作上,所以在这种情况下,往往可以使用StringBuffer和StringBuilder类。
即: String:内容是不可变的,StringBuffer & StringBuilder:内容是可变的。 -
要点二
在String类中使用“+”作为数据的连接操作,而在StringBuffer & StringBuilder类中使用append()方法 (方法定义:public StringBuffer/StringBuilder append(数据类型 变量))进行数据连接。
-
要点三
类的定义结构不同
String 类
public final class String extends Object implements Serializable, Comparable, CharSequence
StringBuffer 类
public final class StringBuffer extends Object implements Serializable, CharSequence
StringBuilder 类
public final class StringBuilder extends Object implements Serializable, CharSequence可以发现,String类和StringBuffer & StringBuilder类都是CharSequence接口的子类,也就证明String类和StringBuffer & StringBuilder类的对象都可以利用自动向上转型的操作为CharSequence接口实例化。
此外:String实现了三个接口:Serializable、Comparable< String >、CarSequence
StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。 -
要点四
String类和StringBuffer & StringBuilder类的转换。虽然String类和StringBuffer & StringBuilder类都属于CharSequence接口的子类,但是这两类对象是不能直接转换的。
String与StringBuffer & StringBuilder的相互转换:
1. 将String转换为StringBuffer类对象
方式一:利用StringBuffer类的构造方法:public StringBuffer(String str) 。接收String类对象,可以将String类对象实例化为StringBuffer类对象。
方式二:利用StringBuffer类中的append()方法:public StringBuffer append(String str) 。利用append()方法像StringBuffer类中增加了一个String类对象,这样就相当于将String类对象转换为StringBuffer类对象。
2. 将StringBuffer转换为String类对象
方式一:利用 toString()方法 可以将StringBuffer转换为String类对象
实际上所有的类都会继承Object类的toString方法,所以 所有的类对象都可以转换为String类对象 。
方法二:利用String类的构造方法:public String(StringBuffer buffer) 实现StringBuffer类与String类的转换。
-
要点五
三者共同之处:都是final类,不允许被继承 ,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。
运行速度:StringBuilder > StringBuffer > String
-
要点六
通过定义结构发现,StringBuilder类和StringBuffer类是完全相同的,而且打开Java Doc文档后可以发现两个类的方法功能都是相同的。而打开Java源码你会发现区别,在StringBuffer类中定义的方法全部使用“synchronized”进行同步定义,属于安全的线程操作;而StringBuilder类没有同步定义,StringBuilder类的方法都是异步方法,属于非安全线程操作。
即:
StringBuffer是线程安全,可以不需要额外的同步用于多线程中 ;StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理 ,但是速度就比StringBuffer快多了;
StringBuffer与StringBuilder两者共同之处:可以通过append、insert进行字符串的操作。
-
要点七
StringBuffer & StringBuilder 常用方法:
public StringBuffer append(数据类型 变量) ——用于数据追加操作
public StringBuffer reverse() ——用于字符串反转操作
public StringBuffer insert(int offset,数据类型 变量) ——在指定位置追加内容
-
要点八
适用场景:
String:适用于 少量的字符串操作 的情况
StringBuilder:适用于 单线程 下在字符缓冲区进行 大量操作 的情况
StringBuffer:适用 多线程 下在字符缓冲区进行 大量操作 的情况