1、如何进行字符串常量中的字符定位_Java String:字符串常量池,我相信会有很多朋友不很理解这部分...

0e98de9c5ba0a81f69871b77f9da4b5c.png

作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池:

  • 字符串常量池的设计意图是什么?
  • 字符串常量池在哪里?
  • 如何操作字符串常量池?

字符串常量池的设计思想

  1. 字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能
  2. JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化
  • 为字符串开辟一个字符串常量池,类似于缓存区
  • 创建字符串常量时,首先坚持字符串常量池是否存在该字符串
  • 存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中
  1. 实现的基础
  • 实现该优化的基础是因为字符串是不可变的,可以不用担心数据冲突进行共享
  • 运行时实例创建的全局字符串常量池中有一个表,总是为池中每个唯一的字符串对象维护一个引用,这就意味着它们一直引用着字符串常量池中的对象,所以,在常量池中的这些字符串不会被垃圾收集器回收

代码:从字符串常量池中获取相应的字符串

String str1 = “hello”;String str2 = “hello”;System.out.printl("str1 == str2" : str1 == str2 ) //true 

字符串常量池在哪里

在分析字符串常量池的位置时,首先了解一下堆、栈、方法区:

1de73ba0b80768cea833383b15437b4a.png

存储的是对象,每个对象都包含一个与之对应的class

JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定

每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象)

每个栈中的数据(原始类型和对象引用)都是私有的

栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)

数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会自动消失

方法区

静态区,跟堆一样,被所有的线程共享

方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量

字符串常量池则存在于方法区

代码:堆栈方法区存储字符串

String str1 = “abc”;String str2 = “abc”;String str3 = “abc”;String str4 = new String(“abc”);String str5 = new String(“abc”);
5f1c10ea4b622917f8cec14110664b7e.png

字符串对象的创建

面试题:String str4 = new String(“abc”) 创建多少个对象?

  1. 在常量池中查找是否有“abc”对象
  • 有则返回对应的引用实例
  • 没有则创建对应的实例对象
  1. 在堆中 new 一个 String("abc") 对象
  2. 将对象地址赋值给str4,创建一个引用

所以,常量池中没有“abc”字面量则创建两个对象,否则创建一个对象,以及创建一个引用

根据字面量,往往会提出这样的变式题:

String str1 = new String("A"+"B") ; 会创建多少个对象?

String str2 = new String("ABC") + "ABC" ; 会创建多少个对象?

str1:

字符串常量池:"A

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

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

相关文章

Egret中使用P2物理引擎

游戏中的对象按照物理规律移动,体现重力、引力、反作用力、加速度等物体特性,实现自由落体、摇摆运动、抛物线运动,以及物理碰撞现象的模拟。用于模拟物理碰撞、物理运动的引擎称为物理引擎。 来自瑞典斯德哥尔摩大学的Stefan Hedman基于Java…

react项目_如何从零开始创建React项目(三种方式)

在开发React项目前最关键的当然是项目的创建,现在的前端工程化使得前端项目的创建也变得越来越复杂,在这里介绍三种从零开始创建React项目的方式,分别是在浏览器中直接引入、使用官方脚手架create-react-app、使用Webpack创建。浏览器中通过标…

利用JSONP解决AJAX跨域问题的原理与jQuery解决方案

写在前面 跨域的解决方案有多种,其中最常见的是使用同一服务器下的代理来获取远端数据,再通过ajax进行读取,而在这期间经过了两次请求过程,使得获取数据的效率大大降低,这篇文章蓝飞就为大家介绍一下解决跨域问题的一种…

江西理工大学南昌校区cool code竞赛

这次比赛原本就是来打酱油的,想做个签到题就走!一开始不知道1002是签到题,一直死磕1001,WA了四发过了,回头一看Rank,三十名,我靠!看了1001的AC率,在我AC之前只有一个人AC…

mysql 枚举_详解MySQL数据类型之枚举类型ENUM的用法

本节主要内容:MySQL数据类型之枚举类型ENUMMySQL数据库提供针对字符串存储的一种特殊数据类型:枚举类型ENUM,这种数据类型可以给予我们更多提高性能、降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特…

# 异运算_小学数学运算三要点:定律、法则与顺序(解析)

很多孩子的数学不好,尤其是女孩子。家长往往认定为数学不好就是孩子不擅长,能力差。其实未必,有的孩子数学不好的原因并不在于智商,而是没有理解到数学的方法与逻辑,比如小学的运算中,很多孩子并没有了解到…

如何实现一个教师与学生教学辅助平台?

在软件工程的学习过程中,我们要完成一个团体项目,关于个人教学辅助系统,对于这个,还有太多要学。对于如何实现其中的功能,我们会利用到html,css等语言来编写网页前端,同样也会用到数据库的知识。…

证明创建runnable实例和普通类时间一样长

import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;//证明创建runnable实例和普通类时间一样长public class Test002 { private Concurre…

mysql数据库维护_维护MySQL数据库表

在本教程中,我们将向您介绍一些非常有用的语句,使您可以在MySQL中维护数据库表。MySQL提供了几个有用的语句,可以有效地维护数据库表。 这些语句使您能够分析,优化,检查和修复数据库表。分析表语句MySQL查询优化器是My…

node-glob 正则表达式

https://github.com/isaacs/node-glob转载于:https://www.cnblogs.com/chris-oil/p/6507368.html

机器学习笔记—再谈广义线性模型

前文从线性回归和 Logistic 回归引出广义线性回归的概念,很多人还是很困惑,不知道为什么突然来个广义线性回归,有什么用?只要知道连续值预测就用线性回归、离散值预测就用 Logistic 回归不就行了?还有一些概念之间的关…

python连接access数据库odbc_对Python通过pypyodbc访问Access数据库的方法详解

看书上通过ODBC访问数据库的案例,想实践一下在Python 3.6.1中实现access2003数据库的链接,但是在导入odbc模块的时候出现了问题,后来查了一些资料就尝试着使用pypyodbc,最后成功了。操作步骤:①安装pypyodbc目前Python…

mysql异机备份

xx.xx..4.43----xx.xx..4.51 1、配置client通过密钥来连接server 43机器上: /root/.ssh 目录下执行 ssh-keygen -t rsa ls /root/.ssh会发现在/root/.ssh下生成一对密钥id_dsa和id_dsa.pub,将生成的公钥id_dsa.pub拷贝到server的/root/.ssh目录下&#…

周末想找个地方敲代码_观看我们的代码游戏,全周末直播

周末想找个地方敲代码by freeCodeCamp通过freeCodeCamp 观看我们的代码游戏,全周末直播 (Watch us Code Games Live All Weekend) Note: this was originally published on our now-defunct blog on July 15, 2015.注意:该文章最初于2015年7月15日发布在…

5.7和5.6的mysql_mysql5.6和5.7的区别

展开全部MySQL 5.7 已经开发两年了。相比 MySQL 5.6,有特别多的改进。团队主要关注速度,性能据报告是比之前62616964757a686964616fe4b893e5b19e31333365643661版本提升了 2 至 3 倍。新特性列表,主要改进:提升 MySQL 安全性改进了…

01:数制转换

01:数制转换 查看提交统计提问总时间限制: 1000ms内存限制: 65536kB描述求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。不同进制的表示符号为(0,1,...&am…

局域网只能看到一部分电脑_win10 网上邻居看不到其它电脑、共享不了文件

最近电脑遇到了局域网文件共享的问题,Win 10 系统在网络和共享中心里无法看到其他电脑,只能看到本机。确认共享已经打开后,通过查找最终解决。下面是解决流程。1.进入:控制面板 – 网络和共享中心 – 更改高级共享设置&#xff0c…

javascript 开发_25个新JavaScript开发人员的免费资源

javascript 开发by freeCodeCamp通过freeCodeCamp 25个新JavaScript开发人员的免费资源 (25 Free Resources for New JavaScript Developers) We asked our campers to share their favorite free resources for new JavaScript developers on Camper News. The list includes…

mysql数据库语法_MySQL数据库语法(一)

MySQL数据库语法数据库管理系统(DBMS)的概述什么是DBMS:数据的仓库方便查询可存储的数据量大保证数据的完整、一致安全可靠DBMS的发展:今天主流数据库为关系型数据库管理系统(RDBMS 使用表格存储数据)常见DBMS:Orcale、MySQL、SQL Server、DB…

作业1---四则运算

一.需求分析: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 1/8 7/24 运算符为 , −, , 并且要求能处理用户的输入,并判断对错,打分统计正确率。 要求能处理用户输入的真分…