• String与StringBuffer、StringBuilder


    一、执行速度

    StringBuilder >  StringBuffer  >  String

     

    二、StingBuffer和StingBuilder比较

    1.StringBuffer 线程安全,效率慢   JDK1.0

    2.StringBuilder 线程不安全,效率快   JDK1.5

    都继承自AbstractStringBuilder。

    三、String方法、简介

    String类的常用方法的使用:length(), charAt(), toUpperCase(), toLowerCase(), valueOf()方法。

     

    1、获取

    1.1 字符串中的字符数,也就是字符串的长度。

    int length():获取长度

    1.2 根据位置获取位置上某个字符。

    char charAt(int index)

    1.3 根据字符获取该字符在字符串中的位置。

    int indexOf(int ch):返回的是ch在字符串中第一次出现的位置。

    int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch第一次出现的位置。

    1.4 根据字符串获取该字符串在字符串中的位置。

    int indexOf(String str):返回的是str在字符串中第一次出现的位置。

    int indexOf(String str,int fromIndex):从fromIndex指定位置开始,获取str第一次出现的位置。

     

    2、判断

    2.1 字符串中是否包含某一个子串。

    boolean contains(str):

    特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1,则表示该str不在字符串中存在。所以,也可以用于对指定判断是否包含。

    2.2 字符串中是否有内容。

    boolean isEmpty():原理就是判断长度是否为0.

    2.3 字符串是否以指定位置开头。

    boolean startsWith(str):

    2.4 字符串是否以指定位置结尾。

    boolean endsWith(str):

    2.5 判断字符串内容是否相同。   复写了Object类中的equals方法。

    boolean equals(str):

    2.6 判断内容是否相同并忽略大小写。

    boolean equalsIgnoreCase():

     

    3、转换

    3.1 将字符数组转成字符串

    构造函数:

    String(char[])

    String(char[],offset,count):将字符数组中由offset位置开始之后的count个字符转换成字符串。

    静态方法:

    static String copyValueOf(char[]);

    static String copyValueOf(char[] data,int offset,int count)

     static String valueOf(char[]);

    3.2 将字符串转换成字符数组

    char[] toCharArray();

    3.3 将字节数组转换成字符串

    String(byte[]);

    String(byte[],offset,count):将字节数组中的一部分转换成字符串。

    3.4 将字符串转换成字节数组

    byte[] getBytes();

    3.5 将基本数据类型转换成字符串

    String valueOf(int)

    String valueOf(double)

    特殊:字符串和字符数组走在转换过程中是可以指定编码表的;

     

    4、替换

    String replace(oldchar,newchar);

     

    5、切割

    String split(regex);

     

    6、子串

    String substring(begin);

    String substring(begin,end);

     

    7、转换、去除空格、比较u

    7.1 将字符串转换成大些或小写。

    String toUpperCase():转换成大写

    String toLowerCase(): 转换成小写

    7.2 将字符串两端的多个空格去掉。

    String trim();

    7.3 对两个字符串进行自然顺序的比较。

    int comparaTo(String);

     

    四、StingBuffer方法、简介

     

    1.特点:(字符串缓冲区,是一个容器)

    1)长度是可变化的。

    2)可以直接操作多种数据类型。

    3)最终会通过toString()方法变成字符串。

     

    2.StringBuffer可以对字符串内容进行增删。

     

    CURD      C create U update R read D delete 

    1)存储

    StringBuffer append():将指定数据作为参数添加到已有数据结尾处。

    StringBuffer insert(index,数据):可以将数据插入到指定index位置。

     2)删除

    StringBuffer delete(start,end):删除缓冲区中指定位置的数据,包含start,不包含end。

    StringBuffer deleteCahrAt(index):删除指定位置的字符。

     3)获取

    char charAt(int index)

    int  indexOf(String str)

    int  lastIndexOf(String str)

    int  length()

    String substring(int start,int end)

     4)修改

    StringBuffer replace(int start,int end,String str):用字符串替换某段位置的字符串。

    void setCharAt(int index,char ch):用字符替换某个位置的字符。

     5)反转

    StringBuffer reverse():

     6)将缓冲区指定数据存储到指定字符数组中。

    void getChars(int srcbegin,int srcend,char[] dst,int dstBegin)

    srcbegin:字符串中开始截取的位置

    srcend:字符串中结束位置

    dst:数组

    dstBegin:数组开始存放数据的位置

       

     

    五、字符串的比较运算:

    equals() 方法:用来比较两个字符串对象所包含的值是否相等。

    == 运算符  :用来比较两个字符串对象在内存的地址是否相等。

     

    六、equals() 方法与 equalsIgnoreCase() 方法的区别:

    equals() 方法:用来比较两个字符串对象所包含的值是否相等。

    equalsIgnoreCase() 方法:不区分大小写的比较两个字符串对象所包含的值是否相等。

     

    七、补充内容

    String str1 = "1";
    String str2 = "2";
    //从 JDK 1.5 开始,带有字符串变量的连接操作(+),JVM 内部采用的是StringBuilder来实现的,而之前这个操作是采用 StringBuffer 实现的.
    String str = str1 + str2;

    案例解析:

    public static void main(String[] args) {  
            /** 
             * 情景一:字符串池(常量池) 
             * JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象; 
             * 并且可以被共享使用,因此它提高了效率。 
             * 由于String类是final的,它的值一经创建就不可改变。 
             * 字符串池由String类维护,我们可以调用intern()方法来访问字符串池。  
             */  
            String s1 = "abc";     
            //↑ 在字符串池创建了一个对象  
            String s2 = "abc";     
            //↑ 字符串s2已经存在对象“abc”(共享),所以创建0个对象,累计创建一个对象  
            System.out.println("s1 == s2 : "+(s1==s2));    
            //↑ true 指向同一个对象,  
            System.out.println("s1.equals(s2) : " + (s1.equals(s2)));    
            //↑ true  值相等  
            //↑------------------------------------------------------over  
            /** 
             * 情景二:关于new String("") 
             */  
            String s3 = new String("abc");  
            //↑ 创建了两个对象,一个存放在字符串池中,一个存在于堆中;  
            //↑ 还有一个对象引用s3存放在栈中  
            String s4 = new String("abc");  
            //↑ 字符串池中已经存在“abc”对象,所以只在堆中创建了一个对象(重新在堆中创建了一个对象),还一个对象引用s4放在栈中  
            System.out.println("s3 == s4 : "+(s3==s4));  
            //↑false   s3和s4栈区的地址不同,指向堆区的不同地址;  
            System.out.println("s3.equals(s4) : "+(s3.equals(s4)));  
            //↑true  s3和s4的值相同  
            System.out.println("s1 == s3 : "+(s1==s3));  
            //↑false 存放的地区多不同,一个栈区,一个堆区  
            System.out.println("s1.equals(s3) : "+(s1.equals(s3)));  
            //↑true  值相同  
            //↑------------------------------------------------------over  
            /** 
             * 情景三:  
             * 由于常量的值在编译的时候就被确定(优化)了。 
             * 在这里,"ab"和"cd"都是常量,因此变量str3的值在编译时就可以确定。 
             * 这行代码编译后的效果等同于: String str3 = "abcd"; 
             */  
            String str1 = "ab" + "cd";  //1个对象  
            String str11 = "abcd";   
            System.out.println("str1 = str11 : "+ (str1 == str11));  //true 常量池中已经存在"abcd"了
            //↑------------------------------------------------------over  
            /** 
             * 情景四:  
             * 局部变量str2,str3存储的是存储两个拘留字符串对象(intern字符串对象)的地址。 
             *  
             * 第三行代码原理(str2+str3): 
             * 运行期JVM首先会在堆中创建一个StringBuilder类, 
             * 同时用str2指向的拘留字符串对象完成初始化, 
             * 然后调用append方法完成对str3所指向的拘留字符串的合并, 
             * 接着调用StringBuilder的toString()方法在堆中创建一个String对象, 
             * 最后将刚生成的String对象的堆地址存放在局部变量str3中。 
             *  
             * 而str5存储的是字符串池中"abcd"所对应的拘留字符串对象的地址。 
             * str4与str5地址当然不一样了。 
             *  
             * 内存中实际上有五个字符串对象: 
             *       三个拘留字符串对象、一个String对象和一个StringBuilder对象。 
             */  
            String str2 = "ab";  //1个对象  
            String str3 = "cd";  //1个对象                                         
            String str4 = str2+str3;                                        
            String str5 = "abcd";    
            System.out.println("str4 = str5 : " + (str4==str5)); // false  
            //↑------------------------------------------------------over  
            /** 
             * 情景五: 
             *  JAVA编译器对string + 基本类型/常量 是当成常量表达式直接求值来优化的。 
             *  运行期的两个string相加,会产生新的对象的,存储在堆(heap)中 
             */  
            String str6 = "b";  
            String str7 = "a" + str6;  
            String str67 = "ab";  
            System.out.println("str7 = str67 : "+ (str7 == str67));  // false
            //↑str6为变量,在运行期才会被解析。  
            final String str8 = "b";  
            String str9 = "a" + str8;  
            String str89 = "ab";  
            System.out.println("str9 = str89 : "+ (str9 == str89));  // true
            //↑str8为常量变量,编译期会被优化  
            //↑------------------------------------------------------over  
        }

    八、String.intern()方法

     

    String对象的实例调用intern方法后,可以让JVM检查常量池,如果没有实例的value属性对应的字符串序列比如"123"(注意是检查字符串序列而不是检查实例本身),就将本实例放入常量池,如果有当前实例的value属性对应的字符串序列"123"在常量池中存在,则返回常量池中"123"对应的实例的引用而不是当前实例的引用,即使当前实例的value也是"123"。String的 intern()方法就是扩充常量池的 一个方法;当一个String实例str调用intern()方法时,Java 查找常量池中 是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常 量池中增加一个Unicode等于str的字符串并返回它的引用;看示例就清楚了

    public static void main(String[] args) {
            String s0 = "123"; 
            String s1 = new String("123"); 
            String s2 = new String("123"); 
            System.out.println( s0 == s1 ); //false
            System.out.println( "**********" ); 
            s1.intern(); //虽然执行了s1.intern(),但它的返回值没有赋给s1
            s2 = s2.intern(); //把常量池中"123"的引用赋给s2 
            System.out.println( s0 == s1); //flase
            System.out.println( s0 == s1.intern() ); //true//说明s1.intern()返回的是常量池中"123"的引用
            System.out.println( s0 == s2 ); //true
        }

    注意一:使用String不一定创建对象。

    注意二:使用new String,一定创建对象。

  • 相关阅读:
    JDBC 复习4 批量执行SQL
    JDBC 复习3 存取Oracle大数据 clob blob
    Oracle复习
    Linux命令(1)grep
    JDBC 复习2 存取mysql 大数据
    JDBC 复习1 DBUtil
    php 环境搭建问题
    Windows 批处理 bat 开启 WiFi 菜单选项 设置ID PWD
    Bat 批处理启动和停止Oracle 服务
    docker 学习1 WSL docker ,Windows docker
  • 原文地址:https://www.cnblogs.com/zdf159/p/7161628.html
Copyright © 2020-2023  润新知