首页 > 编程语言 >1.String源码解析

1.String源码解析

时间:2022-10-24 22:32:59浏览次数:38  
标签:相等 String value 源码 str 解析 final


1.不变性
这里说的不变性指的是类值一旦被初始化,就不能再被改变了,如果被修改,将会是新的类,如程序1-1所示。

//程序1-1
public class App {
public static void main(String[] args) {
String str = "hello steven";
System.out.println(str);
str = "hello mike";
System.out.println(str);
}
}

从代码上来看,str的值好像由"hello steven"被修改为"hello mike",但从debug的日志来看,其实是str的内存地址被修改了。也就说str="hello mike"这个看似简单的赋值,其实已经把str的引用指向了新的String,debug的截图如下所示,str的内存地址已经由507被修改为509。

1.String源码解析_string类


1.String源码解析_内存地址_02


源码

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
//该值用于字符存储
private final char value[];
}

源码解析

  1. String被final关键字修饰,说明String类不可能被继承,也就是说String的任何方法,都不会被继承或覆写;
  2. String中保存数据的是一个char型数组value,value也是被final修饰的,也就是说value一旦被赋值,内存地址便无法修改。此外,value的权限修饰符是private,外部不可访问,并且String也没有开放出可以对value进行赋值的方法,所以说value一旦产生,内存地址就无法修改。

总结
在自定义类时,如果希望类是不可变的,可以参考String类的源码,充分利用final关键字的特性。

2.相等判断
源码

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
public boolean equals(Object anObject) {
//判断内存地址是否相同
if (this == anObject) {
return true;
}

//判断待比较的对象是否是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;
}
}

源码解析
判断两个String是否相等,首先判断内存地址是否相等,如果相等则两者相等。如果不相等则判断两者长度,长度不一则不相等,否则就挨个比较char数组中的字符是否相等,如果全部相等则两者相等,若有一个不等则两者不相等。


标签:相等,String,value,源码,str,解析,final
From: https://blog.51cto.com/u_15843693/5791486

相关文章

  • 2.Integer源码解析
    1.取值范围和基本数据类型源码publicfinalclassIntegerextendsNumberimplementsComparable<Integer>{//该值用于定义Integer取值的最小值@Nativepublicst......
  • 认识 Redis client-output-buffer-limit 参数与源码分析
    概述Redis的​​client-output-buffer-limit​​可以用来强制断开无法足够快从redis服务器端读取数据的客户端。保护机制规则如下:[hardlimit]大小限制,当某一客户端缓......
  • 2.2 RedisAPI之string
    1.简介字符串键值结构(keyvalue)value的值小于512m,一般建议一个key-value的大小为100k使用场景缓存计数器分布式锁2.命令设置key-value不管key是否存在都设置setkeyvalue......
  • timedatectl解析
    一,timedatectl输出解析root@sonic:/home/admin#timedatectl             Localtime:Mon2022-10-2421:01:56CST           Universalti......
  • 「ARC151E」Keep Being Substring - 题解
    题意题目链接:Link。有一个序列\(A\)。\(X,Y\)是给定的\(A\)的两个子串,每次可以在\(X\)的开头或末尾增添或删除一个数字,且需满足任意时刻\(X\)非空且为\(A\)的......
  • cstring转string(cstring转string特殊字符)
    如何把64位整型数转换为CString猜测你是不是在64位系统中需要将一个指针变换成CString指针,那么直接用强制类型转换就好CString如何转换为doubledouble=(double)stringa="......
  • WebRTC源码学习02---webrtc源码编译安装(Mac)
    参考文献https://webrtc.org.cn/mirror/ (主要参考文章)https://www.an.rustfisher.com/webrtc/intro/sync-build/(参考一下代理设置)https://blog.csdn.net/dangwei_90/ar......
  • 基于ssm高校科研管理系统-计算机毕业设计源码+LW文档
    【摘要】高校科研管理是一项重要而又繁琐的工作,有效的信息管理平台可以大大缓解科研管理压力,减少工作量。本文以石河子大学信息科学与技术学院为应用背景,开发教师教学信息......
  • 基于ssm工商学院办公用品管理信息系统设计与实现-计算机毕业设计源码+LW文档
    摘 要本高校科研管理系统设计目标是实现高校科研管理的信息化管理,提高管理效率,使得高校科研管理工作规范化、科学化、高效化。本文研究的高校科研管理系统基于SSM架构,采......
  • Vue源码解读之InitState
    前面我们讲到了_init函数的执行流程,简单回顾下:初始化生命周期-initLifecycle初始化事件-initEvents初始化渲染函数-initRender调用钩子函数-beforeCreate初始化依赖......