`

String类源码及其补充解析

    博客分类:
  • java
 
阅读更多
String类源码及其补充解析

String源码解析具体内容详见转载:http://www.hollischuang.com/archives/99
补充解析:
1:关于value
引用
       /**值用于字符存储,---String内部的第一个属性*/
        private final char value[ ];
        这是一个字符数组,并且是final类型,他用于存储字符串内容,从fianl这个关键字中我们可以看出,String的内容一旦被初始化了是不能被更改的。 虽然有这样的例子: String s = “a”; s = “b” 但是,这并不是对s的修改,而是重新指向了新的字符串, 从这里我们也能知道,String其实就是用char[]实现的。

        String是final修饰的,表示该类不能被继承,String内的方法不能被重写。内部维护了一个char[ ]来存储String的值。
public class IntertorTest {

    public static void main(String[] args) {
        // 1
        String str = "abc";
        // 2
        char[] data = {'a','b','c'};
        String a = new String(data);
    }
    
}
1和2其实是一样的。


2:关于hash
 
引用
      /*缓存字符串的散列码。默认为0*/
        private int hash;

问题考点:为什么hashCode值选择为31? 详解转载自:https://segmentfault.com/a/1190000010799123

首先看下String类中hashCode()的源码:
        public int hashCode() {
            int h = hash;
            if (h == 0 && value.length > 0) {
                char val[] = value;

                for (int i = 0; i < value.length; i++) {
                    h = 31 * h + val[i];
                }
                hash = h;
            }
            return h;
        }

hashcode()方法解释为数学表达式,即为:h = 31^(n-1)*val[0]+31^(n-2)*val[1]+31^(n-3)*val[2]+......+31^0*val[n-1]
例如:字符串"abcd", h = 31^(3)*a + 31^(2)*b+31^(1)*c+31^(0)*d

解题答案:
1:31是一个不大不小的质数,是作为 hashCode 乘子的优选质数之一。
注:将hash值选为质数可以降低hash冲突。
2:31可以被JVM优化,31 * i = (i << 5) - i。(优化内容:乘法可以用移位和减法代替,以获得更好的性能。)

3:String类的常量池
        JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突进行共享。
        [字符串常量池(String pool, String intern pool, String保留池)]是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,jvm会先去常量池用寻找是否存在该值,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象,若不存在于常量池,则会新创建一个对象。(针对String a = "1",a = "2")
注:不该创建对象还是重新引用,改变的都是指针的地址。
总结:
1:单独使用""引号创建的字符串都是常量,编译期就已经确定存储到String Pool中;    
2:使用new String("")创建的对象会存储到堆中,是运行期新创建的;    
3:使用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能确定,已经确定存储到String Pool中;    
4:使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在堆中;
引用
String s = new String("abc")这个语句创建了几个对象。
创建了2个对象:
第一个对象是"abc"字符串存储在常量池中,首先若常量池中没有则创建一个对象存于常量池。 
第二个对象在JAVA堆中的 String 对象,new出来的对象都存在于堆中(这是不会变的)。

问题考点:为什么String会被设计为final?
解题答案:
1:为了安全。
        String被许多的Java类(库)用来当做参数,例如网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。且在多线程情况下是线程安全的。
2:支持字符串常量池,能提:高性能和减少内存开销。





分享到:
评论

相关推荐

    c++string类源码

    本篇文章将深入解析`std::string`类的一些关键知识点,特别是根据标题描述提及的拷贝构造函数、深拷贝与浅拷贝、追加函数、赋值函数以及字符串比较和重载运算符。 1. **拷贝构造函数**: 拷贝构造函数是一种特殊的...

    功能强大的String类源码(C++)

    用C++语言实现的一个功能强大的String类,该类包含对字符串的各种灵活操作,40多个强大的API(CharAt,Length,IndexOf,Replace,Add,Insert,Remove.....), 为学习数据结构的朋友提供了很好的帮助。

    javastring类的源码

    java jdk中string类的源码 ,了解string类的书写,定义和声明

    c++string函数源码

    c++string函数源码 无修改

    String StringBuffer和StringBuilder区别之源码解析

    "String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...

    C++模拟string类作业源码.zip

    C++模拟string类作业源码.zip

    basic_string源码

    basic_string源码详解 basic_string是C++标准库中一个非常重要的类,它提供了字符串处理的功能。在本文中,我们将深入探讨basic_string的源码,了解它的实现机制和内部数据结构。 basic_string的内部数据结构 ...

    XML反序列化扩展STRING类源码

    Xml反序列化扩展string类源码 源码描述: 该源码的目的是为了说明反序列化的Xml数据对象数据驻留在应用程序内存。 详细描述了实现泛型,单一的方法能够序列化多个对象类型 欢迎感兴趣的用户下载研究

    DArray类与String类源码

    动态数组(Dynamic Array)是指动态分配的、可以根据需求动态增长占用内存的数组。为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用、...DArray类与String类(面试常考)的源码及测试代码下载。

    c++中string类的源代码

    关于string类的自定义,如果你对string不了解,可帮助你理解其功能有助于c++的学习

    java中的String类常用方法解析(一)

    本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符串。 - `String(char[] value)`:根据字符数组创建字符串。 - `String(String ...

    Educoder题目:Java面向对象 - String类答案解析.md

    Educoder题目:Java面向对象 - String类答案解析

    Java常用类源码

    5. `IOException` 和 `Exception` 类:Java异常处理机制的核心在于`Exception`类及其子类。`IOException`是所有I/O相关的异常的父类,通常在处理输入输出时抛出。理解异常的层次结构和捕获处理机制能帮助我们编写...

    C语言中stdio、stblib、string的源码

    源码分析可以揭示这些函数是如何高效地处理字符串的,例如,strcpy是如何安全地复制一个字符串而不越界,strcat是如何正确连接两个字符串,以及strcmp是如何进行字符比较来确定字符串的相对顺序。 学习这三个库的...

    vs2019 里 C++ 20规范的 string 类的源码注释

    vs2019 里 C++ 20规范的 string 类的源码注释

    c++string类函数原型借鉴.pdf

    本文主要介绍了C++中的字符串类函数原型借鉴,通过自定义的String类来实现字符串的操作。下面将对标题、描述、标签和部分内容进行详细的分析和解释。 标题:C++ String 类函数原型借鉴 C++中的字符串操作是非常...

    5.javaString类.zip

    5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5....

    设计string类

    2、为string类提供必要的成员函数,可以参考C++类库的string类提供了那些成员函数,至少应包括下标访问,子串查找、获得C风格字符串、获得字符串长度、字符串比较这几个函数 3、利用该string类完成测试程序:统计一...

    Spring源码分析.pdf

    Spring 源码分析 Spring 框架是 Java 语言中最流行的开源框架之一,它提供了一个强大且灵活的基础设施来构建企业级应用程序。在 Spring 框架中,IOC 容器扮演着核心角色,本文将深入分析 Spring 源码,了解 IOC ...

Global site tag (gtag.js) - Google Analytics