1、String类
(1)String类的特点一(字符串一旦确立就不能更改,字符串是一个常量。)
也就是说String类对象不可变,对象的引用可以改变。
不可变的对象:
public static void main(String[] args) {
String str="123";
str="234";
System.out.println(str);
}
输出的结果为234。
上面在对str改变值的过程中体现的便是对象的引用的改变。
(2)String的特点二:String不属于八大基本数据类型,它属于引用数据类型。
String str="123";
String str1=new String("234");
以第二种方式跟类创建对象的方式是一样的。
(3) String类的方法:
import java.util.Scanner;
public class StringDemo {
public static void main(String[] args) {
System.out.println("请输入第一个字符串:");
Scanner sc1 = new Scanner(System.in);
String str1 = sc1.nextLine();// 在内存中只有一个对象。这个对象在字符串常量池中
System.out.println("请输入第二个字符串:");
Scanner sc2 = new Scanner(System.in);
String str2 = new String(sc2.nextLine());// 在内存中有两个对象。一个new的对象在堆中,一个字符串本身对象,在字符串常量池中
System.out.println("两个字符串地址是否相等:" + (str1 == str2));// (1)
System.out.println("两个字符串元素是否相等:" + str1.equals(str2));// (2)
System.out.println("两个字符串元素是否相等:" + str1.equalsIgnoreCase(str2));// (2)
System.out.println("字符串一的长度为:" + str1.length());// (3)
System.out.println("字符串一为:" + str1.toString());
System.out.println("字符串二为:" + str2.toString());
System.out.println("字符串一从地址2开始取字符串:" + str1.substring(2));// (4)
System.out.println("字符串一从地址2到5取字符串:" + str1.substring(2, 5));// (5)
System.out.println("字符串一是否以指定前缀1开始:" + str1.startsWith("1"));// (6)
System.out.println("字符串二是否以指定后缀9结束:" + str2.endsWith("9"));// (7)
System.out.println("字符串一是否包含字符串123:" + str1.contains("123"));// (8)
System.out.println("字符串123在str1中第一次出现的索引:" + str1.indexOf(str1));// (9)
char[] chs = str1.toCharArray();// (10)转换为字符数组
String s0 = new String(chs);
System.out.println(s0);
System.out.println("字符数组的第一个字符为:" + chs[0]);
byte[] bytes = str1.getBytes();// (11)转换为字节数组
String s = new String(bytes);
System.out.println(s);
System.out.println(bytes[0]);
System.out.println("字符串二转换为大写字母为:" + str2.toUpperCase());// (12)
System.out.print("charAt的运用:");
for (int i = 0; i < str1.length(); i++) {
char ch = str1.charAt(i); // 获取指定位置上的字符
System.out.print(ch);
}
}
}
(4)对象与对象的引用:
java中经常说的一句话是“万物皆对象”,那么究竟什么是对象呢?
对象是类的一个实例,比如说人类是一个类,那么具体到一个人的话这个人就是一个对象,该对象有具体的年龄、性别、姓名等属性。
什么又是对象的引用呢?
Person person;
person=new Person("zhai",12);
person=new Person("zhang",23);
可以看到后两行代码分别创建了两个对象,那么person就是对象的引用,对象的引用可以指向Person类型的任何一个对象。
2、StringBuffer类
StringBuffer类:与String类不同,StringBuffer类在创建对象之后可以用不同的方法对该对象进行多种方式的修改。
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("1234"); //添加字符串
sb.insert(2, "dont");//在指定位置插入,
sb.delete(1, 4);//删除,包含头,不包含尾
sb.replace(1, 4, "not");//替换指定范围内的内容,包含头,不包含尾
String str = sb.toString();
System.out.println(str);
System.out.println(sb.reverse());//反转
System.out.println("字符串的长度为:"+sb.length());
}
}
3、StringBulider类
StringBulider类创建的字符串同样可以对字符串进行修改:
public class StringBuliderDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("1234"); //添加字符串
sb.insert(2, "dont");//在指定位置插入,
sb.delete(1, 4);//删除,包含头,不包含尾
sb.replace(1, 4, "not");//替换指定范围内的内容,包含头,不包含尾
String str = sb.toString();
System.out.println(str);
System.out.println(sb.reverse());//反转
System.out.println("字符串的长度为:"+sb.length()); } }
4、 String类、StringBuffer类、StringBulider类的区别
(1)线程安全性:
线程安全:String、StringBuffer
线程不安全:StringBulider
(2)执行效率
StringBulider最快,Stringbuffer次之,String最差
(3)存储空间
String的对象一旦创建就不能改变,是一个常量,对String操作后会生成新的String,效率低且浪费空间。
StringBuffer和StringBulider的对象都是可以改变的,节省了空间,效率较高。不能使用String”+”来拼接,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。
(4)使用场景
少量数据:String
大量数据、多线程:StringBuffer
大量数据、单线程:StringBulide
总结:
String、StringBuffer、StringBulider的区别:https://tech.souyunku.com/zhai1997/p/12423092.html