Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >String类中你不知道的知识

String类中你不知道的知识

作者头像
大闲人柴毛毛
发布于 2018-03-09 03:36:32
发布于 2018-03-09 03:36:32
61400
代码可运行
举报
文章被收录于专栏:大闲人柴毛毛大闲人柴毛毛
运行总次数:0
代码可运行

直接量创建对象更高效

Java中,创建一个字符串有两种方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//第一种方法
String str1 = "字符串1";
//第二种方法
String str2 = new String("字符串2");

这两种方式创建的字符串在使用上并无区别,但在内存分配方式上完全不同,而且效率大相径庭。下面详细阐述:

第一种方式:

这种方式创建的字符串对象在堆内存中只需要一块存储空间。系统只需在字符串缓冲池中创建该字符串,并将str1指向该字符串对象。

第二种方式:

首先创建String类型的对象,再在字符串缓冲池中创建“字符串2”,并将String类型对象指向“字符串2”,再将str2指向String类型对象。

因此,第一种方式只在堆内存中开辟了一个存储空间,第二种方式在堆内存中开辟了两块存储空间。因此,第一种方式更高效。

在Java中,所有基本数据类型和String类型都有这两种创建对象的方式,我们把第一种方式称为“使用直接量创建对象”。因此,在Java中,使用直接量创建对象更高效!

字符串缓冲池是什么?

它存在于堆内存中,用于存储JVM运行以来所有出现过的字符串对象。

当系统需要创建字符串时,首先判断该字符串是否存在于缓冲池中,若存在则无需创建直接引用,否则创建该字符串。因此,采用直接量方式创建的两个字符串对象是相同的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str1 = "字符串";
String str2 = "字符串";
System.out.println(str1==str2);//结果为true!str1和str2均引用字符串缓冲池中的同一个对象

字符串经典面试题

问:下面程序输出结果是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str1 = "我是个大好人6";
String str2 = "我是个"+"大好人"+6;
System.out.println(str1==str2);

输出结果为true!

等号右侧的两个值均在编译时确定下来,因此它们均引用字符串缓冲池中的同一个对象。

问:下面程序输出结果是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str1 = "我是个大好人6";
String str2 = "我是个大好人"+"我是个大好人".length();
int len = 6;
String str3 = "我是个大好人"+len;
System.out.println(str1==str2);
System.out.println(str1==str3);

结果均为false!

由于str2和str3中含有变量或调用了函数,所以str2、str3等号右侧的值在运行阶段才能阶段确定下来,因此它们无法利用字符串缓冲池中的“我是个大好人6”。

问:下面程序输出结果是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str1 = "我是个大好人6";
final int len = 6;
String str2 = "我是个大好人"+len;
System.out.println(str1==str2);

结果为true!

此时len被final修饰,len的值固定为6不会发生变化,因此在编译时可以确定str2等号右侧的值为“我是个大好人6”,因此仍然可以沿用字符串池中的“我是个大好人6”。

问:下列程序在字符串缓冲池中创建了几个常量?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str = "我是个"+"大好人"+6;

答案为1个!

该字符串中不包含变量和方法,因此在编译时即可确定,编译器看来就是一个完整的常量“我是个大好人6”

问:下列程序在字符串缓冲池中创建了几个常量?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str = "我是个";
str = str + "大好人";

答案为2个!

在执行第一行代码时,常量池中创建“我是个”,执行第二行代码时,常量池中再创建“我是个大好人”,并切断str与“我是个”的引用,指向“我是个大好人”,而常量“我是个”继续留在常量池中。

    由于缓冲池中的字符串一般不会被垃圾回收,因此通过这种拼接的方式创建的字符串将会在常量池产生很多碎片,而StringBuffer和StringBuilder就是为了这种问题而诞生的!

    如果一个字符串需要不断发生修改,则使用StringBuffer和StringBuilder比String更加高效。

    StringBuilder是线程安全的,因为在其绝大多数方法都是同步方法,但因此其效率较低;

    综上所述,若程序涉及多线程,应选用StringBuilder;若单线程,则选择StringBuffer效率更高。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年02月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解String类
String是java中的字符串。String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。String不属于8种基本数据类型,String是一个对象。本文主要具体介绍一下String。
栋先生
2018/09/29
4760
深入理解String类
《JAVA SE》认识String类
Sting类是JAVA中十分重要的一种引用数据类型,本章将深入String类内部,了解其基本用法以及常见操作,认识字符串常量池以及StringBuffer 和 StringBuilder。
VIBE
2022/12/02
2520
Java基础语法(九)——String类
  字符串是我们以后工作中非常常用到的类型. 使用起来都非常简单方便, 我们一定要使用熟练。
RAIN7
2021/08/11
6380
深入理解Java中的String
想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:
lyb-geek
2019/01/08
6610
Java学习笔记(3)—— String类详解
前言 因为没有成功地为IDEA配上反编译工具,所以自己下载了一个XJad工具,背景是白色的,所以忍着强迫症硬是把IDEA的主体也给换成白色了,感觉为了这篇文章付出了诸多啊.... 字符串简介 《
我没有三颗心脏
2018/04/26
6030
Java学习笔记(3)—— String类详解
java面试题:new String("abc")创建几个对象;String a="abc",String b=new String("abc")区别
还记得String、StringBuilder、StringBuffer区别、String底层原理、实例化、拼接、比较吗?如果忘记可以到这里重温复习String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
寻求出路的程序媛
2024/04/21
5420
java面试题:new String("abc")创建几个对象;String a="abc",String b=new String("abc")区别
从认识String类,到走进String类的世界
作为一个常用的数据类型,跟随小编一同进入String的学习吧,领略String的一些用法。
学无止尽5
2024/11/29
4130
从认识String类,到走进String类的世界
揭秘字符串的奥秘:探索String类的深层含义与源码解读
https://cloud.tencent.com/developer/article/2465647?shareByChannel=link
忆愿
2024/11/21
1660
揭秘字符串的奥秘:探索String类的深层含义与源码解读
Java String的相关性质分析
String可以说是在Java开发中必不可缺的一种类,String容易忽略的细节也很多,对String的了解程度也反映了一个Java程序员的基本功。下面就由一个面试题来引出对String的剖析。
归思君
2023/10/16
2420
Java String的相关性质分析
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
String是Java中的一个内置类,Immutable不可变,即一旦创建String对象,它的值就不能被更改。对String对象的replace、subString、toLowerCase等操作都会返回一个新String对象,故每次操作String时 性能较低、浪费内存空间
寻求出路的程序媛
2024/04/21
3510
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
Java-String那些事
Java-String那些事 String对于广大程序员来说,并不陌生,是我们在编写程序中经常使用到的对象。但是,你真的对String了解吗,使用的方式对吗? 接下来,笔者就对String来进行全面的解析,让你对String有更深入的了解! 更重要的是,面试的时候,虐虐面试官! String源码(截取) public final class String implements java.io.Serializable, Comparable<String>, CharSequence { pri
贾博岩
2018/05/11
6010
Java的String类
推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。 https://www.captainbed.cn/f1
鲜于言悠
2024/06/04
1450
Java的String类
Java String类源码阅读笔记
本文基于jdk1.8 String类可谓是我们开发中使用最多的一个类了。对于它的了解,仅仅限于API的了解是不够的,必须对它的源码进行一定的学习。
三分恶
2020/09/22
5140
Java String类源码阅读笔记
【Java】String 类详解:字符串操作的必备知识
🔥 常量池(了解):由于String 类型描述的字符串内容是常量不可改变,因此 Java 虚拟机将首次出现的字符串放入常量池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能
IsLand1314
2024/10/15
6870
【Java】String 类详解:字符串操作的必备知识
Java:String类再回顾
原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = “BBBB”; 创建了一个新的对象 “BBBB”,而原来的 “AAAA” 还存在于内存中。
鲲志说
2025/04/07
620
Java:String类再回顾
String 类和常量池
尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。
happyJared
2019/07/28
5720
Java常用类(二)String类详解
前言   在我们开发中经常会用到很多的常用的工具类,这里做一个总结。他们有很多的方法都是我们经常要用到的。所以我们一定要把它好好的掌握起来! 一、String简介 1.1、String(字符串常量)概述   在API中是这样描述:     String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。   java.lang.String:
用户1195962
2018/01/18
1.1K0
Java常用类(二)String类详解
Java知识面试题复习(四)Java常用API
形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置) 占内存大小 字符常量只占两个字节 字符串常量占若干个字节(至少一个字符结束标志)
Maynor
2021/12/07
6290
万丈高楼平地起---String类
需要注意的是,字符串里面的length是方法,要加上括号,而求数组的长度时,length是数组本身的属性,不需要加上括号
用户9996207
2023/01/13
2340
万丈高楼平地起---String类
第二十节:详细讲解String和StringBuffer和StringBuilder的使用
在 Java中的字符串属于对象,那么Java 中提供了 String 类来创建和操作字符串,即是使用对象;因为String类修饰的字符一旦被创建就不可改变,所以当对字符串进行修改的时候,需要使用到StringBuffer 和 StringBuilder 类。
达达前端
2019/07/03
4280
第二十节:详细讲解String和StringBuffer和StringBuilder的使用
相关推荐
深入理解String类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档