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;iString类型的拼接是通过StringBuilder类中的append方法实现的,然后返回toString的结果,是在堆中的新对象
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)