Java字符串

news2024/11/18 3:34:25

一、所在位置

字符串常量池: 存放字符串的容器

那字符串常量池存在哪呢?根据JDK的版本不同,字符串常量池存放的位置不同。

jdk1.6之前字符串常量池在方法区(想法)中的永久代(具体实现)(JVM:新生代、老生代、永久代(永远不会销毁))
jdk1.7字符串常量池从方法区的永久代移除,放在了堆区
jdk1.8 jvm对方法区的实现由永久代变成了元空间(本地内存),字符串常量池存放在元空间中

二、不可变,地址不可变

字符串是不可变字符串

String a = "3";
a ="4";
System.out.println(a);//输出结果是4

虽然输出结果变了,但是并不是代表字符串是可变的;而是新建了"4"的字符串,地址从String a 指向地址333改为指向地址555

为什么字符串要不可变呢?

避免频繁的数据创建和销毁,为了实现数据共享,从而提高系统性能

String a ="3";
String b ="3";
System.out.println(a==b);//结果返回true

用"==" 比较,是对"值(字符串的地址)"进行比较,0x88=0x88,返回结果为true,引用的是统一份内容

 三、字符串等值比较

String a = "123";//字面量定义
String b = new String("123");//面向对象定义
System.out.println(a==b);//结果是false
System.out.println(a.equals(b));//结果是true  用equals比较,不用 == 比

 (a==b)地址不同,9999!=0x888,结果是false;用equals()方法进行比较

 equals()方法源码分析

//a.equals(b)
public boolean equals(Object anObject) {
        if (this == anObject) {//this=a  参数anObject=b 指向同一块空间
            return true;
        }
        if (anObject instanceof String) {//instanceof判断anObject对象是不是String,是返回true,不是返回false
            String anotherString = (String)anObject;//不是String类型,强转成String类型
            int n = value.length;//获取字符串a的长度(this可以省略)
            if (n == anotherString.value.length) {//字符串a、b的长度是否相等
                char v1[] = value;//字符串a的字符数组
                char v2[] = anotherString.value;//字符串b的字符数组
                int i = 0;
                while (n-- != 0) {//进行字符串a、b对位比较
                    if (v1[i] != v2[i])
                        return false;//只要有一位不同,返回false
                    i++;
                }
                return true;//全部相同,返回true
            }
        }
        return false;
    }

四、字符串拼接 

(1)第一种情况,变量拼接

public static void main(String[] args) {
    String a = "456";
    String b = "1235";

    String c = a+b;
    String d = "4561235";

    System.out.println(c==d);//结果为false
}

其中String c = a+b;是怎么做的???为什么结果返回false???

StringBuilder test =new StringBuilder( "asdf");
test.append(b);
test.toString();

append(b)源码分析

public StringBuilder append(String str) {
        super.append(str);//调用父类,进行append拼接添加到自己身上
        return this;
    }

toString()源码分析

 public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);//字符串的字符数组,从0-count组成新的字符串对象
    }

 (2)第二种情况,直接拼接

String a = "456"+"1235";
String b = "4561235";
System.out.println(a==b);//结果返回true

当字符串没有变量引用的时候,而是现成的字符串,直接合并

总结:使用变量拼接,会new String()对象;不使用变量拼接,直接合并

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

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

相关文章

三、MySQL 数据库安装集

一、CentOS—YUM 1. MySQL—卸载 # 1、查看存在的MySQL。 rpm -qa | grep -i mysql rpm -qa | grep mysql# 2、删除存在的MySQL。 rpm -e –-nodeps 包名# 3、查找存在的MySQL目录。 find / -name mysql# 4、删除存在的MySQL目录。 rm -rf 目录# 5、删除存在的MySQL配置文件。…

【西安、成都】山洪预警模拟与洪水危险性评价技术及2023年典型地区洪水淹没及损失分析复盘

气候变化背景下,极端天气导致的洪水事件将更加频发。快速城市化对流域下垫面的改变,及人类活动向洪泛区的扩张。二者共同使得全世界多数人类活动高度聚集区的洪水风险增加。洪水淹没危险性(各种年遇型洪水淹没)是洪水损失评估、风…

mathematica线性代数基础和希腊字母输入

在公式推导的过程中最常使用的就是线性代数: mathematica提供了线性代数的计算模块,不过需要熟悉一下语法,最好的方式就是看文档。 文档的链接 在本地的帮助搜索栏输入howto/DoLinearAlgebra,或者在网页输入链接 How to| 进行线…

老码农的运行时漫谈

写程序离不开运行时,但是有很多伙伴却并没有搞清楚运行时到底是什么。运行时的概念之所以容易被混淆,是因为运行时有两层不同的含义:run time 和 runtime,先贤们在翻译的时候可能忽略了中间的空格,导致运行时一词代表了…

selenium案例之RAM 用户登录 aliyun

文章目录 0x00 Selenium0x01 整体流程 思路1.1 打开浏览器并且访问 登录页面 url: https://signin.aliyun.com/login.htm#/main1.2 定位 "用户名" input 和 "下一步" button 点击下一步1.3 定位 "密码" input 和 "登录" button 点击登…

【C语言】自定义类型:结构体

前言 今天这篇文章,我们来学习自定义类型中的结构体类型 之前我们就初步了解过结构体类型,知道他是用来描述复杂类型的 像之前的short、int、long之类的称为C语言的内置类型 而如结构体、枚举、联合类型称为自定义类型 初识结构体 在正式学习前&…

Postgres入门:三种免费且简单的方法

大家好,开发者们!今年大约有9万人参与了Stack Overflow的调查。令人印象深刻的是,Postgres被评为第一数据库。此外,DB Engines还将PostgreSQL列为全球增长最快的数据库之一。这对我们意味着什么呢?很明显,我…

数学思维导图怎么画?别错过这几简单绘制方法

数学思维导图怎么画?数学思维导图可以帮助我们更好地组织和理解各种数学概念。不仅是学生和教师可以受益,数学思维导图也可以在研究和工作中发挥作用。这种工具可以帮助你清晰地表示各种数学概念和关系,并将它们可视化,以便更容易…

LeetCode.双指针(三)

例题一 一、题目 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xf…

思维导图怎么制作?了解一下这几种制作方法

思维导图怎么制作?思维导图是一种非常有效的组织思考和表达想法的工具。它可以帮助人们更好地理解和记忆信息,并且可以通过可视化的方式帮助人们更好地理解复杂的关系和概念。制作思维导图有多种方法,例如手绘、使用电子表格或专业的思维导图…

《软件方法》强化自测题-分析(4)

DDD领域驱动设计批评文集 通过做强化自测题加入“软件方法建模师”群 《软件方法》各章合集 按照业务建模、需求、分析、设计工作流考察,答案不直接给出,可访问自测链接或扫二维码自测,做到全对才能知道答案。 知识点见《软件方法》&…

不同企业如何选择合适的CRM系统?

市场上的CRM系统千差万别,如何选到适合的CRM系统?很多企业凭借感觉盲目选型,结果上线后发现CRM系统功能不符合需求。这就好比买衣服,不试穿就买回家,结果发现尺码不合适,还不能退换。下面说说企业如何进行C…

一起学SF框架系列7.4-spring-AOP-AOP代理创建

AOP的BeanDefinition加载后,Spring提供了自动代理机制,让容器自动根据目标bean生成AOP代理bean,本文讲述具体如何实现。 基本机制 Spring的启动过程中,在bean实例化前后、初始化前后均提供了外部介入处理机制(详见“…

三、SQLServer 数据库安装集

一、Docker 安装 Docker下安装SqlServer2019Docker 安装 SQLServer 1. 创建容器 前置准备 # 1. 创建主机映射目录 mkdir -p /root/sqlserver # 2. 修改主机映射目录权限 chown -R 10001:0 /root/sqlserver创建容器 # 1、拉取镜像。 #sudo docker pull mcr.microsoft.com/mssql/…

超越函数界限:探索JavaScript函数的无限可能

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📚 前言 📘 1. 函数的基本概念 📟 1.1 函数的定义和调用 📟 1.2 …

用加持了大模型的 Byzer-Notebook 做数据分析是什么体验

Byzer-Notebook 是专门为 SQL 而研发的一款 Web Notebook。他的第一公民是 SQL,而 Jupyter 则是是以 Python 为第一公民的。 随着 Byzer 引擎对大模型能力的支持日渐完善, Byzer-Notebook 也在不自觉中变得更加强大。我和小伙伴在聊天的过程中才发现他已…

TCP定制协议,序列化和反序列化

目录 前言 1.理解协议 2.网络版本计算器 2.1设计思路 2.2接口设计 2.3代码实现: 2.4编译测试 总结 前言 在之前的文章中,我们说TCP是面向字节流的,但是可能对于面向字节流这个概念,其实并不理解的,今天我们要介…

QT:绘图事件QPainter

绘图事件QPainter 绘图事件&#xff08;需要重写的函数&#xff09;&#xff1a;paintEvent 声明一个画家对象 QPainter painter(this) 指定绘图设备 画线&#xff0c;画圆&#xff0c;画矩形&#xff0c;画文字 可设置画笔&#xff0c;画刷#include <QPainter> ...... …

剑指 Offer 48. 最长不含重复字符的子字符串(C++实现)

剑指 Offer 48. 最长不含重复字符的子字符串https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ dp 注意&#xff1a;缩小 不含重复字符子串 时的写法 dp_1 min(i - charToIndex[s[i]], dp_0 1); int lengthOfLongestSubstring(string s…

Autosar MCAL-S32K324 CAN-FD配置及使用

文章目录 前言配置MCAL CANCAN Controller配置CAN FD波特率配置Ram block关于MailBox 代码中使用CAN FD报文发送和接收CAN FD报文接收CAN FD报文发送 总结 前言 在之前的文章中&#xff0c;介绍了标准CAN的MCAL配置&#xff0c;在此基础上&#xff0c;扩展为CAN-FD就会容易很多…