java知识点一:String类

String类

一.String类是什么?

 

打开String的源码,类注释中有这么一段话“Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings.Because String objects are immutable they can be shared.”。这句话总结归纳了String的一个最重要的特点:String是值不可变(immutable)的常量,是线程安全的(can be shared)。

 

接下来,String类使用了final修饰符,表明了String类的第二个特点:String类是不可继承的。

String类的成员变量定义,从类的实现上阐明了String值是不可变的(immutable):

    private final char value[];
              private final int count; 

总结:String实质是字符数组,两个特点:1.不可被继承;2。不可变性(immutable)

二.String的定义方法

总共有三种:

  • 使用关键字new,如:String s1 = new String(“myString”);//字符串常量池和堆中各创建一次
  • 直接定义,如:String s1 = “myString”;//字符串常量池中创建一次
  • 串联生成,如:String s1 = “my” + “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
    }
@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
    }

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

@Test
    public void test3() {
        String str = "123";
        // String转基本数据类型,通过包装类的parse系列方法
        int i = Integer.parseInt(str);
        // 基本数据类型转String,简单的可以直接+"",通过方法是String.valueOF()
        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);
    }

四.String、StringBuffer、StringBuilder的联系与区别

StringBuffer和StringBuilder都是字符串缓存区,都继承了抽象类AbstractStringBuilder,这个抽象类与String一样,也定义了char[] value 和 int count,但是没用final修饰符。

因此:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,

即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的

StringBuffer的常用方法:

StringBuffer sb = new StringBuffer();
    sb.append("haha"); //添加字符串
    System.out.println(sb);//haha
    sb.insert(2, "it");//在指定下标位置插入
    System.out.println(sb);//haitha
    sb.delete(1, 4);//删除 包头不包尾(不包含4)
    System.out.println(sb);//hha
    sb.replace(1, 4, "cast");//替换指定范围内的内容
    System.out.println(sb);//hcast
    String str = sb.toString();//返回String类
    System.out.println(str);//hcast

区别:

1.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String建立对象并赋值后,是不能更改的,当对其添加操作后,是创建了一个新的对象也名为str。所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

2.再来说线程安全,在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

 StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。在单线程的情况下可以使用StringBuilder。

总结:

    1.String:适用于少量的字符串操作的情况

    2.StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况 

    3.StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

String内存参考地址:http://www.importnew.com/15671.html

    

 

 

 

 

       

                            

 

转载于:https://www.cnblogs.com/python-road/p/10464809.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值