String源码浅析

String简介

String是java中很常用的字符串类型。作为八大基本数据类型之外的字符串数据类型,与基本数据类型不同的是,String是引用类型,也就是与我们自己定义的javaBean一样,需要通过new实例化的,只不过jdk给我们做了特殊的处理,直接使用类似于基本数据类型的方式初始化就可以使用。

1.String的初始化

其实字符串的初始化从源码来看是将获取到的字符串值转换成了一个字符数组存储在内存中的。

    /** The value is used for character storage. */
    private final char value[];
    /**
     * Initializes a newly created {@code String} object so that it represents
     * an empty character sequence.  Note that use of this constructor is
     * unnecessary since Strings are immutable.
     */
    public String() {
        this.value = "".value;
    }	

这也就解释了字符串类型的变量为什么是不可变的。但是可能有人就问了,那为什么定义一个字符串变量之后还可能改变它的值呢?其实这时修改的不是字符串变量的值。众所周知,字符串初始化时是在内存中开辟出一个字符串存储在常量池,在栈中记录了它的引用指向变量名,也就是常量池的“test”字符串只是指向了变量str的。
当str变量被重新赋值使,会在内存重新开辟一个“param”然后指向str中,这时候之前的“test”失去str的指向,并没有被改变。

String str = "test";
str = "param";

2.常用方法

以下是开发过程string类常用的方法:

方法名说明备注
int length()获取当前字符串长度返回字符数组的长度
boolean isEmpty()判断字符串是否为空判断数组长度是否为0
char charAt(int index)获取指定位置字符返回指定索引的数组字符
byte[] getBytes()当前字符串转换为字节数组获取操作系统默认的编码格式字节数组
boolean equals(Object anObject)判断相等先==判断,不等再转为字符数组逐字符对比
int compareTo(String anotherString)按字典顺序比较两个字符串-
boolean startsWith(String prefix)判断字符串前缀-
boolean endsWith(String suffix)判断字符串后缀-
int hashCode()获取字符串的HashCodehash未定义(默认为0)时以31为模计算hash值
int indexOf(String str)获取指定索引位置的字符-
String substring(int beginIndex, int endIndex)获取指定开始结束索引的字符串-
String replace(char oldChar, char newChar)用newChar替换掉字符串变量中的oldChar-
String[] split(String regex)按照指定格式切割字符串成字符串数组-
String trim()字符串去掉空字符去掉字符串中“ ”字符
String toString()转换为字符串-
char[] toCharArray()转换为字符数组-
static String format(String format, Object… args)按照指定格式格式化字符串静态方法,可通过String.format(…)调用
static String valueOf(Object obj)获取字符串类型值静态方法,object为null时返回“null”字符串

其中需要特别注意的是equals方法,它会先用“==”直接判断传递过来的参数与字符串值是否相等,若相等时直接返回true;否则会判断传递来的参数是否为string类型的数据,若不是直接返回false;否则会将要对比的字符串转换为字符数组,通过while循环依次递减比对字符是否相等,遇到有任何一个不相等直接返回false,直到全部都对比向等候返回true。

    /**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        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;
    }

String实现了Serializable接口,所以String类型的变量会转换成一个字节序列,并能够以后将这个字节序列完全恢复为原来的对象,可序列化并且实现轻量级持久,通过序列化对象写入磁盘,然后在重新调用程序时恢复该对象,就能够实现持久性的效果。允许一个字符串变量在虚拟机之间传送并且支持字符串变量进行深层复制。
String 实现了CharSequence接口,也就是说String也是CharSequence类型。
这个借口只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。
除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口和Serializable接口,也就是说String、StringBuffer以及StringBulider的底层变量值存储方式都是字符数组。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C++ 标准库中的 `string` 类型是用来表示和操作字符串的类。它在 `<string>` 头文件中定义。 `string` 类使用动态数组来存储和管理字符串。它具有许多方便的成员函数,可以进行字符串的插入、删除、查找、拷贝、连接、子串提取等操作。 `string` 类的源码是由 C++ 标准委员会实现,通常是在编译器的标准库中。由于 `string` 是一个模板类,其实现需要一些复杂的底层操作,如内存管理、字符串拷贝、字符大小比较等。 源码的具体实现可能因不同编译器而异,但一般会使用指针、指针运算、动态内存分配等技术来实现字符串存储和操作。可以通过查看 C++ 标准库的实现源码来了解具体的细节。 总的来说,`string` 类是 C++ 标准库中用于处理字符串的类,其源码实现了字符串存储和操作功能,常用于编写 C++ 程序中字符串的处理和操作。 ### 回答2: C string是C语言中用于表示字符串的一种数据类型,它是以null字符('\0')结尾的字符数组。在C语言中,字符串常常是用字符数组来表示的,而C string则是对字符数组的一种封装。 在C语言中,字符串常常是以字符数组的形式存储的,例如: char str[10] = "Hello"; 这里str是一个字符数组,它可以存储10个字符,包括字符串"Hello"的5个字符和一个结尾的null字符。 而C string则是对于字符数组的一种封装,它提供了一些用于操作字符串的函数,比如字符串的复制、连接、查找等等。C string源码可以在C标准库中找到,一般是以头文件的形式提供给开发者使用。 在C标准库中,有很多与C string相关的函数,比如strcpy()函数用于复制字符串、strcat()函数用于连接字符串、strlen()函数用于获取字符串的长度等等。这些函数都是通过操作字符数组来实现的,对于开发者来说,可以直接调用这些函数来进行字符串操作,无需关心具体的实现细节。 C string源码一般会包含在C标准库的源码中,开发者可以在编译器的安装目录下找到相应的源码文件。这些源码文件一般是以.c或者.cpp文件的形式存在,其中定义了与C string相关的各种函数的实现。 总之,C string是C语言中用于表示字符串的一种数据类型,它是通过对字符数组的封装来实现的。开发者可以直接使用C string提供的函数来进行字符串操作,而无需关心具体的实现细节。 C标准库中提供了与C string相关的函数的源码,开发者可以查看这些源码来了解其具体实现。 ### 回答3: C++中的字符串string 是一个非常常用的数据类型,它属于标准库中的一部分,主要用于处理字符串。 在C++的标准库中,string 类被定义在头文件<iostream>或<string>中。通过使用 string 类,我们可以方便地进行字符串的输入、输出、连接、比较等操作。 string 类的内部实现是以动态数组的形式存储字符串的每个字符,并且在需要的时候进行动态内存分配和释放。这也使得 string 类具有了自动管理内存的特性,更加方便和安全。 C++中的 string 类提供了许多常用的成员函数,例如 size()、length()、empty()、clear()等,用于获得字符串的长度、判断字符串是否为空、清空字符串等操作。此外,还可以通过下标访问字符串中的每个字符,对字符串进行遍历和修改。 string 类支持字符串的连接、拷贝和比较等功能。可以使用“+”操作符实现字符串的连接,使用“=”,“==”等操作符进行拷贝和比较。另外,string 类还提供了一些方便的函数,如 append()、substr()等,用于对字符串进行添加和截取等操作。 总的来说,C++中的 string 类简化了字符串的处理过程,提供了丰富的成员函数和操作符,使得字符串的操作更加简单、高效和安全。所以,在C++中如果需要处理字符串string 类是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值