zoukankan      html  css  js  c++  java
  • 3.2常用类(java学习笔记)String与StringBuffer

    一、String

    String又称不可变字符序列。

    我们看JDK源码中用于字符存储的数组有final修饰,final修饰变量就代表变量不能改变。

    我们可以看API文档中对String的描述。

    String 代表字符序列。在java程序中所有的字符串字面量,如“abc”实现实例都属于这个类。

    String是不可改变的;它的values不能在创建之后改变。String buffers是支持可变的字符串。因为String对象是

    不可变的它们能共享。

    1.String实例化方法

    public class Test {
        public static void main(String[] args) {
            String str1 = "abc";              //实例化方法1
            String str2 = new String("efg");   //实例化方法2
            
            System.out.println(str1);
            System.out.println(str2);
        }    
    }
    运行结果:
    abc
    efg

    这两种实例化方法都可以,具体区别后面会有补充。

    2.字符串的比较

    public class Test {
        public static void main(String[] args) {
            String str1 = "abc";
            String str2 = new String("abc");
            
            System.out.println(str1 == str2);
            System.out.println(str2.equals(str1));
        }    
    }
    运行结果:
    false
    true

    首先第一个==比较比较的是对象的地址值,这里str1和str2是两个地址,所以直接比较地址会是false。

    而str2.equals(str1)是比较字符串的内容是否相等。

    str1和str2的内容虽然一样,但它们是两个对象,各自存储一个abc。所以直接比较对象地址会是false。

    我们再来看下列代码

    public class Test {
        public static void main(String[] args) {
            String str1 = "abc";
            String str2 = new String("abc");
            String str3 = "abc";
            
            System.out.println(str1 == str2);
            System.out.println(str1 == str3);
            System.out.println(str2.equals(str1));
        }    
    }
    运行结果:
    false
    true
    true

    我们会发现,str1和str2直接比较是false,但是str1和str3直接比较是false。

    这就说下之前说的到两种构造方法的区别,String str1 = “abc”;这种构造方法,当指向的内容一致时,两个实例会指向相同的地址,而不会重新创建实例。

    String str2 = new String("abc");这种方法无论内容相同与否都会重新创建一个新的实例。

    3.字符串内容不可变

    一开始就说了String又称为不可变字符序列。

    我们看下列代码:

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            String str2 = "world";
    
            str2 = str1 + str2;        
            
            System.out.println(str1);
            System.out.println(str2);
        }    
    }
    运行结果:
    holle
    holleworld

    看到这段代码,大家可能会有疑问,这str2变了呀,变成了holle world.

    其实变的是str2指向的地址值,内容并没有改变。

    只是断开了原有指向,重新指向新的地址。

    由于String的不可变特性,要避免一下代码:

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            for(int i = 0; i < 100; i++){
                str1 = str1 + i;    //由于String是不可变的,所以会不停指向新的地址。
            }
            System.out.println(str1);
        }    
    }

    4.Strign常用方法

    4.1 charAt(int index)

    获取字符串中指定下标的字符。

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            char ch;
            ch = str1.charAt(1);
        
            System.out.println(ch);
        }    
    }
    Test_charAt
    运行接过:
    o
    运行结果

    4.2 indexOf(String str)

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            int i;
            i = str1.indexOf("le");
        
            System.out.println(i);
        }    
    }
    Test_indexOf
    运行结果:
    3
    运行结果

    4.3 substring(int start, int end)

    截取指定开始位和结束位前一位之间的字符串。

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            
            System.out.println(str1.substring(2, 4));
        }    
    }
    Test_substring
    运行结果:
    ll
    运行结果

    4.4 toUpperCase();

    将字符串变为大写

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            
            System.out.println(str1.toUpperCase());
        }    
    }
    Test_UpperCase
    运行结果:
    HOLLE
    运行结果

    还有很多方法就不一一介绍了,JDK里面的源码和文档有详细的说明。

    二、StringBuffer

    StringBuffer是线程安全、可变的字符序列。线程安全也就意味着效率较低。

    StringBuffer基本操作方法。

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            StringBuffer b1 = new StringBuffer("abc");
            StringBuffer b2 = new StringBuffer("def");
            StringBuffer b3 = new StringBuffer("gh");
            
            System.out.println(b1.append(b2).append(b3));
        }    
    }
    运行结果:
    abcdefgh

    StringBuffer不能向String那样使用+连接,必须是用连接函数append()来连接。

    连接后不是像String那样指向新的地址,而是将b2和b3的内容追加到b1里面。(因为b1是可变的字符序列,故可以对其进行修改增加)

    append()的功能非常强大可以连接很多东西(即将很多类型写到原有字符串里面)。这个大家可看下JDK的源码。

    当前数组长度不够时,StringBuffer会自动扩大当前数组长度。

    不会像String那样直接创建新的。

    StringBuffer是可变的字符序列,主要特性是可变可修改的。

    它的很多方法与String类似,下面举几个例子。

    1.indexOf(String str)

    查找指定字符串所在下标

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            StringBuffer b1 = new StringBuffer("hello");
    
            System.out.println(b1.indexOf("ll"));        
        }    
    }
    Test_indexOf
    运行结果:
    2
    运行结果:

    2.insert(in toffset, String str)

    在指定位置加上指定字符串。

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            StringBuffer b1 = new StringBuffer("hello");
    
            System.out.println(b1.insert(2,".."));        
        }    
    }
    Test_insert
    运行结果:
    he..llo
    运行结果

    3.revers()

    将内容反转。

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            StringBuffer b1 = new StringBuffer("hello");
    
            System.out.println(b1.reverse());        
        }    
    }
    Test_reverse
    运行结果:
    olleh
    运行结果

    4.delete(int start, int end)

    删除指定范围的内容

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            StringBuffer b1 = new StringBuffer("hello");
    
            System.out.println(b1.delete(2,4));        
        }    
    }
    Test_delete
    运行结果:
    heo
    运行结果

    5.substring(int start int end);

    截取指定范围的字符串

    public class Test {
        public static void main(String[] args) {
            String str1 = "holle";
            StringBuffer b1 = new StringBuffer("hello");
    
            System.out.println(b1.substring(2,4));        
        }    
    }
    Test_substring
    运行结果:
    ll
    运行结果

    6.toString()

    将内容转换为String类型。

    public class Test {
        public static void main(String[] args) {
            String str1;
            StringBuffer b1 = new StringBuffer("hello");
            str1 = b1.toString();
            System.out.println(str1 + "");        
        }    
    }
    Test_toString
    运行结果:
    hello
    运行结果

    还有很多方法这里只是举几个例子,有兴趣深入了解可以去查看JDK源码或API文档。

  • 相关阅读:
    sql删除重复数据,保留一条
    sql列转行
    异步线程:一次性发送大量邮件
    限制接口的访问次数
    Kibana(安装及其简单crud)
    Elasticsearch(简介及其单节点搭建)
    大数据(日志分析)项目
    大数据(sqoop)
    大数据(Hive数据库、表的详解及其Hive数据导入导出)
    大数据(Hive的MetaStore切换及其Hive的语法细节)
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/9504904.html
Copyright © 2011-2022 走看看