java字符串类型

本文详细介绍了Java中String、StringBuilder和StringBuffer的区别,包括String的不可变特性,StringBuilder的可变拼接高效,以及StringBuffer的线程安全。通过实例展示了字符串操作、拼接、修改和多线程应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String 、 StringBuffer 、 StringBulider

String s1 = "ab" + "c"
String s2 = "abc";
System.out.println(s1 == s2);  //返回值为true
//s1和s2指向的是同一个对象  所以返回值是true

字符串常量拼接,在方法区的常量池中完成

String s0 = "ab";
String s1 = s0 + "c";
String s2 = "abc";
System.out.println(s1==s2); //false

String的基本使用

//String类型的基本使用
public class Test2 {
	public static void main(String[] args) {
		String s1="ab中c";//定义变量,String一般用于字符串常量,如果修改内容则会导致对象的新建
		//获取字符串种的字符个数
		int len=s1.length(); //字符串中的length是一个方法,数组中的length是一个属性
		System.out.println(len);
		//获取指定下标位置上的字符
		for(int i=0;i<len;i++) {
			char cc=s1.charAt(i);
			System.out.println(cc);
		}
		//字符串拼接
		String s2=s1+"123";
		System.out.println(s2);
		s2=s1.concat(s2);  //s1和s2收尾拼接  s1在前s2在后
		System.out.println(s2);
		
		s2+="ddd";
		System.out.println(s2);
		
		//查询子字符串的位置
		s1="abcdefabdasdfasab";
		//从左向右查询
		int pos1=s1.indexOf("ab");
		System.out.println(pos1);
		//从左向右查询,从指定的下标位置开始
		pos1=s1.indexOf("ab",2);
		System.out.println(pos1);
		
		//从右向左查询
		int pos2=s1.lastIndexOf("ab");
		System.out.println(pos2);
		pos2=s1.lastIndexOf("ab",13);
		System.out.println(pos2);
		
		//获取字符串中的一部分内容:子字符串
		String s3=s1.substring(3);//从指定下标开始到字符串末尾的全部内容
		System.out.println(s3);
		s3=s1.substring(3,6);  //从指定下标开始到指定下表结束,这两个位置之间的内容,含左不含右。注意这里含左不含右的意思是如果范围限定为s3=s1.substring(4,5);那么控制台只会输出e
		System.out.println(s3);
		
		//字符串内容替换
		s1="abcdefabdasdfasab";
		s2=s1.replace("ab", "3s3");//将字符串中指定的子字符串替换为新内容
		System.out.println(s2);
		
		//使用指定的字符将字符串分割为字符串数组【实际上是正则式】
		s1="sad,fasdf,sadfsaf,safsa,dfsvx,vx";
		String[] arr=s1.split(",");
		for(int i=0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
} 

String类型的拼接是通过StringBuilder类中的append方法实现的,然后返回toString的结果,是在堆中的新对象

/*
 * String一般用于常量字符串,如果需要频繁修改则可以使用StringBuilder或StringBuffer
 */
public class Test3 {
public static void main(String[] args) {
	//构建对象
	StringBuilder sb1=new StringBuilder();
	StringBuffer sb2=new StringBuffer("abcd");
	
	//拼接字符串
	sb2.append("123");//在字符串末尾拼接
	System.out.println(sb2);
	
	sb2.insert(1, "rst");//在指定下标位置上插入字符串
	System.out.println(sb2);
	
	sb2.delete(1, 3);//删除指定位置上的内容  start=1,end=3
	System.out.println(sb2);
	
	sb2.deleteCharAt(1);//只删除指定下标上的字符
	System.out.println(sb2);
	
	sb2.replace(1,2, "新的内容");//将指定下标位置上的内容替换为新内容
	System.out.println(sb2);
	
	//反转字符串
	sb2.reverse();
	System.out.println(sb2);
	
	//获取字符个数
	int len=sb2.length();
	System.out.println(len);
	
	//查找位置
	int pos=sb2.indexOf("容内");
	System.out.println(pos);
	
	//其余方法基本和String一致
	String s1=sb2.substring(pos);
	System.out.println(s1);
}
}

可变与不可变

* String类中使用的是字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。*private final char value[];*
* StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,可知这两种对象都是可变的。*char[] value;*

是否多线程安全

* String中的对象是不可变的,也就可以理解为常量,显然线程安全
* AbstractStringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandapacity、append、inster、indexO等公共方法
* StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的

StringBuilder与StringBuffer共同点

* StringBuilder与StringBuffer有公共父类AbstractStringBuilder抽象类。抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复已经存在的方法;而接口中只是对方法的申明和常量的定义。
* StringBuilder于StringBuffer有公共父类AbstarctStringBuilder抽象类。抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的声明和常量的定义。
* StringBuilder和SreingBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是SreingBuffer会在方法上加synchronized关键字,进行同步。

如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值