首页 > 编程语言 >透析Java本质的36个话题03String类

透析Java本质的36个话题03String类

时间:2023-11-26 22:33:36浏览次数:37  
标签:Java 常量 对象 36 equals intern 长度 03String String

1.来龙去脉- “+” 是怎么连接字符串的?

“+” 号对String对象的连接

Oracle JDK1.7的实现: 
	当使用+ 字符串拼接,会创建一个临时的StringBuilder对象,该对象调用append连接操作。
	类似于 StringBuilder.append(s1).append(s2).toString;

"+" 的性能

  • 如果是在循环中对String对象进行连接,应该直接使用StringBuilder代替String的"+" , 这样子可以提供1性能
  • 当使用运算符“+”来连接字符串时,实际上是使用临时创建的StringBuilder对象来辅助完成的。不同的编译器在处理上也略有不同。
  • 对于编译时常量,在编译后直接计算出字符串的值,而不会在运行时创建临时的StringBuilder对象来完成字符串连接。

2.一成不变-不可修改的String对象

​ 设计为不可变最大好处就是可以实现资源共享。在多线程操作的时候,可以将其认为是不可变得,而不用担心其他线程会对其进行修改操作。
这样,访问String对象的时候,就没有必要使用线程同步操作

String类是非可变类,其对象一旦创建,就不可修改。
String类那些看似修改字符序列的方法实际上都是返回新创建的String对象,而不是修改自身对象。
·由于 String对象是不可改变的,因此其具有线程安全性,可以自由地实现共享。

3.钩深索隐-String字符最大长度的探索

        String a = "werege";
        int length = a.length();
        char[] chars = new char[Integer.MAX_VALUE>>2];
//        Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
//        char : 2Byte, 超出String默认最大长度限制了
  • String内部,使用一个字符数组(char[]) 来维护字符序列的
  • String的最大长度也就是字符数组的最大啊啊长度,理论上最大长度为int类型2147483647。
  • 由于计算机当前可用内存大小、分配诸多原因。可申请的最大值也是一个近似值1,不完全准确。 java 0Xmx1G className

Java中的对象是分配在堆上 ,堆的大小直接决定我们所能创建对象的多少。堆空间默认最大值256MB

4.追本溯源-追寻String字面常量的“极限”

  • String字面常量与String长度的区别。
  • CONSTANT Utf8info表结构。
  • 各区间字符在CONSTANT_Utf8_ info表中的存储。
  • 最大字面常量长度。
String字面常量的最大长度与String在内存中的最大长度是不一样的,后者的最大长度为int类型的最大值,即 2147483647,而前者根据字符(字符Unicode值)的不同,最大长度也不同,最大长度为65534(可手动修改class文件,令输出结果为65535)。
String字面常量的最大长度是由 CONSTANT_Utf8_info表来决定的,该长度在编译时确定,如果超过了CONSTANT_Utf8_info表 bytes数组所能表示的上限,就会产生编译错误

5.话题21旧调重弹——再论equals 方法与“-=”区别

​ 这一块太枯燥了 都是基础。。

  • equals方法比较的标准。
  • equals方法与“==”的真正区别。
  • 重写equals方法需要遵守的规则。
  • 重写hashCode方法需要遵守的规则。
  • 违背equals或 hashCode方法规则的后果。

equals重写规则

1.自反性
2.对称性
3.传递性
4.一致性
5.杜宇任何非空引用x , x.equals(null) 应该返回falsee

当进行子类继承,并且新增成员属性,重写equals方法啊, 不再具有传递性(子类与子类不能进行混合想等比较)

String intern方法

​ 当需要将莫格儿String镀锡甲肮如常量池中,就可以调用intern方法啊来完成,这个操作也称作拘留字符串。前面提到,系统会自动将String字面常量与String常量边爱澳大使的字符串值加入常量池中,这也是通过调用intern方法啊来实现的。

String a = "aaa";
String b = new String("aaa");
boolean flag = a.intern().equals(b.intern());
System.out.println(flag);
	String类维护一块特殊的区域,称为常量池。因为String对象是不可改变的,因此没有必要创建两个相同的 String对象。只需将String对象加入常量池,在需要的时候取出,这样即可实现String对象的共享。
	在程序中出现String编译时常量(String 字面常量与String常量表达式)时,会自动调用intern方法,如果常量池中含有相等的String对象,则直接返回常量池中的对象,否则将对象加入常量池中并返回该对象。
	对于运行时创建的String对象(非 String编译时常量),会分配到堆中,系统不会自动调用intern方法拘留对象,不过我们依然可以自行嗲用该对象的intern方法对该对象进行拘留

标签:Java,常量,对象,36,equals,intern,长度,03String,String
From: https://www.cnblogs.com/lartimes/p/17858102.html

相关文章

  • Java守护线程
    Java中的线程分为两类,分别为daemon线程(守护线程)和user线程(用户线程)。在JVM启动时会调用main函数,main函数所在的钱程就是一个用户线程。其实在JVM内部同时还启动了很多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别呢?区别之一是当最后一个非守护线程束时,JV......
  • java Math
    packagenet.elaina.math;publicclassTest1{publicstaticvoidmain(String[]args){//abs获取参数绝对值//System.out.println(Math.abs(88));//88//System.out.println(Math.abs(-88));//88//bug://以int类型为......
  • Java开发者的Python快速进修指南:面向对象进阶
    在上一期中,我们对Python中的对象声明进行了初步介绍。这一期,我们将深入探讨对象继承、组合以及多态这三个核心概念。不过,这里不打算赘述太多理论,因为我们都知道,Python与Java在这些方面的主要区别主要体现在语法上。例如,Python支持多重继承,这意味着一个类可以同时继承多个父类的属性......
  • Java开发者的Python快速进修指南:面向对象--高级篇
    首先,让我来介绍一下今天的主题。今天我们将讨论封装、反射以及单例模式。除此之外,我们不再深入其他内容。关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符。而对于反射来说,我认为它比Java简单得多,不需要频繁地获取方法和属性,而是有专门的方法来实现。最后,我......
  • Java基于springboot+vue开发服装商城小程序
    还可以改成其他商城哦。主要功能:用户可以浏览商品和特价商品,加入购物车,直接下单支付,在我的个人中心里可以管理自己的订单,收货地址,编辑资料等。管理员可以发布商品,上下架商品,处理订单。 演示视频:小程序https://www.bilibili.com/video/BV1rM411o7m4/?share_source=copy_web&vd_......
  • Java零基础入门-大数
    前言在日常开发中,常常会涉及到处理大数字的需求,如大整数运算、加密算法等。Java作为一门面向对象的编程语言,其内置类库中提供了BigInteger和BigDecimal类,可以方便地进行大数字的运算和处理。本文将介绍Java中BigInteger类的使用,帮助零基础的读者快速学习大数字的处理。摘要本文......
  • 通过Java和ECDSA生成X509版本的证书
    1.创新maven项目导入相关依赖<dependencies><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.70</version></depe......
  • Java 系统学习 | windows 环境安装 java
    学习语言,首先搭建环境。当前最新是Java21,本篇安装17版本。一、下载进入官网OracleDevelopers开发语言选择JavaDownloads选择JDK选择windows环境的JDK17下载exe文件即可想要其它老版本选择archive二、安装配置双击下载的exe......
  • JavaWeb实现文件的上传和下载
    文件的上传和下载,是非常常见的功能,很多系统,或者软件中经常使用文件的上传和下载.比如QQ头像/邮箱中的上传和下载功能/OA系统中审批中附件的上传.1.文件的上传步骤:有一个form标签,method=post请求form标签的encType属性的值必须为multipart/form-data值在form标签中,使......
  • Tita 升级|「360评估」原始数据导出上线
    个人分析支持导出原始作答数据Tita-OKR和新绩效一体化管理平台目前支持导出被评估人各题目初始得分数据和各题目评估角色得分数据......