当前位置: 首页 > news >正文

写了那么久的String字符串,你可能根本不懂它!

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看

(一)引言

String str和new String()有什么区别?这个问题之前在面试中有被问到过一次,当时面试结束后也写了自己关于这个题目的理解,不过最近在看Effect Java的时候发现书中也提到了关于String的用法,刚好就放到一起聊一下。

(二)关于String字符串

String应该是Java中最常用的一个对象,他不是八种基本数据类型的其中之一,但是我随便翻了一下项目代码,用String定义的变量超过百分之八十。

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0
}

关于String的几个基本知识点在String类的源码定义中就能看到:

1、在JDK8中,String实例的值是通过char数据存储的。(JDK9时,String实例的存储由char变成了byte数组,原因是使用byte数组可以减少一半的内存)

2、String类被final修饰,因此String不能被继承,value变量被final修饰,因此String实例不能被修改

3、String类实现了Serializable, Comparable, CharSequence接口

(三)关于字符串常量池

字符串常量池是虚拟机中的内容,但是接下来的几个问题需要用到,就简单了解下。为了让String字符串可以复用,Java虚拟机中设置了一种叫做字符串常量池的东西。

Java为了避免产生大量的String对象,设计了一个字符串常量池。工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址。因此看下面这段代码:

String s1="abc";
String s2="abc";
System.out.println(s1==s2);  //返回true

返回的结果就是true,因为指向了同一个对象。

关于字符串常量池的位置,在不同版本的JDK中有所不同:

JDK1.7之前字符串常量池属于运行时常量池的一部分,存放在方法区

JDK1.7之后字符串常量池被从方法区拿到了堆中

(四)String str和new String()有什么区别

回到开始的问题,String str和new String()有什么区别?区别在于,String str创建的字符串保存在字符串常量池中,并且可复用。new String()创建的字符串按照最标准的对象创建方式,生成在堆中,并且一个new String会在堆中创建一个对象。下面这张图应该可以把这个流程讲清楚。

s1s2返回true,s1s3返回false。

(五)new String()方法创建了几个对象

又是个好问题,这道题的答案是一个或者两个。

写一段代码:

public class test {public static void main(String[] args) {String s1=new String("ab");}
}

编译后通过javap -v test.class查看字节码:

1、在常量池中创建了ab对象,位置在#3

2、在堆中创建了ab对象

这样的情况下创建了两个对象,一个在常量池中,一个在堆中。

再写一段代码:

public class test {public static void main(String[] args) {String s1="ab";String s2=new String("ab");}
}

同样的方式查看字节码:

首先s1="ab"在常量池中创建了ab对象,存放在常量池的#2位置里,这个时候new String就只在堆中创建了一个String对象,常量池中因为已经有了,就不会再创建了。

这样的情况下,只创建了一个对象。

(六)总结

虽说怎么写代码都能实现一定的功能,但是有时候换种写法可以省下很多资源。比如将:

String str=new String("abc")

写成:

String str="abc"

虽然只是小小的改动,但是在频繁调用的方法中,就有可能避免创建了百万个String实例。

对于有一定开发经验的程序员,建议可以读一下《Effect-Java》,里面有许多写代码的更优方式。

我是鱼仔,我们下期再见!

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

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

CSS内联样式的使用,赶紧收藏备战金三银四!

近几年&#xff0c;随着技术和政策的变化&#xff0c;国内对技术人才的需求也是翻天覆地的变化。 为什么转行前端呢&#xff1f; 对于很多毕业学生来说&#xff0c;前端开发工程师行业需求大、待遇好、不限门槛、政策优,成为了很多大学生的就业发展选择。 学习路线 HTML基础…...

PCA原理使用PCA拟合平面

PCA原理&使用PCA拟合平面 背景 本文参考以下两篇平面解析的论文: 《Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Clustering》 《Fast Cylinder and Plane Extraction from Depth Cameras for Visual Odometry》 知识回顾&…...

Spring企业级程序设计 • 【第6章 深入Spring MVC开发】

全部章节 >>>> 本章目录 6.1 模型数据解析及控制器返回值 6.1.1 ModelAndView多种用法 6.1.2 Map添加模型数据和返回String类型值 6.1.3 Model添加模型数据和返回String类型值 6.1.4 返回值为String类型的重定向和转发 6.1.5 实践练习 6.2 Spring MVC表…...

CentOS安装VirtuanBox

CentOS7安装virtualbox 1.进入virtualbox官网 https://www.virtualbox.org/ 2.点击download 3.点击Linux distributions 4.向下翻至如图&#xff0c;并且进入同种框选页面 5.在/etc/yum.repos.d/目录下新建virtualbox.repo并写入如下内容 [virtualbox] nameOracle Linux / R…...

华为HarmonyOS 鸿蒙分布式系统2.0正式发布

2021年6月2日晚8点&#xff0c;华为以直播的方式正式发布了HarmonyOS 鸿蒙系统2.0。历史性时刻&#xff0c;万物互联、万物智能的鸿蒙操作系统今天正式发布&#xff01;过去十年&#xff0c;华为构筑了消费电子产品领域的核心能力&#xff1a;先进的SoC设计、强大的AI技能、先进…...

模拟实现堆栈将中缀算术表达式转换成后缀表达式

1、随机生成100个0到200的整数 用折半查找法&#xff08;二分法&#xff09;查找50是初始数据的第几个数&#xff0c; 并输出查找过程&#xff08;即和什么数进行了比较&#xff09;。 public class Random0To200 {public int random;public int num;public void display(){Sy…...

自适应平台AUTOSAR(Adaptive Platform AUTOSAR)平台设计(6)——通信管理

参考&#xff1a; https://zhuanlan.zhihu.com/p/336833453 1.概述 通信管理负责分布式实时嵌入式环境中应用程序之间的所有通信。 背后的概念是从实际机制中抽象出来&#xff0c;以查找和连接通信伙伴&#xff0c;以便应用程序软件的实现者可以专注于其应用程序的特定目的。…...

2021-06-02

JavaScript 逆向辅助模拟的理解原文地址代码原文地址 查看地方 代码 async_playwright().start() #启动 ba.chromium.launch() #创建浏览器 cb.new_page() #创建新页面 page.route(“js1.js”,lambda route: route.fulfill(path"./js2.js) #2替换1&#xff0c;1是虚拟路…...

CSS的文本样式属性值,成功入职字节跳动

开头 Web前端开发基础知识学习路线分享&#xff0c;前端开发入门学习三大基础&#xff1a;HTML、CSS、JavaScript。除此之外还要学习数据可视化、Vue、React、Angular相关框架&#xff0c;熟练运用框架提升开发效率&#xff0c;提升稳定性。 [外链图片转存失败,源站可能有防盗…...

在java.library.path中找不到允许在生产环境中实现最佳性能的基于APR的Apache Tom.....

在java.library.path中找不到允许在生产环境中实现最佳性能的基于APR的Apache Tom… 2021-6-2 19:55:17 org.apache.catalina.core.AprLifecycleListener init 信息: The APR based Apache Tomcat Native library which allows optimal performance in production environment…...

关于mysql的相关内容(2)

1 数据添加 INSERT [INTO] 表名 [(字段名1,…)] {VALUES | VALUE} ({expr | DEFAULT},…),(…),… 说明&#xff1a;主键列是自动增长&#xff0c;但是在全列插入时需要占位&#xff0c;通常使用空值(0或者null) ; 字段默认值 default 来占位&#xff0c;插入成功后以实际数据…...

MySQL安装教程

文章目录.msi安装下载.msi安装包安装配置环境变量登陆MySQLzip archive 免安装版下载zip配置文件启动MySQL数据库登陆MySQL并修改密码MySQL有两种安装方式&#xff0c;一是通过.msi来安装&#xff0c;一是zip archive免安装版。 官网链接&#xff1a;https://www.mysql.com/dow…...

动态规划-leetcode-322

0️⃣python数据结构与算法学习路线 学习内容&#xff1a; 基本算法&#xff1a;枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…数据结构&#xff1a;字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆…...

飞塔防火墙MIB-OID列表

找了很久,终于找到了官方的文档,包含了很多东西,贴个目录吧,获取资源请见最底部链接。 介绍: FortiGate是全新的下一代防火墙,在整个硬件架构和系统上面都有新的设计,在性能和功能上面都有了很大提升,具有性能高、接口丰富、功能齐全、安全路由交换一体化、性价比高等…...

中国石油大学《混凝土》第三阶段在线作业

第三阶段在线作业单选题 (共24道题) 收起1.&#xff08;2.5分&#xff09; 混凝土构件的平均裂缝间距与下列因素无关的是 A、混凝土强度等级 B、混凝土保护层厚度 C、纵向受拉钢筋直径 D、纵向钢筋配筋率我的答案&#xff1a;A 此题得分&#xff1a;2.5分2.&#xff08;…...

CSS 透明,文字不透明处理

1.opacity&#xff1a;会使其所有子元素都透明 我们通常是使用 opacity来做背景的透明化处理&#xff0c;该属性被所有浏览器支持&#xff0c;可以大胆使用&#xff0c;透明度从0.0(完全透明)到1.0(完全不透明)&#xff0c;但该方法会使其所有子元素都透明&#xff0c;此时若只…...

win10连接上OpenVpn后发现访问互联网的东西会有些不稳定

场景&#xff1a; opevpn是服务器有公网ip&#xff0c;客户端是我自己的电脑&#xff08;win10&#xff09;&#xff0c;连上去感觉一切良好&#xff0c;一段时间后发现网络使用不了 问题 问题在于一般配置之后&#xff0c;我们访问的网站或者互联网上的东西都会走vpn隧道&a…...

HTML基础知识

HTLM基础知识 语义化 每一个HTML元素都有具体的含义所有元素与展示效果无关,元素展示的效果应该由CSS决定浏览器带有默认的CSS样式,所以每个元素都有一些默认的样式选择什么元素,取决于内容的含义,而不是显示出的效果为什么需要语义化? 5.1 为了搜索引擎优化(SEO),每隔一段时…...

记录一个docker容器内网络与主机不通的问题(桥接网络不通)

https://blog.csdn.net/weixin_33102135/article/details/111946436 测试docker已经部署上的流程&#xff1a; 进入容器内部执行&#xff0c;脚本。执行成功。 外网telnet连接显示连接不到端口。 在其他机器上部署该docker服务&#xff0c;docker-compse方式&#xff0c;可…...

Tapdata 实时数据融合平台解决方案(五):落地

作者介绍&#xff1a;TJ&#xff0c;唐建法&#xff0c;Tapdata 钛铂数据 CTO&#xff0c;MongoDB中文社区主席&#xff0c;原MongoDB大中华区首席架构师&#xff0c;极客时间MongoDB视频课程讲师。 通过前面几篇文章&#xff0c;我们从企业数据整合与分享的痛点&#xff0c;以…...

shell与常用命令

虚拟控制台 一台计算机的输入输出设备就是一个物理的控制台 &#xff1b; 如果在一台计算机上用软件的方法实现了多个互不干扰独立工作的控制台界面&#xff0c;就是实现了多个虚拟控制台&#xff1b; Linux终端的工作方式是字符命令行方式&#xff0c;用户通过键盘输入命令进…...

VPS和云主机

VPS 虚拟专用服务器&#xff08;virtual private server&#xff09;&#xff1a;将一台服务器分割成多个虚拟专享服务器的优质服务。 实现VPS的技术分为容器技术和虚拟化技术。在容器或虚拟机中&#xff0c;每个VPS都可分配独立公网IP地址、独立操作系统、实现不同VPS间磁盘…...

程序员,你有危机感吗?

第一天上班&#xff0c;领导找我说&#xff0c;你的人都划入各个事业部&#xff0c;管理权也都放在各事业部&#xff0c;于是我就成了一个光杆司令&#xff0c;后续未知。小组是个技术团队&#xff0c;现有10人左右&#xff0c;承接着公司各个事业部的技术开发任务。公司业务人…...

常见排序算法之插入排序和选择排序

插入排序 1.直接插入排序 结合生活中的例子&#xff0c;插入排序令联想到捏扑克牌的过程&#xff0c;假设只有一个人捏牌&#xff0c;未经排序的所有扑克牌是没有排序的序列&#xff0c;每张扑克牌是序列中的一个数。每次从未经排序的扑克牌中取出一张牌和已经排好序列的扑克牌…...

项目计划书、规划文档模板

项目计划书、规划文档模板 最近通过项目实践经历&#xff0c;整理出的一套项目计划书&#xff08;仅供自己参考梳理思路使用&#xff09;有喜欢的文末加VX辛苦码字如有转载请标明出处谢谢&#xff01;——木研 更新的简版项目规划文档&#xff01; 原版文件请vx &#xff1a;…...

图像自编码器,在UCF101以及---数据集上已进行验证效果较好

图片自编码器(自定义数据加载器+VGG16+transposeVGG16) vGG16自编码器 原图 生成图 // An highlighted block # -*- coding: utf-8 -*- """ Created on Wed Apr...

关于mysql的相关内容(2)

1 数据添加 INSERT [INTO] 表名 [(字段名1,…)] {VALUES | VALUE} ({expr | DEFAULT},…),(…),… 说明&#xff1a;主键列是自动增长&#xff0c;但是在全列插入时需要占位&#xff0c;通常使用空值(0或者null) ; 字段默认值 default 来占位&#xff0c;插入成功后以实际数据…...

html标签之列表标签,从基础到源码统统帮你搞定

什么是HTML? HTML: ( Hypertext Markup Language )超文本标记语言&#xff0c;是一种标识性的语言。它包括一系列标签&#xff0e;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的Internet资源连接为一个逻辑整体。 特点: 简易性&#xff1a;超级文本标记语言版…...

HTML常用的五种标签,算法太TM重要了

前言 最近在准备面试&#xff0c;然后复习下之前写过的项目&#xff0c;书籍&#xff0c;笔记&#xff0c;文章。一看很多知识点都没有印象&#xff0c;最可拍的是连自己为了防止忘记写的文章竟然都感觉不是自己写的。有些开始怀疑人生了。 好了&#xff0c;废话少说&#xf…...

GAN模型的学习(9)———Monitoring

可视化操作 tf.summary.scalar(generator_loss, self.G_loss) tf.summary.scalar(discriminator_loss, self.D_loss) tf.summary.scalar(distortion_penalty, distortion_penalty) if config.use_feature_matching_loss:tf.summary.scalar(feature_matching_loss, feature_mat…...

mutations

mutations&#xff1a;mutations选项中的事件处理方法接收state对象作为参数&#xff0c;即初始数据&#xff0c;使用时只需要在store实例配置对象中定义state即可。mutations中的方法用来进行state数据操作&#xff0c;在组件中完成mutations提交就可以完成组件状态更新。 (对…...

vuex总结(四)——mutations

vuex中的mutation中保存的是操作state的一些方法。下面将对mutation进行总结。 一、mutation的基本使用 二、mutation携带参数 三、Mutation常量类型 很多时候我们mutation可以单独进行定义&#xff0c;此时可以新建一个文件&#xff0c;里面存放变量名。 四、mapMutations辅…...

vuex-mutations

前言 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件&#xff1a;每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方&#xff0c;并且它会接受 state 作为…...

postgresql常用操作指令

一.查看pg的操作命令 首先在linux命令行登录pg&#xff0c;postgres是pg的默认用户 psql -h localhost -p 5432 -U postgres查看有哪些用户 \dg查看有哪些数据库 \l查看有哪些表 \d切换数据库 \c dnname例如切换为数据库test&#xff0c;则使用命令 \c test还有很多的命…...

Vuex Mutations的正确使用

store.js中声明Mutations中的方法&#xff1a; import Vue from vue import Vuex from vuexVue.use(Vuex) Vue.config.devtools true export default new Vuex.Store({state: {count: 10},mutations: {addCount(state, num) {state.count num;},// payload载荷获取传入的额外…...

Mutations理解

Mutations理解 Mutations状态跟新 mutations: {//方法,默认就有一个参数是stateincrement(state) {state.counter},decrement(state) {state.counter--} },上边的increment和decrement就是字符串的事件类型 后边的紧跟函数就是回调函数,默认state为第一个参数 Mutations参数传…...

Vuex的作用、使用、核心概念(State、Mutations、Getters、Actions、Modules)、文件抽离

vue入门–基础命令axios案例练习 vue入门–vue常用属性、生命周期、计算属性、过滤器、组件、虚拟DOM、数组的响应式方法、页面闪烁、ES6简单语法增强 vue入门–js高阶函数(箭头函数)、v-model数据绑定、组件化、父子组件通信及访问 vue入门–插槽(具名、匿名、作用域插槽)E…...

Vuex入门(二)—— mutations详解

目录 知识不足的地方赶快点击学习呦~~~ Vuex入门(一)—— state,mapState,…mapState对象展开符详解 Vuex入门(二)—— mutations详解 Vuex入门(三)—— getters,getters,…getters对象展开符详解 Vuex入门(四)—— action和…mapActions详解 Vuex入门(五)—— 封装module全网最…...

mutations的类型常量

mutations的类型常量 在使用mutations属性的过程中&#xff0c;在index.js文件中定义好mutations属性后&#xff0c;需要在组件中调用&#xff0c;使用this.$store.commit函数来调用&#xff0c;这种方法容易在调用mutations的函数时写错函数名使用类型常量来进行mutations属性…...

Vuex快速上手,state、getter、Mutations、Actions

​ Vuex是应用程序的状态(state)管理器 。它采用集中式存储、管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 ​ 把vue应用的数据放在一个地方管理。 每一个vue的组件都可以有data项&#xff08;有自己的数据&#xff09;&#xff…...

clickhouse Mutations删除操作报错及解决方案

1. clickhouse 执行删除语句后查询数据仍旧存在&#xff0c;等待数分钟后依然存在 2. 查询 system.Mutations 表 sql select * from system.mutations whereis_done 0;发现任务在突变表中状态一直是未执行 3. 查阅 /var/log/clickhouse-server/clickhouse-server.err.log 日…...

clickhouse停止和避免mutations操作

问题描述 在使用clickhouse时&#xff0c;使用了alter查询的delete和update操作进行数据的删除和更新&#xff0c;当大量使用这类操作时&#xff0c;造成clickhouse服务无法连接&#xff0c;观察日志发现&#xff0c;出现了大量mutation的操作&#xff0c;严重占用clickhouse资…...

VueX的mutations、actions

一、更改Vuex的store中的状态的唯一方法是提交mutation。Vuex中的mutation非常类似于事件&#xff1a;每个mutation都有一个字符串的事件类型和一个回调函数&#xff0c;这个回调函数就是我们实际进行状态更改的地方&#xff0c;并且他会接受state作为第一个参数。 1、提交载荷…...

Vuex中的mutations

1、Mutation介绍 Vuex的store状态的更新唯一方式&#xff1a;提交Mutation 2、Mutation的使用 1、无参数的状态更新 mutation的定义方式&#xff1a; 通过mutation更新&#xff1a; 具体流程如下&#xff1a; 2、Mutation传递参数 在通过mutation更新数据的时候, 有可能我们希…...

Vuex的使用(十)——mutations和actions的返回值测试

参考文档&#xff1a;https://vuex.vuejs.org/zh/guide/ 在官方网站中有关于actions返回结果的例子&#xff0c;但却没有mutations返回结果的例子&#xff0c;经过笔者的验证发现&#xff1a; actions允许返回结果&#xff0c;但mutations不允许返回结果&#xff08;即使写了…...

mutations vuex 调用_vuex 怎么在actions中调用mutations中的函数?

1、流程顺序“相应视图—>修改State”拆分成两部分&#xff0c;视图触发Action&#xff0c;Action再触发Mutation。2、角色定位基于流程顺序&#xff0c;二者扮演不同的角色。Mutation&#xff1a;专注于修改State&#xff0c;理论上是修改State的唯一途径。Action&#xff…...

vuex mutations commit

Mutations 在 Scrimba 上尝试这节课 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件&#xff1a;每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方&…...

vuex基础mutations和actions

state数据的修改只能通过mutations&#xff0c;并且mutations必须是同步更新&#xff0c;目的是形成数据快照 数据快照&#xff1a;一次mutation的执行&#xff0c;**立刻**得到一种视图状态&#xff0c;因为是立刻&#xff0c;所以必须是同步。 **定义mutations** const st…...

【vuex状态管理案例mutations和actions区别】

目录 vuex 状态管理 传统组件传值的缺点 案例 加减 效果 现在我们希望它是两个计数器的数同时加加减~ 先来看一下减的 父组件 子组件 加的是一样的逻辑哦 虽然这样可以实现我们想要的效果但是&#xff0c;还是感觉很繁琐&#xff0c;传来传去的麻烦… 下面我们用vu…...

mutations vuex 调用_在Vuex使用 以及 dispatch和commit来调用mutations的区别

main.js中import Vuex from vuexVue.use(vuex);const store new Vuex.store({state: {nickName: "",cartCount: 0},mutations: {updateUserInfo(state,nickName) {state.nickName nickName;},updateCartCount(state,cartCount) {state.cartCount cartCount;}},act...