1 String被final修饰 说明String 无法被其他类继承

2 实现Serializable接口 说明String可以序列化

3 实现Comparable接口 String可以进行对应的排序

4 实现CharSequence接口 CharSequence就是字符序列说明String是通过字符数组实现的

CharSequence它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口

属性

/**  该值用于字符存储。 */ 更说明 String本质是char类型的数组
 
private final char value[];
 
 
 
/**  缓存字符串的哈希代码 */
 
private int hash; // 默认为0
 
 
 
/** use serialVersionUID from JDK 1.0.2 for interoperability */
 
private static final long serialVersionUID = -6849794470754667710L;
 
 
 
/**
* Class String is special cased within the Serialization Stream Protocol.
*
* A String instance is written into an ObjectOutputStream according to
* <a href="{@docRoot}/../platform/serialization/spec/output.html">
* Object Serialization Specification, Section 6.2, "Stream Elements"</a>
*/
 
private static final ObjectStreamField[] serialPersistentFields =
 
    new ObjectStreamField[0];

方法

public int length() {
 
    return value.length; // 数组value[]的属性
 
}
 
public boolean isEmpty() {
 
    return value.length == 0; // 根据数组value[]的长度
 
}
 
 
public char charAt(int index) {
 
    if ((index < 0) || (index >= value.length)) {
 
        throw new StringIndexOutOfBoundsException(index);
 
    }
 
    return value[index]; //返回第index个字符,下标从0开始
 
}
 
 
 
public int codePointAt(int index) { //返回指定下标的代码点  也就是汉字或英文字符等在unicode编码中代表的数字 为十进制  可通过工具转十六进制在转回字符
 
    if ((index < 0) || (index >= value.length)) {
 
        throw new StringIndexOutOfBoundsException(index);
 
    }
 
    return Character.codePointAtImpl(value, index, value.length);
 
}
 
 
 
public boolean equals(Object anObject) { 
    
     // 二个对象不是存放在堆空间 试用如 String  a= "a"; 这样的默认放入扎空间;
    //开始先和自己进行对比
    if (this == anObject) { 
 
        return true;
 
    }
    
    //判断是否是String类的数据,其他自定义类型的如果不重写equals() 方法
    //那么就是引用Object的equals方法也就是通过 == 对比
    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;
 
}
 
 
 
按字典顺序比较两个字符串。
 
public int compareTo(String anotherString) { // 排序
 
    int len1 = value.length;
 
    int len2 = anotherString.value.length; //anotherString的字符长度
 
    int lim = Math.min(len1, len2);// 返回二个int较小的值
 
    char v1[] = value;
 
    char v2[] = anotherString.value;
 
 
 
    int k = 0;
 
    while (k < lim) {
 
        char c1 = v1[k];
 
        char c2 = v2[k];
 
        if (c1 != c2) { //
 
            return c1 - c2; //从0开始一但其中一个的unicode编码代码点不同,返回它们二个代码点的差
 
        }
 
        k++;
 
    }
 
    return len1 - len2;
 
}
 
 
 
测试此字符串是否以指定的后缀结尾。
 
public boolean endsWith(String suffix) {
 
    return startsWith(suffix, value.length - suffix.value.length); //如此相减 有力使其只对比最后几个
 
}
 
public boolean startsWith(String prefix, int toffset) {
 
    char ta[] = value;
 
    int to = toffset; // 从哪里开始对比
 
 
 
    char pa[] = prefix.value;
 
    int po = 0;
 
    int pc = prefix.value.length;
 
    // Note: toffset might be near -1>>>1.
 
    if ((toffset < 0) || (toffset > value.length - pc)) {
 
        return false;
 
    }
 
    while (--pc >= 0) {
 
        if (ta[to++] != pa[po++]) {
 
            return false;
 
        }
 
    }
 
    return true;
 
}
 
 
 
public int hashCode() {
 
    int h = hash;
 
    if (h == 0 && value.length > 0) {
 
        char val[] = value;  // value并不是*.hashCode中的* 而是java.lang.invoke包中接口属性 如java.lang.invoke.MethodHandleImpl.MAX_ARITY
 
        for (int i = 0; i < value.length; i++) {
 
            h = 31 * h + val[i]; //每个字符的代码点相互乘得到的int数字 引用的不同的类型做前缀
 
        }
 
        hash = h;
 
    }
 
    return h;
 
}
如有不正确之处欢迎指点

原文:https://blog.csdn.net/nullandmy/article/details/83271482

String的底层结构(使用频率较高的)(java.lang.invoke.MethodHandleImpl.MAX_ARITY)相关推荐

  1. Go语言的string(底层结构+常用方法)

    字符串 Go语言中的字符串是通过UTF-8编码,字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符 . 字符串底层结构是一个起始地址和长度(字节个数) 字符串 ...

  2. 【Java】java.lang.String

    文章目录 String的创建和初始化 String的不可变性 String的底层存储 String的hashCode方法 String的创建和初始化 Java中的String是一个不可变的对象,即一旦 ...

  3. java.lang.String 的 + 号操作,这个谜终于要解开了!

    作者:丶Pz   来源:https://www.cnblogs.com/panzi/p/11956782.html 在之前的面试经历中,对于String的考察还是挺频繁的,大致考察以下几个知识点: S ...

  4. 【JAVA源码分析——Java.lang】String源码分析

    String 基本实现 初学java经常会误认为String是java基本类型,实际上String并非Java基本类型,String本质上是对char数组的封装. 以下是String实现相关源码 /* ...

  5. java.lang.String_自己写的java.lang.String可以让jvm加载到吗?

    git 前言 老问题了,到网上也一搜一堆答案,比如,随便来一篇 乍一看好像没什么问题,但是在掌握自定义类加载器之后,知道如何打破双亲委派之后再回头来看这段话发现有两个问题: 1:凭什么你认为我现在是A ...

  6. java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型

    java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型 参考文章: (1)java ...

  7. 【C++】深度剖析string类的底层结构及其模拟实现

    文章目录 前言 1. string的结构 2. 构造.析构 2.1 无参构造 2.2 带参构造 2.3 问题发现及修改 c_str operator [] 析构 2.4 合二为一 --全缺省 3. 拷 ...

  8. 阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制

    摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型. 随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化, ...

  9. map、set(底层结构)——C++

    文章目录 4. 底层结构 4.1 AVL 树 4.1.1 AVL树的概念 4.1.2AVL树节点的定义 4.1.3 AVL树的插入 4.1.4 AVL树的旋转 1. 新节点插入较高左子树的左侧---左 ...

最新文章

  1. 基于Python的人工智能美颜系统
  2. adb devices检测不到夜神模拟器的解决办法
  3. C++vigenere cipher维吉尼亚密码算法(附完整源码)
  4. fedora yum mysql_Fedora14使用yum安装mysql
  5. [Linux学习]Linux键盘布局设置
  6. 全国计算机等级考试题库二级C操作题100套(第72套)
  7. stm32f407 6个串口dma_stm32之DMA
  8. Spring Cloud 全家桶 入门介绍
  9. kratos import 飘红问题
  10. 作为前端Web开发者,这12条基本命令不可不会
  11. 当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
  12. c语言提取数字的每一位,C++,如何提取数字的每一位
  13. python八卦阴阳_GitHub - meetingFuture/godwill: 周易八卦,占一卦,知来世,肖今生。...
  14. react native Android端保持APP后台运行--封装 Headless JS
  15. 【Javaweb】TCP原理(三次握手四次挥手)
  16. 神经网络中warmup为什么有效?
  17. 电大本科计算机应用基础网考答案,中央电大本科计算机应用基础网考试题选择题及答案...
  18. 搜索的剪枝——让爆搜变成“搜索”
  19. 2023南开大学计算机考研信息汇总
  20. 2022年电工(初级)考题及答案

热门文章

  1. 怎样在PPT中插入flash动画
  2. 过程/数据矩阵(U/C矩阵)
  3. 易飞ERP软件用户组及权限设定-易飞ERP免费教程 转载
  4. fiddle 配置
  5. 电路邱关源学习笔记——1.2电流和电压的参考方向
  6. 考研邱关源电路总结第一章
  7. USB Gadget iMX6UL开发板模拟U盘
  8. 【Kevin Learn QMUI】--> QMUISlider
  9. 【STM32H7的DSP教程】第50章 STM32H7的样条插补实现,波形拟合丝滑顺畅
  10. 不写一行代码优化《人员行程登记表》,实战解决行政收集信息难问题