欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基础-常见类之String类

程序员文章站 2023-11-06 14:28:52
一、String类是什么 由第一段源码可知,String是一个final类,底层实现是final的字符数组,一旦创建,无法改变。 字符串是常量;他们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享。 二、如何创建 String s1 = "abc"; ......

一、string类是什么

public final class string
implements java.io.serializable, comparable<string>, charsequence {
/** the value is used for character storage. */
private final char value[];

/** cache the hash code for the string */
private int hash; // default to 0

/** use serialversionuid from jdk 1.0.2 for interoperability */
private static final long serialversionuid = -6849794470754667710l;

  由第一段源码可知,string是一个final类,底层实现是final的字符数组,一旦创建,无法改变。

  字符串是常量;他们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为string对象是不可变的,所以可以共享。

二、如何创建

  string s1 = "abc";//字符串常量池中创建一次(如不存在)

  string s2 = new string("abc");//字符串常量池中和堆中各创建一次

   // 更多的构造器,请参见api

  关于一个比较经典的面试题:string s1 = new string("hello");创建了几个对象的问题,可以参考源码中相关的构造器的源码,结合string的内存分析,便可以从深入进行理解了!

关于这个问题,详见:

三、常用方法

    第一部分:基本都是见名知意,详细的介绍,请参见api

  代码示例:Java基础-常见类之String类

@test
    public void test1() {
        string str = "helloworld";
        // length()——字符串的长度
        system.out.println(str.length());// 10
        // charat(int)——指定索引处(索引从0开始)的char
        system.out.println(str.charat(2));// 1
        // equals(object)——比较字符串的内容;equalsignorecase不区分大小写的比较
        system.out.println("helloworld".equals(str));// true
        // indexof()——索引操作(包含几个重载方法);lastindexof()为镜像操作,不再赘述
        system.out.println(str.indexof(2)); // -1(不存在2的字符)
        system.out.println(str.indexof("llo")); // 2
        // startswith()——是否以指定字符串开头;endswith()——为镜像操作
        system.out.println(str.startswith("ello", 1));// true
        // regionmatches()——与指定字符串的区域匹配,包含两个重载方法,详细介绍参见api
        system.out.println(str.regionmatches(2, "hello", 2, 2));// true
    }

第二部分

Java基础-常见类之String类

代码实例:

 

@test
    public void test2() {
        string str = "more love";
        // substring()——字符串截取,两个重载方法都是左闭的(两个参数的右开)
        system.out.println(str.substring(5, 8));// lov
        // replace()——进行替换操作;replaceall是匹配正则表达式的,详细请参见api
        system.out.println(str.replace('o', 'e'));// mere leve
        // trim()——去除前导空白和尾部空白
        system.out.println(str.trim());// mere leve
        // concat()——连接字符串
        system.out.println(str.concat(" for you"));  // more love for you
        // split()——根据正则表达式分割字符串,拆分为string[]
        system.out.println("a,b,c,d,e".split(",").length);// 5
    }

 

 以下几个练习题可以试试!

     // 1.如何实现自己的trim
            // 通过charat进行遍历,从头开始遍历到到非空格,再从尾部做一遍,substring()取值即可(注意异常情况)
        // 2.反转字符串中的指定的部分
            // 将字符串分割成3份,一份前面的,一份需要反转的,一份后面的,再将第2部分反转,添加,再组合成新的字符串
        // 3.获取一个字符串在另外一个字符串中出现的次数
            // 通过indexof(string)的循环判断,不断向后判断,直到末尾
        // 4.找出两个字符串中最大相同子串
            // 将短的串依次递减(第一位减掉,比较;最后一位减掉,比较,整数前两位减掉,循环...)看长串是否包含

 

 string类与基本数据类型的转换:

@test
    public void test3() {
        string str = "123";
        // string转基本数据类型,通过包装类的parse系列方法
        int i = integer.parseint(str);
        // 基本数据类型转string,简单的可以直接+"",通过方法是string.valueof(),或者tostring()
        string s = string.valueof(i);

        // string与字节数组的转换:str.getbytes()方法得到字节数组;再通过string构造器将字节数组转为字符串
        byte[] bytes = str.getbytes();
        string s1 = new string(bytes);

        //string与字符数组的转换:str.tochararray()方法,char[]转string同样是可以通过构造器
        char[] chars = str.tochararray();
        string s2 = new string(chars);
    }

 

 

四、可变字符串stringbuffer与stringbuilder

   其中,stringbuffer是线程安全的,而stringbuilder是线程不安全的,但它效率更高

   基本构造器:

     stringbuffer sb = new stringbuffer();
        stringbuffer sb2 = new stringbuffer("abc");

  

 // 当然它的底层还是字符数组,但它有容量的概念,修改的时候是可以改变容量的

常用的方法:

@test
    public void test4() {
        stringbuffer sb = new stringbuffer("abc");
        // append()——追加
        system.out.println(sb.append("def").tostring());//"abcdef"
        // insert()——在指定位置插入
        system.out.println(sb.insert(1, "bb"));//abbbcdef
        // reverse()——反转
        system.out.println(sb.reverse().tostring());//fedcbbba
        // 其它和字符串相类似的方法不再赘述
    }