java数据结构_再谈String_10
目录
字符串常量池
1. 创建对象的思考
2. 字符串常量池(StringTable)
3. 再谈String对象创建
字符串常量池
1. 创建对象的思考
下面两种创建String对象的方式相同吗?
public static void main(String[] args) {String s1 = "hello";String s2 = "hello";String s3 = new String("hello");String s4 = new String("hello");System.out.println(s1 == s2); // trueSystem.out.println(s1 == s3); // falseSystem.out.println(s3 == s4); // false}
上述程序创建方式类似,但为什么打印结果s1 == s2的时候是true,s1 == s3打印的时候是false,s3 == s4打印的时候是false呢?
在Java中,对类似于1,2,3,3.14,“Hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快,更节省内存,Java为8中基本数据类型和String类都提供了常量池。
"池" 是编程中的一种常见的, 重要的提升效率的方式, 我们会在未来的学习中遇到各种 "内存池", "线程池", "数 据库连接池" .... 比如:家里给大家打生活费的方式 1. 家里经济拮据,每月定时打生活费,有时可能会晚,最差情况下可能需要向家里张口要,速度慢 2. 家里有矿,一次性打一年的生活费放到银行卡中,自己随用随取,速度非常快 方式2,就是池化技术的一种示例,钱放在卡上,随用随取,效率非常高。常见的池化技术比如:数据库连接 池、线程池等。
为了节省存储空间以及程序的与运行效率,Java中引入了:
1.Class文件常量池:每个Java源文件编译后生成.class文件中会保存当前类中的字面常量以及符号信息
2.运行时常量池:在.class文件被加载时候,.class文件中的常量池被加载到内存中称之为运行时常量池,运行时常量池每个类都有一份
3.字符常量池
其具体概念会在讲解JVM时候详细解释
2. 字符串常量池(StringTable)
字符串常量池在Java的官方文档中并未详细说明,只是有一个在JVM中的StringTable类,实际上,是一个固定大小是HashTable(一种高效用来进行查找的数据结构),不同JDK版本下字符串常量池的位置以及默认大小是不同的:
3. 再谈String对象创建
如下图例子
打印结果为true
JVM中的大致过程如下:
在JVM中存在栈和堆
当执行代码String s1 = "hello"的时候,堆中有一个StringTable类,其中是一个HashTable,在HashTable中存储的是一些链表的地址
当我们String s1 = "hello"的时候,常量池中会有一个空间来指向一个链表,这个链表会再指向一个String对象,这个String对象的value会指向一个字符数组,从而存储起来hello
同时,栈中开辟一块空间存放0x11
这就是一次将常量放入常量池的过程。
存储字符串常量的时候,会先检查当前的常量池中 是否存在所要存储的常量,如果有的话,就不会再放入常量池中!
我们刚刚定义了String s2 = "hello",则先会再常量池中,寻找一下,是否有“hello”的常量,检查发现有,则直接再在栈中开辟一块空间给s2,但因为s2所要存储的常量以及在常量池中了,所以s2的地址直接指向常量池中是String对象即可
因此在打印s1 == s2的时候结果是true。
但如果是String s3 = new String("hello") 如下图,new出一个String对象
打印s3 == s4的结果是false
过程如下:
最开始创建s3的过程和s1是相同的,此处直接以s1的图为例:
但是,执行代码String s4 = new Sting("hello")的时候,因为只要是new出来的对象,就都是唯一的,所以会有如下过程:
即只要有new一个对象的发生,就一定会在堆中创建一个对象,则s4指向的地址为0x999的对象的地址,虽然也可以找到地址为0x88的hello,但s3和s4所存的地址就不一样了,所以在打印的时候,会出现s3 == s4的结果为false。
通过上面的例子可以看出:使用常量串创建String类型对象的效率更高,而且更节省空间。
用户也可以通过intern方法,将创建的字符串对象添加进字符串常量池中。
举例:有如下代码:
通过上面的讲解,可以知道 s1 == s2打印的结果一定是false
过程如下:
char[] ch = new char[]{'a', 'b', 'c'};之后,会在堆里有一个字符数组0x87,然后ch中存储地址0x87
然后String s1 = new String(ch); 和上面一样,new出了新是对象String
执行String s2 = "abc"的时候,过程如下,将 a b c放入常量池中
但此时s1 和 s2指向的地址并不相同,索引打印结果自然是false
但如果在String s1 = new String(ch)的代码之后,添加一行代码:s1.intern(),就可以实现将s1对象的引用放入到常量池
代码如下:
如果有了这行代码,过程就会是如下:
这样s1 和 s2指向的位置就是相同的了,s1 == s2打印的结果就是true
补充intern方法:
1.会先检查调用该方法所指的对象是否在常量池中存在
2.如果有则不入池
3.如果没有则入池
完
相关文章:
java数据结构_再谈String_10
目录 字符串常量池 1. 创建对象的思考 2. 字符串常量池(StringTable) 3. 再谈String对象创建 字符串常量池 1. 创建对象的思考 下面两种创建String对象的方式相同吗? public static void main(String[] args) {String s1 "hello&…...
MCP:重塑AI与数据交互的新标准
MCP:重塑AI与数据交互的新标准 前言 在人工智能领域,大型语言模型(LLM)的应用日益广泛,但其与外部数据源和工具的集成却一直面临复杂性和碎片化的挑战。 Anthropic提出的MCP(Model Context Protocol&…...
Cursor+Claude3.7实现从原型到app开发
最近在X上看到了一些人在用Claude 3.7 Sonnet生成 app原型图的尝试,受到启发,发现这么先生成不同界面的原型图再让Cursor基于原型图开发app会是很好的尝试。尤其是,你也可以不两步直接生成,而是在过程中更可视化地思考你要生产的原…...
洛谷P1334
题目如下 思路: 每次选择最短的两块木板进行合并,直到只剩下一块木板。使用最小堆(优先队列)来实现这一过程。使用最小堆: 将所有木板的长度放入最小堆(优先队列) 每次从堆中取出两块最短的木…...
使用wifi连接手机adb进行调试|不使用数据线adb调试手机|找应用错误日志和操作日志
手机在开发者选项里要开启无线调试 在手机设置中查看WiFi的IP地址 设置 -> WLAN -> 已连接的WiFi -> IP地址 使用手机的IP地址连接 adb connect 192.168.1.12:xxxxx 检查连接状态 adb devices 断开特定设备 adb disconnect 192.168.x.x:xxxxx 断开所有设备 …...
大语言模型中温度参数(Temperature)的核心原理
大语言模型中温度参数(Temperature)的核心原理是通过调整模型输出的概率分布,控制生成结果的随机性和多样性。以下是其原理的详细说明: 一、定义与核心作用 温度参数是生成式模型(如GPT系列)中的一个超参数…...
【AIGC】通义万相 2.1 与蓝耘智算:共绘 AIGC 未来绚丽蓝图
一、引言 在人工智能技术迅猛发展的今天,AIGC(生成式人工智能内容生成)领域正以惊人的速度改变着我们的生活和工作方式。从艺术创作到影视制作,从广告设计到智能客服,AIGC 技术的应用越来越广泛。通义万相 2.1 作为一…...
在Ubuntu上搭建Samba服务,实现与windows之间的文件共享
1.安装samba 首先切换为root账户,就是带#符号的表示当前登录的是root超级用户; su - 如果忘记密码,就输入以下命令修改密码 sudo passwd root 再切换为超级用户 然后进行更新软件列表 sudo apt update sudo apt install samba安装 whe…...
Labview培训案例3: 输出正弦波并采集显示
本案例介绍如何从板卡(USB6008)的模拟量输出端口输出一个正弦波,然后模拟量输入模块进行采样,然后显示到vi画面的‘波形图’中。 详细代码在:Labview课程3:正弦波输出&采集数据&显示资源-CSDN文库 …...
使用 Deepseek + kimi 快速生成PPT
前言 最近看到好多文章和视频都在说,使用 Deepseek 和 kimi 能快速生成精美的 ppt,毕竟那都是别人说的,只有自己尝试一次才知道结果。 具体操作 第一步:访问 deepseek 我们访问 deepseek ,把我们想要输入的内容告诉…...
图解MOE大模型的7个核心问题并探讨DeepSeekMoE的专家机制创新
原文地址:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts #mermaid-svg-FU7YUSIfuXO6EVHa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FU7YUSIfuXO6EVHa .error-icon{fill…...
青训营:简易分布式爬虫
一、项目介绍 该项目是一个简易分布式爬虫系统,以分布式思想为基础,通过多节点协作的方式,将大规模的网页抓取任务分解,从而高效、快速地获取网络数据 。 项目地址:https://github.com/yanchengsi/distributed_crawle…...
Scala(Array,List,Set,Map,Tuple,字符串 使用的简单介绍)
目录 Array 不可变数组 ArrayBuffer可变数组 List 不可变列表 ListBuffer 可变列表 Set 集合(可变不可变) Map映射(可变不可变)(键值对) Tuple 元组 字符串 Array 不可变数组 // Array 数组// scala 中的数组下标是()// scala 中的数组是值…...
fmql之Linux WDT
正点原子第52章。 基础知识 正点原子教程 fmql-dts 代码 APP代码(不需要编写驱动代码) static int dw_wdt_drv_probe(struct platform_device *pdev) {struct device *dev &pdev->dev;struct watchdog_device *wdd;struct dw_wdt *dw_wdt; …...
IntelliJ IDEA集成MarsCode AI
IntelliJ IDEA集成MarsCode AI IDEA中安装插件 安装完毕之后登录自己的账号 点击链接,注册账号 https://www.marscode.cn/events/s/i5DRGqqo/ 可以选择不同的模型...
python-leetcode-打家劫舍 III
337. 打家劫舍 III - 力扣(LeetCode) 这个问题可以通过动态规划解决。可以通过递归的方式来解决每个房子的最大偷窃金额,递归过程中,我们会记录每个房子是否偷或不偷时能够获得的最大金额。 思路: 对于每个房子,我们有两种选择: 偷这个房子,那么它的直接相邻(父亲和孩…...
数据结构——队列
1. 概念与结构 队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构,即最先被插入队列的数据会最先被删除。队列广泛应用于计算机科学中,特别是在任务调度、缓冲区管理、网络数据传输等领域。…...
GaussianCity:实时生成城市级数字孪生基底的技术突破
在空间智能领域,如何高效、大规模地生成高质量的3D城市模型一直是一个重大挑战。传统方法如NeRF和3D高斯溅射技术(3D-GS)在效率和规模上存在显著瓶颈。GaussianCity通过创新性的技术方案,成功突破了这些限制,为城市级数字孪生的构建提供了全新路径。 一、核心创新:突破传…...
【AGI】智谱开源2025:一场AI技术民主化的革命正在到来
智谱开源2025:一场AI技术民主化的革命正在到来 引言:开源,一场技术平权的革命一、CogView4:中文AI生成的里程碑1. 破解汉字生成的“AI魔咒”2. 开源协议与生态赋能 二、AutoGLM:人机交互的范式跃迁1. 自然语言驱动的跨…...
【算法学习之路】5.贪心算法
贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳!3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新…...
C++11中的右值引用和完美转发
C11中的右值引用和完美转发 右值引用 右值引用是 C11 引入的一种新的引用类型,用 && 表示。它主要用于区分左值和右值,并且可以实现移动语义,避免不必要的深拷贝,提高程序的性能。左值通常是可以取地址的表达式…...
Leetcode 1477. 找两个和为目标值且不重叠的子数组 前缀和+DP
原题链接: Leetcode 1477. 找两个和为目标值且不重叠的子数组 class Solution { public:int minSumOfLengths(vector<int>& arr, int target) {int narr.size();int sum0;int maxnINT_MAX;vector<int> dp(n,maxn);//dp[i]表示以索引i之前的满足要求…...
koa-session设置Cookie后获取不到
在谷歌浏览器中请求获取不到cookie问题之一(谷歌安全策略) 场景 前端使用 axios 请求,项目地址:http://192.168.8.1:5173 import axios from axiosconst request axios.create({baseURL: http://127.0.0.1:3001/,timeout: 60000,…...
Linux三种网络方式
前言 发现运维啥都得会,这周就遇到了网络问题自己无法解决,因此痛定思痛学一下。 参考文献 你管这破玩意叫网络? 桥接模式、NAT模式、仅主机模式,原来是这样工作的 交换机 构成局域网,实现所有设备之间的通信。 …...
android_viewtracker 原理
一、说明 我们业务中大部分场景是用 RecyclerView 实现的列表,而 View 的曝光通常是直接写在 adapter 的 onBindViewHolder 中,这样就会导致 item 还没显示出来的时候就会触发曝光。最近业务提出需要实现根据 View 显示在屏幕上面积大于 80% 才算曝光。…...
Object.defineProperty()
**Object.defineProperty()** 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。 plain const object1 {}; Object.defineProperty(object1, ‘property1’, { value: 42, writable: false }); object1.property1 77…...
大模型+知识图谱:重塑企业制度标准管理
在数字化转型的浪潮中,制度标准管理领域正迎来一场革命性的变革。借助大模型和知识图谱等前沿人工智能技术,制度标准管理不再仅仅是简单的文档存储和检索,而是演变为一个智能化、高效化、精准化的管理体系。 1.关键技术 我们的制度标准管理…...
ubuntu20系统下conda虚拟环境下安装文件存储位置
在 Conda 虚拟环境中执行 pip install 安装软件后,安装的文件会存储在该虚拟环境专属的 site-packages 目录中。具体路径取决于你激活的 Conda 环境路径。以下是定位步骤: 1. 确认 Conda 虚拟环境的安装路径 查看所有环境: conda info --env…...
深度学习编译器(整理某survey)
一、深度学习框架 TensorFlow PyTorch MXNet ONNX:定义了一个统一的表示,DL models的格式方便不同框架之间的转换模型 二、深度学习硬件 通用硬件(CPU、GPU):通过硬件和软件优化支持深度学习工作负载 GPU:通过多核架构实现高…...
Python学习第八天
查看函数参数 操作之前给大家讲一个小技巧:如何查看函数的参数(因为python的底层源码是C语言并且不是开放的,也一直困扰着刚学习的我,这个参数叫什么名之类的看doc又总是需要翻译挺麻烦的)。 比如我们下面要说到的op…...
SpringBoot为什么默认使用CGLIB?
大家好,我是锋哥。今天分享关于【SpringBoot为什么默认使用CGLIB?】面试题。希望对大家有帮助; SpringBoot为什么默认使用CGLIB? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot 默认使用 CGLIB(Code Generation Li…...
【消息队列】数据库的数据管理
1. 数据库的选择 对于当前实现消息队列这样的一个中间件来说,具体要使用哪个数据库,是需要稍作考虑的,如果直接使用 MySQL 数据库也是能实现正常的功能,但是 MySQL 也是一个客户端服务器程序,也就意味着如果想在其他服…...
pytest中pytest.ini文件的使用
pytest.ini 是 pytest 测试框架的配置文件,它允许你自定义 pytest 的行为。通过在 pytest.ini 中设置各种选项,可以改变测试用例的发现规则、输出格式、插件行为等。以下详细介绍 pytest.ini 文件的使用。 1. 文件位置 pytest.ini 文件通常位于项目的根目录下,pytest 在运…...
docker学习笔记(1)从安装docker到使用Portainer部署容器
docker学习笔记第一课 先交代背景 docker宿主机系统:阿里云ubuntu22.04 开发机系统:win11 docker镜像仓库:阿里云,此阿里云与宿主机系统没有关系,是阿里云提供的一个免费的docker仓库 代码托管平台:github&…...
Vue.js侦听器
侦听器 基本示例 计算属性允许我们声明性地计算衍生值。然而在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改 DOM,或是根据异步操作的结果去修改另一处的状态。 在组合式 API 中,我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数: …...
【C++学习篇】智能指针
目录 1. 智能指针的使用场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循环引用问题 4.2 weak_ptr 1. 智能指针的使用场景分析 下⾯程序中我们可以看到,new了以后,我们也delete了,…...
数字电子技术基础(二十四)——TTL门电路的高、低电平的输出特性曲线
目录 1 TTL门电路的特性曲线 1.1 高电平输出特性 1.1.2 高电平输出特性的实验过程 1.1.2 TTL门电路的输出特性的实验结果 1.2 低电平的输出特性 1 TTL门电路的特性曲线 1.1 高电平输出特性 1.1.2 高电平输出特性的实验过程 现在想要测试TTL门电路的输出特性,…...
linux进程通信之共享内存
在 Linux 系统中,共享内存(Shared Memory) 是一种高效的进程间通信(IPC)方式,允许多个进程直接访问同一块物理内存区域。以下是关于 Linux 共享内存的详细讲解: 一、共享内存的核心特点 高速通信…...
学习第十一天-树
一、树的基础概念 1. 定义 树是一种非线性数据结构,由 n 个有限节点组成层次关系集合。特点: 有且仅有一个根节点其余节点分为若干互不相交的子树节点间通过父子关系连接 2. 关键术语 术语定义节点包含数据和子节点引用的单元根节点树的起始节点&#…...
场景题:10亿QQ用户,如何统计在线人数?
现在卷的环境下,面试除了八股文算法项目外,场景题也是问的越来越多了。一方面是就业市场竞争者较多所带来的必然结果;另一方面是公司对于应聘者的技术要求也越来越高了。 今天继续介绍Java面试常见的场景题:在线人数统计 现在用户…...
学习工具的一天之(burp)
第一呢一定是先下载 【Java环境】:Java Downloads | Oracle 下来是burp的下载 Download Burp Suite Community Edition - PortSwigger 【下载方法二】关注的一个博主 【BurpSuite 安装激活使用详细上手教程 web安全测试工具】https://www.bilibili.com/video/BV…...
归并排序:分治哲学的完美演绎与时空平衡的艺术
引言:跨越世纪的算法明珠 在计算机科学的璀璨星河中,归并排序犹如一颗恒久闪耀的明星。1945年,现代计算机之父冯诺伊曼在EDVAC计算机的研发过程中首次系统性地提出了这一算法,其精妙的分治思想不仅奠定了现代排序算法的理论基础&…...
蓝桥杯4T平台(串口打印电压值)
知识点:串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…...
Stable Diffusion Prompt编写规范详解
Stable Diffusion Prompt编写规范详解 一、语法结构规范 (一)基础模板框架 [质量强化] [主体特征] [环境氛围] [风格控制] [镜头参数]质量强化:best quality, ultra detailed, 8k resolution主体特征:(1girl:1.3), long …...
es6常见知识点
官方文档:[https://es6.ruanyifeng.com/](https://es6.ruanyifeng.com/) 一、Class 1、Class Class只是一个语法糖,其功能用es5也能实现,但是比es5更符合类的期待 定义: constructor代表构造方法,而this指向new 生成的实例 定义类方法时,可以不使用function 注…...
leetcode1 两数之和 哈希表
什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。 242. 有效的字母异位词 (opens new window)这道题目是用数组作为哈希表来解决哈希问题,349. 两个数组的交集 (o…...
Java中lombok的@Data注解【布尔类型】字段定义方式
文章目录 背景第一步、场景复现第二步、分析问题第三步、实现方案总结 背景 在Data注解的bean中添加Boolean字段时,set方法正常,get方法无法获取。 第一步、场景复现 在OrderInfo的实体中,新增布尔类型的字段:支付过【hasPaid】…...
理解数学概念——稠密性(density)
目录 1. 定义 2. 等价定义 3. 直观理解 1. 定义 在拓扑学(topology)和数学相关领域中,对于一个拓扑空间 X 的一个子集 A,若 X的每一个点要么属于A ,要么无限“接近”X的某个成员,则称这个子集 A 是稠密的(dense)或称A具有稠密性…...
【Spring AOP】_切点类的切点表达式
目录 1. 根据方法签名匹配编写切点表达式 1.1 具体语法 1.2 通配符表达规范 2. 根据注解匹配编写切点表达式 2.1 实现步骤 2.2 元注解及其常用取值含义 2.3 使用自定义注解 2.3.1 编写自定义注解MyAspect 2.3.2 编写切面类MyAspectDemo 2.3.3 编写测试类及测试方法 在…...
通过多线程获取RV1126的AAC码流
目录 一RV1126多线程获取音频编码AAC码流的流程 1.1AI模块的初始化并使能 1.2AENC模块的初始化 1.3绑定AI模块和AENC模块 1.4多线程获取每一帧AAC码流 1.5每个AAC码流添加ADTSHeader头部 1.6写入具体每一帧AAC的…...