java String的深入了解

news2025/2/25 21:37:50

1、String 概述

(1)String 类在 java.lang 包下,所以使用的时候不需要导包。

(2)String 类代表字符串,Java程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是String 类的对象。

2、字符串的优点

(1)字符串不可变,它们的值在创建后不能被更改。不可变原因是它底层接收的char数组变量被定义成了final。

(2)虽然 String的值是不可变的,但是它们可以被共享。

(3)字符串效果上相当于字符数组( char[]),但是底层原理是字节数组( byte[])。JDK8及以前是字符数组,JDK9及以后是字节数组。

3、String 对象的特点

(1)通过 new 创建的字符串对象,每一次 new都会申请一个内存空间,虽然内容相同,但是地址值不同。看代码实现:

public class StringTest {
    public static void main(String[] args) {
        char[] chs = {'a', 'b', 'c'};
        String s1 = new String(chs);
        String s2 = new String(chs);
    }
}

上面的代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的。

(2)以 “” 方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个String 对象,并在字符串常量池中维护。

public class StringTest {
    public static void main(String[] args) {
        String s3 = "abc";
        String s4 = "abc";
    }
}

在上面的代码中,针对第一行代码,JVM 会建立一个String对象放在字符串池中,并给s3参考;第二行则让 s4 直接参考字符串池中的 String 对象,也就是说它们本质上是同一个对象。

4、String代码运行内存图

(1)代码如下

public class StringTest {
    public static void main(String[] args) {
        char[] chs = {'a', 'b', 'c'};
        String s1 = new String(chs);
        String s2 = new String(chs);
        System.out.println(s1==s2);

        String s3 = "abc";
        String s4 = "abc";
        System.out.println(s3==s4);
        System.out.println(s1==s3);
    }
}

运行结果

(2)运行内存图分析

在执行下方输出之前,它会先在堆内存中创建三个空间,这三个空间地址都不一样,所以在执行输出时,它比较的是栈内存中的地址值,输出false。

进行比较输出之前,它会在常量池中创建常量字符串“abc”,然后s3和s4都指向这个常量字符串的地址004,输出时比较的是栈内存中的地址值,输出true。

最后一个输出同理,比较的也是栈内存中的地址值,输出false。

5、字符串比较

(1)使用 ==做比较

  • 基本类型:比较的是数据值是否相同;
  • 引用类型:比较的是地址值是否相同。

(2)字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals():

  • public boolean equals(0bject anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串。

(3)代码实现

public class StringTest {
    public static void main(String[] args) {
        char[] chs = {'a', 'b', 'c'};
        String s1 = new String(chs);
        String s2 = new String(chs);

        String s3 = "abc";
        String s4 = "abc";

        //比较字符串对象地址是否相同
        System.out.println(s1==s2);
        System.out.println(s3==s4);
        System.out.println(s1==s3);
        System.out.println("----------");
        //比较字符串对象内容是否相同
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
        System.out.println(s3.equals(s4));
    }
}

运行结果

思考一下:为什么通过equals()方法就可以对内容进行比较呢?

想了解相关原因,可参照链接String 调用equals为什么可以比较内容而不是地址-CSDN博客


 

本文为学习笔记,所参考文章均已附上链接,若有疑问请私信!

创作不易,如果对你有点帮助的话麻烦点个赞支持一下!

新手小白,欢迎留言指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1528848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】用友U8Cloud base64 SQL注入漏洞

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud 存在SQL注入漏洞,未授权的攻击者可通过此漏洞获取数据库权限,从而盗取用户数据&a…

Leetcode 48. 旋转图像

心路历程: 第一次需要这种类型的题。 一开始从双指针、递归、栈队的角度去思考问题,没有发现明显的特征。 后来想到这个算是二维数组问题,应该也是双指针的一种。 总感觉有什么妙招可以一下子解决,但是没想出来就去找的网上的答案…

Android 之 GMS 认证知多少?

GMS认证 1.什么是GMS GMS全称Google Mobile Service,谷歌移动服务。 为什么要通过GMS认证 Android 系统是开源的,但是 Google 针对GMS所提供的服务却是收费的,比如Google Map,Google Play,Youtube,Gmai…

Stable Diffusion + Segment Anything试用

安装 从continue-revolution/sd-webui-segment-anything安装插件分割模型下载后放到这个位置:${sd-webui}/extension/sd-webui-segment-anything/models/sam下,可以下载3个不同大小的模型,从大到小如下:vit_h is 2.56GB, vit_l i…

嵌入式汇编语言简介

嵌入式汇编语言是一种在嵌入式系统开发中广泛使用的编程语言,它直接操作底层硬件资源,具有高效性和灵活性。本文将介绍嵌入式汇编语言的基本概念、特点以及应用场景。 以下是我整理的关于嵌入式开发的一些入门级资料,免费分享给大家&#xf…

零售饮料企业通过精准铺货与动态调整,结合指标平台的智能分析,实现对线下渠道的全面掌控

作为一名消费者,炎热的夏天我们会走进一家便利店,从冰柜中选出一瓶汽水;下午工作有点累了,我们会在公司的自动贩卖机扫码买一瓶快乐水......零售品牌从线上到线下渠道都开展了激烈的竞争,从供应链、物流到销售环节&…

转座子插入序列分析1-GENE-IS分析管道

如果你使用 GENE-IS: Saira Afzal et al。 ,2016请引用这篇研究文章。GENE-IS: time-efficient and accurate analysis of viral integration events in large-scale gene therapy data. Molecular Therapy - Nucleic Acids 2016, vol. 6:133-139. DOI:https://doi.…

规划系列的常见术语:龙格现象、控制点、型值点和插值点、规划控制的开环、闭环、前馈、反馈与重规划

参考b站大佬Ally的规划控制系列 1 龙格现象 1.1 初探龙格现象 龙格现象由德国数学家Carl Runge(卡尔龙格)于1901年发现,龙格函数定义为: f ( x ) 1 25 x 2 1 f(x)\frac{1}{25 x^{2}1} f(x)25x211​ 我们在 [ − 1 , 1 ] [-1…

MNN createRuntime(二)

系列文章目录 MNN createFromBuffer(一) MNN createRuntime(二) MNN createSession 之 Schedule(三) MNN createSession 之创建流水线后端(四) MNN Session::resize 之流水线编码&am…

后端开发要不要转鸿蒙?

看到一条很有意思的提问,互联网太卷了,熬过了2023才发现,2024更难熬!只因行业发展多年,人才过度饱和!那后端的出路在哪里? 我推荐大家学【鸿蒙应用开发】新兴行业需求大,各大厂都在…

AI大模型智能大气科学探索之:ChatGPT在大气科学领域建模、数据分析、可视化与资源评估中的高效应用及论文写作

本文深度探讨人工智能在大气科学中的应用,特别是如何结合最新AI模型与Python技术处理和分析气候数据。课程介绍包括GPT-4等先进AI工具,旨在帮助大家掌握这些工具的功能及应用范围。本文内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等…

camunda流程引擎事务管理和乐观锁

本文重点介绍camunda开源流程引擎的事务配置,以及在高并发多线程情况下,可能会发生多个线程尝试对相同流程实例数据进行更改的情况,Camunda如何通过数据库的乐观锁解决这种并发冲突的,并介绍了乐观锁和悲观锁的适用场景、性能影响…

MySQL数据库概念及安装

一、数据库的基本概率 1.1 数据 记录每个人的信息 或者记录数据 1.2 表 存放信息的集合 或者存放行和列的信息 1.3 数据库 表的集合 二、数据库管理系统(DBMS) 2.1 DBMS定义 (DBMS)是一种软件,用于创建和管理…

【Python脚本随手笔记】 --- 复制文件并修改权限

💌 所属专栏:【Python脚本随手笔记】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#…

HarmonyOS 通知意图

之前的文章 我们讲了 harmonyos 中的 基础和进度条通知 那么 今天 我们来说说 任何给通知添加意图 通知意图 简单说 就是 当我们点击某个通知 如下图 然后 就会拉起某个 应用 就例如说 我们某个微信好友发消息给我们 我们 点击系统通知 可以直接跳到你们的聊天界面 好 回到…

Vue+SpringBoot打造民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

VsCode中高效书写Vue3代码的插件

Vue-Official(原Volar) 就是原先的Volar,现已弃用。 Vue-Official 提供的功能: 语法高亮: Vue-Official 扩展可以为 Vue 单文件组件(.vue 文件)中的 HTML、CSS 和 JavaScript 部分提供语法高亮&#xff…

linux系统------------Mysql数据库

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统(DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…

Echo服务器学习__01(基础)

ASIO是一个跨平台,主要用于实现异步网络和其他一些底层I/O操作的C库 可以基于ASIO实现Echo服务端,在这之前,学习一些基础的知识和概念 ​ 1:IO多路复用 简单的来说,一个线程同时监听多个I/O事件就是I/O多路复用。任…

⭐北邮复试刷题1793. 好子数组的最大分数___(基于快排的划分思想/基于快排的划分思想的优化过程/基于贪心的双指针操作)__每日一题

Problem: 1793. 好子数组的最大分数 文章目录 思路Code: 思路 法一: 基于快排的划分思想 1.即开始为拿到数组全部 计算分数 后来对每次找到的min值的下标左右两侧进行划分 即将min去掉 从而可以构建出两个新数组; 2.对新数组继续计算分数 与前一次比较取最大 接着继续找到min值…