String的底层结构(使用频率较高的)(java.lang.invoke.MethodHandleImpl.MAX_ARITY)
类
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)相关推荐
- Go语言的string(底层结构+常用方法)
字符串 Go语言中的字符串是通过UTF-8编码,字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符 . 字符串底层结构是一个起始地址和长度(字节个数) 字符串 ...
- 【Java】java.lang.String
文章目录 String的创建和初始化 String的不可变性 String的底层存储 String的hashCode方法 String的创建和初始化 Java中的String是一个不可变的对象,即一旦 ...
- java.lang.String 的 + 号操作,这个谜终于要解开了!
作者:丶Pz 来源:https://www.cnblogs.com/panzi/p/11956782.html 在之前的面试经历中,对于String的考察还是挺频繁的,大致考察以下几个知识点: S ...
- 【JAVA源码分析——Java.lang】String源码分析
String 基本实现 初学java经常会误认为String是java基本类型,实际上String并非Java基本类型,String本质上是对char数组的封装. 以下是String实现相关源码 /* ...
- java.lang.String_自己写的java.lang.String可以让jvm加载到吗?
git 前言 老问题了,到网上也一搜一堆答案,比如,随便来一篇 乍一看好像没什么问题,但是在掌握自定义类加载器之后,知道如何打破双亲委派之后再回头来看这段话发现有两个问题: 1:凭什么你认为我现在是A ...
- java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型
java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型 参考文章: (1)java ...
- 【C++】深度剖析string类的底层结构及其模拟实现
文章目录 前言 1. string的结构 2. 构造.析构 2.1 无参构造 2.2 带参构造 2.3 问题发现及修改 c_str operator [] 析构 2.4 合二为一 --全缺省 3. 拷 ...
- 阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制
摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型. 随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化, ...
- map、set(底层结构)——C++
文章目录 4. 底层结构 4.1 AVL 树 4.1.1 AVL树的概念 4.1.2AVL树节点的定义 4.1.3 AVL树的插入 4.1.4 AVL树的旋转 1. 新节点插入较高左子树的左侧---左 ...
最新文章
- 基于Python的人工智能美颜系统
- adb devices检测不到夜神模拟器的解决办法
- C++vigenere cipher维吉尼亚密码算法(附完整源码)
- fedora yum mysql_Fedora14使用yum安装mysql
- [Linux学习]Linux键盘布局设置
- 全国计算机等级考试题库二级C操作题100套(第72套)
- stm32f407 6个串口dma_stm32之DMA
- Spring Cloud 全家桶 入门介绍
- kratos import 飘红问题
- 作为前端Web开发者,这12条基本命令不可不会
- 当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
- c语言提取数字的每一位,C++,如何提取数字的每一位
- python八卦阴阳_GitHub - meetingFuture/godwill: 周易八卦,占一卦,知来世,肖今生。...
- react native Android端保持APP后台运行--封装 Headless JS
- 【Javaweb】TCP原理(三次握手四次挥手)
- 神经网络中warmup为什么有效?
- 电大本科计算机应用基础网考答案,中央电大本科计算机应用基础网考试题选择题及答案...
- 搜索的剪枝——让爆搜变成“搜索”
- 2023南开大学计算机考研信息汇总
- 2022年电工(初级)考题及答案