Java字符串类型

本文探讨了Java中字符串类型的区别,介绍了String类的不可变性质,重点讲解了StringBuilder和StringBuffer的用法,包括拼接、修改和特殊方法,并对比了两者在多线程环境下的适用性。
摘要由CSDN通过智能技术生成

字符:简单类型char,标准格式为单引号

字符串:复合类型String,标准格式为双引号

在Java中字符串属于对象,Java提供了String类来创建和操作字符串。但是对字符串要进行频繁修改的时候使用StringBuffer和StringBuilder类,因为它们的对象经过多次修改而不产生新的未使用对象。

字符串拼接

String s1="ab"+"c";//Java针对+和+=进行了重新定义,在字符串中+表示字符串拼接
String s2="abc";
System.out.println(s1==s2);//true 在复杂类中==用于比较两个对象的地址是否相同
System.out.println(s1.equals(s2));//true 调用String中定义的方法,用于比较两个字符串内容是否一致

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

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

String类是不可改变的,一旦创建了String类它的值就不会发生改变了,否则就会导致对象的新建。

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

 StringBuilder和StringBuffer的基本用法:

String一般是用于常用字符串,而StrinBuilder和StringBuffer用于频繁修改规则

//构建对象
StringBuilder ss1=new StringBuilder();
StringBuffer ss2=new StringBuffer("abcd");
 
//拼接字符串
ss2.append("123");            //在字符串末尾拼接
 
ss2.insert(1,"rst");          //在指定下标位置上插入字符串
 
ss2.delete(1,3);             //删除指定位置上的内容【start=1.end=3】
 
ss2.CharAt(1);               //值删除指定下标上的字符
 
ss2.replace(1,2,"新的内容"); //将指定下标位置上的内容替换为新内容
 
System.out.println(ss2);
 
 
ss2.reverse();             //反转字符串
 
int len=ss2.length();       //获取字符个数
 
int pos=ss2.indexof("容内") //查找位置
 
 
//其他方法基本和String一致
 
 

 特殊方法:String类使用静态方法format()返回一个String对象,是用来创建可复用的格式化字符串。

最常见的格式符号:浮点数%f、整型%d、字符串%s。

String ss=null;
//字符串的判空处理
//trim方法的含义是去掉字符串前后两端的空格
if(ss==null ||ss.trim().length()<1){
    System.out.println("字符串内容为空!");
}


//推荐写法
String ss=null;
//如果使用普通方法进行判断ss.equals("bbb")时会出现异常中断,使用Objects.equals可以避免空指针异常
if(Objects.equals(ss,"aa")){
    System.out.println("字符串内容为aa");
}

可变与不可变:
String类中使用字符数组保存字符串,因为有final修饰符,所以可以知道string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,可知这两种对象都是可变的。
是否多线程安全:
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
StringBuilder与StringBuffer共同点:
StringBuilder与StringBuffer有公共父类AbstractStringBuilder抽象类。抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值