Java基础知识总结 —— String类

1、String类的概述

(1)String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
(2)字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串(StringBuffer)。因为 String 对象是不可变的,所以可以共享。
关于字符串是常量可以看下面这个例子:

String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));

运行结果如下,可以看到str1和str2的地址是一样的:
在这里插入图片描述
String 这种不可变类,不可变指的是类值一旦被初始化,就不能再被改变了,如果被修改,将会是新的类,看下面这个例子:

String str1 = "abc";
System.out.println(str1.hashCode());
str1 = "def";
System.out.println(str1.hashCode());

运行结果如下,可以看到 str1的内存地址已经被修改了:
在这里插入图片描述
这里查看一下String的部分源码,理解为什么会出现上述情况:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    /** value数组被用来存放字符的 */
    private final char value[];
}

(1)String 被 final 修饰,说明 String 类绝不可能被继承了,也就是说任何对 String 的操作方法,都不会被继承覆写;
(2)String 中保存数据的是一个 char 的数组 value。我们发现 value 也是被 final 修饰的,也就是说 value 一旦被赋值,内存地址是绝对无法修改的,而且 value 的权限是 private 的,外部绝对访问不到,String 也没有开放出可以对 value 进行赋值的方法,所以说 value 一旦产生,内存地址就根本无法被修改。

2、String的常用构造方法

(1)String() 初始化一个新创建的 String 对象,使其表示一个空字符序列。
(2)String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
(3)String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
(4)String(String original) 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
(5)String(StringBuffer buffer) 分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。
(6)String(StringBuilder builder) 分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。
这里需要注意一下String(String original)这个构造方法是新创建的字符串是参数字符串的副本,看下面实例:

String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));

运行结果如下,这里只是修改了前面例子的代码,结果却大不相同:
在这里插入图片描述

3、String的其他常用方法

方法太多就不一一列举了,举几个实用的例子。
(1)首字符大写或者小写

//首字符大写
str.substring(0, 1).toUpperCase() + str.substring(1) 
//首字符小写
str.substring(0, 1).toLowerCase() + str.substring(1) 

这里主要注意一下substring 方法的底层使用的是字符数组范围截取的方法 :Arrays.copyOfRange(字符数组, 开始位置, 结束位置); 从字符数组中进行一段范围的拷贝。
(2)字符串相等判断
字符串相等判断一般分为两种一种是用==来判断,一种是用equals 或者 equalsIgnoreCase来判断。
==直接判断字符串内存地址是否相同,而equals却不一样,以下是equals的源码:

public boolean equals(Object anObject) {
    // 判断内存地址是否相同
    if (this == anObject) {
        return true;
    }
    // 待比较的对象是否是 String,如果不是 String,直接返回不相等
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        // 两个字符串的长度是否相等,不等则直接返回不相等
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            // 依次比较每个字符是否相等,若有一个不等,直接返回不相等
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

(3)字符串的替换

String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement) 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
(4)字符串的拆分和合并
String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。第一个参数是我们拆分的标准字符,第二个参数是一个 int 值,叫 limit,来限制我们需要拆分成几个元素。
static String join(CharSequence delimiter, CharSequence… elements) 合并操作,…这三个点叫做可变长参数,也就是相当于一个数组,能够传入0个至n个参数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值