JavaSE学习:第二十三章、String类

1、认识:

1、String 对象用于保存字符串,也就是一组字符序列。
2、字符串的字符使用Unicode编码,一个字符占两个字节。
3、String有很多构造器,构造器重载。
4、String类实现了Serializable接口【可以串行化:可以在网络传输】。
Comparable接口【可以比较大小】
5、String是finall类,不可被继承。
6、String有属性 private final char value[]; 用于存放字符串内容。
7、value是一个final类型,表示不可以修改【即value不能指向新的地址,但是字符内容可变】

2、string创建方法:

方法一:

String s = "hsf";

方法二:

String s2 = new String("hsf");

区别:
方法一:先从常量池看是否有有"hsf"数据,如果有直接指向,没有则重新创建,然后指向。s最终返回的是常量池的地址空间
方法二:先在堆中创建空间,里面有value属性,指向常量池;如果常量池有"hsf",直接指向,没有则创建,最终返回的是堆中的地址空间

在这里插入图片描述
测试题1:

public class Test1 {
    public static void main(String[] args) {
        String a = "hsf";
        String b = new String("hsf");
        System.out.println(a.equals(b));  // t 比较内容是否相等
        System.out.println(a == b);       // f  比较地址值是否相等
        System.out.println(a == b.intern()); // t
        System.out.println(b == b.intern());  // f
    }
}

1、intern();方法:如果常量池中已经有一个等于String对象的字符串,则直接返回池中字符串地址;如果池中没有,则创建并返回此String对象引用。
2、intern():直接从池中返回地址。

测试题2:

public class Test1 {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "hsf";
        Person p2 = new Person();
        p2.name = "hsf";
        System.out.println(p1.name.equals(p2.name));  // t
        System.out.println(p1.name == p2.name);       // t:比较值
        System.out.println(p1.name == "hsf");         // t
    }
}

测试题三:
在这里插入图片描述
在这里插入图片描述

3、string一些方法:

package com.hsf.string;/*
 * @author HSF
 * @version 8.0
 */

import java.util.Locale;

public class Test1 {
    public static void main(String[] args) {
        String name = "helloWord";
        System.out.println(name.substring(4));  // [4,后面所有):oWord
        System.out.println(name.substring(0,5)); // [0,5):hello
        System.out.println(name.indexOf('o'));  // 4
        System.out.println(name.toLowerCase(Locale.ROOT));  // helloword
        System.out.println(name.toUpperCase(Locale.ROOT)); // HELLOWORD
        System.out.println(name.replace('h','H'));  // HelloWord
        System.out.println(name);  // helloWord  replace对原数据没有影响
        String add = "E:\\aaa\\bbb";
        String[] split_ = add.split("\\\\");
        for (String s : split_) {
            System.out.println(s);
        }

        /*占位符:
        * 1、%s:表示后面由字符串替换。
        * 2、%d:由整数替换。
        * 3、%.2f:表示使用小数替换,替换后只会保留小数点后两位,并且四舍五入。
        * 4、%c:表示使用char类型替换。
        * */
        int age = 20;
        double grade = 98.1;
        char gender = '男';
        String formatStr = "我的姓名是%s,年龄是%d,成绩是%.2f,性别是%c";
        String info = String.format(formatStr, name, age, grade, gender);
        System.out.println(info); // 我的姓名是helloWord,年龄是20,成绩是98.10,性别是男


    }
}
class Person{
    String name;
}

在这里插入图片描述
在这里插入图片描述

4、StringBuilder/StringBuffer

String对象是不可变的, 每次进行字符串的连接都会生成新的字符串对象:
在string中修改值不是把原先的值删除,而是重新生成一个值,原来的值还在那,只是对象不指向原来那个值了。
如果需要频繁进行字符串连接时, 不建议使用String字符串, 而是使用StringBuilder/StringBuffer。

  • StringBuilder/StringBuffer
  1. 称为可变的字符串,value数组存放的字符串内容在堆中。
  2. 最常用的方法是append(), 在当前字符串的后面追加另外一个字符串
  3. 默认初始化大小: 16
  4. 当value数组已满,需要扩容, 按 value.length * 2 + 2 大小扩容
  5. StringBuffer提供的方法都使用了synchronized进行了修饰, 是线程安全的.
    StringBuilder不是线程安全的,但是StringBuilder速度更快,如无特殊,优先采用此类。在StringBuilder上主要操作的是append和inset方法,可重载这些方法,以接受任意类型的 数据。

构造器:

public class StringBuffer_ {
    public static void main(String[] args) {
        // 1、创建一个大小为16的char[],用于存放字符内容
        StringBuffer stringBuffer = new StringBuffer();

        // 2、通过构造器指定char[]大小
        StringBuffer stringBuffer1 = new StringBuffer(100);

        // 3、通过给一个string创建:大小为str.length() + 16
        StringBuffer stringBuffer2 = new StringBuffer("hell0");
    }
}

stringBuffer转换为string类型:

        StringBuffer stringBuffer = new StringBuffer();
        // stringBuffer-->string:两种方法
        String s1 = stringBuffer.toString();
        String s2 = new String(stringBuffer);

5、stringBuffer方法:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值