字符串String、StringBuffer、StringBuilder类的区分

原著不易,用到的都会粘贴连接。

Object类是所有类,数组,枚举类的父类,也就是说,java允许把所有任何类型的对象赋值给Object类型的变量。创建一个类没有写继承那个父类时,默认继承Object父类。
字符串是一连串的字符序列。

  1. String类是不可变类,一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

  2. StringBuffer对象则是一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过其提供的append、insert、reverse、setCurrent、setLength等方法可以改变这个字符串对象的字符序列。最后可以调用toString方法将其转换为一个String对象大多数用在多个线程。

  3. JDK1.5新增了一个StringBuilder类,它也代表的是字符串对象。它和StringBuffer基本是相似的(构造器和方法基本相同),用在字符串缓冲区被单个线程使用的时候(很普遍)。

StringBuffer是线程安全的,StringBuilder则没有实现线程安全功能,所以性能略高。在通常我们如果需要创建一个内容可变的字符串对象,我们应该优先考虑使用StringBUilder类。

String类提供了大量构造器来创建String对象,如下几个有特殊的用途:

  • String():创建一个包含0个字符串序列的String对象(并不返回null)。
  • String(byte[] bytes,Charset charset):使用指定的字符集将指定的byte数组解码成一个新的String对象。
  • String(byte[] bytes,int offset, int length):使用平台的默认字符集将指定byte数组的offset开始,长度为length的子数组解码成一个新的String对象。
  • String(byte[] bytes,int offset, int length,String charsetName):使用指定的字符集将指定byte数组的offset开始,长度为length的子数组解码成一个新的String对象。
  • String(char[] value,int offset,int count):将指定字符串数组从offset开始,长度为length的子数组中字符元素连缀成字符串。
  • String(String original):根据字符串直接量来创建一个String对象。也就是说,新创建的String对象是该参数字符串的副本。
  • String(StringBuffer buffer):根据StringBuffer对象来创建对应的String对象。
  • String(StringBuilder builer):根据StringBuilder对象来创建对应的String对象。
    此外String类也提供了大量方法来操作字符串对象,如下所示:
    char charAt(int index):取字符串中的指定位置的字符,其中参数index指的是字符串中序数。字符串的序数从0开始到length()-1。*
public class StringDemo {
    public static void main(String[] args) {
        String s = new String("acbdfhs");
        System.out.println("s.charAt(5): " + s.charAt(5));
    }


}

字符串String、StringBuffer、StringBuilder类的区分_第1张图片
int compareTo(String anotherString):当前String对象与anotherString比较。如果连个字符串的字符序列相等则返回0;不相等时,从两个字符串第0个字符开始比较,返回第一个不相等的字符差,另一种情况,较长字符串的前面部分恰巧是较短的字符串,返回它们的长度差。
第一种情况:字符串1的第一个字符跟字符串2的第一个字符不相等,则两个字符串都按照第一个字符的ASCII码顺序进行比较,其他字符都不用看,并返回一个整型

String str1 = "abcde";
        String str2 = "Ilove";
        System.out.println(str1.compareTo(str2)); //ASCII码表中来比较。 
        // a 在ASCII码表中十进制的下标为 97 , I 是 73 ,97比73多24,所以返回 24 。

第二种情况:字符串1的第一个字符如果跟字符串2的第一个字符相等,那么就以两个字符串的第二个字符开始比较,如果还是相等就以第三个字符开始比较……以此类推,直到两个字符串中出现不一样的字符时再比较双方的字典顺序。

 String str1 = "abcww";
        String str2 = "abc";
        System.out.println(str1.compareTo(str2));//返回值为2
String str1 = "abc";
        String str2 = "abcdefgh";
        System.out.println(str1.compareTo(str2));

字符串String、StringBuffer、StringBuilder类的区分_第2张图片

上面一些Sring方法解说是粘贴的:原作者Java String类的compareTo()方法-简单理解与使用

intcompareTo(Objiect o):如果o是String对象,和前一个方法一样;否则抛出ClassCastException异常。
字符串String、StringBuffer、StringBuilder类的区分_第3张图片
String concat(String str):将该String对象与str连接在一起。与字符串连接运算符“+”的功能相同

 String str = "abcde";
        str = str.concat("123456");
        System.out.println(str);//输出abcde123456

boolean contentEquals(StringBuffer sb):将该String对象与StringBuffer对象sb进行比较,当他们包含的字符序列相同时返回为true。

 String str = "abc de";
        StringBuffer sb = new StringBuffer("abc de"); 
       // StringBuffer sb = new StringBuffer("webhf1");
        //boolean b = str.contentEquals(sb); //false
        boolean b = str.contentEquals(sb); //ture
        System.out.println(b);

static String copyValueOf(char[] data):将字符数组连缀成字符串,与String[char[] content]构造器的功能相同。
static String copyValueOf(char[] data,int offset,int count):将char数组的子数组中的元素连缀成字符串,与String(char[] value,int offset,int count)构造器的功能相同。

char[] charArr = { 'O', 'M', 'P', 'I', 'L', 'E', ' ',
                'O', 'N', 'L', 'I', 'N',  };
        String str = String.copyValueOf(charArr, 8, 3);
        System.out.println(str); //返回NLI
速学堂:这里关于String类方法有非常详细的讲解。

太多了,不想写了,自己可以去里面看!!!
boolean equals(Object anObject):将该字符串与指定对象比较,如果1二者包含的字符序列相等则返回ture。否则返回false。

String类是不可变的,String的实列一旦生成就不会在改变了。会额外产生许多临时变量,使用StringBuffer或者StringBuilder就可以避免这个问题。

字符串String、StringBuffer、StringBuilder类的区分_第4张图片
两次new出来的String对象不是同一个对象,所以使用==比较返回false。
用new String()创建的字符串不是常量,不能在编译器就确定,使用newString()创建的字符串不会放入常量池中,它们有自己的地址空间。
常量池(constant pool)指的是在编译器被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,也包括字符串常量。

StringBuffer、StringBuilder的length是可变的,可以通过length()和setLeng(int len)方法里访问和修改其字符序列的长度。capacity属性代表了StringBuilder的容量,capacity通常比length大,程序通常无须关心capacity属性。

 StringBuilder sb = new StringBuilder();
        //追加字符串
        sb.append("java");
        //插入
        sb.insert(0,"hello");
        //替换
        sb.replace(5,6,",");
        //删除
        sb.delete(5,6);
        System.out.println(sb);
        //反转
        sb.reverse();
        System.out.println(sb);
        System.out.println(sb.length());
        System.out.println(sb.capacity());
        //改变StringBuilder的长度,将只保留前面部分
        sb.setLength(5);
        System.out.println(sb);

字符串String、StringBuffer、StringBuilder类的区分_第5张图片

之后会写多线程。
原书籍是:疯狂JAVA讲义

你可能感兴趣的:(java上课笔记)