JAVA字符串常量和变量
Java平台提供了两种字符串类型:String和StringBuffer、StringBuilder用来操作字符串。其中String为字符串常量,StringBuffer、StringBuilder均为字符串变量。即:String对象创建后是不可以更改的,举个例子说明一下:
String str="abc";
str=str+"de";
System.out.println(str);
首先第一行创建一个对象,并且把"abc"赋值给str,然后在第二行,虚拟机新建一个对象str并把之前str的值和"de"加起来再赋值给新str,原来的str被删除掉了,所以说String对象创建之后是不可以更改的;而StringBuffer和StringBuilder对象是变量,对变量操作就是对对象进行直接操作,不会进行创建,删除操作。所以说有些情况下String的执行速度是比较慢的,因为操作String对象时可能会有删除、新建操作。
另外在线程安全方面,StringBuffer中很多方法都被synchronized关键字修饰,所以可以保证线程是安全的。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
一些相关的面试题:
1.
String a = "hello2";String b = "hello" + 2;System.out.println((a == b));
结果为true,“hello”+2在编译期间就已经被优化成"hello2",因此在运行期间,变量a和变量b指向的是同一个对象。
2.
String s1 = new String("abc");
创建了几个对象?
这行代码首先在栈中创建一个s1对象,然后再常量池中创建’abc’,然后在堆内存中复制一个’abc’的副本,但是有自己的地址,最后再把s1指向副本的地址。所以,这行代码创建了一个对象。如图:
3.
判断定义为String类型的s1和s2是否相等
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
根据上题,s1指向的是堆内存中的地址,s2指向的是常量池。
总结:String适合在少量字符串操作的情况下使用;StringBuilder适合单线程下在字符缓冲区进行大量操作的情况;StringBuffer适合多线程下在字符缓冲区进行大量操作的情况。
JAVA字符串常量和变量相关推荐
- JAVA字符串常量和变量相加问题
字符串变量相加:先开空间(产生地址值),在相加,还需要判断当前相加后的结果在常量是否存在 * * 字符串常来你相加:先相加,然后在常量池中是否存在该常量,如果存在,直接返回地址值::如果不存在再 ...
- 理解Java字符串常量池与intern()方法
理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...
- java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)
字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...
- 64位 java 数据类型_全面解析Java支持的数据类型及Java的常量和变量类型
基本数据类型变量就是用来储存值而保留的内存位置.这就意味着当你创建一个变量时就会在内存中占用一定的空间. 基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中.因此,通过给变量分 ...
- java 字符串 常量_Java进阶——Java中的字符串常量池
字符串常量池 JVM为了减少字符串对象的重复创建,其内部维护了一个特殊的内存,这段内存被成为字符串常量池(方法区中).实际上还有整型常量池.浮点型常量池等等.字符串常量池存放的是对象的引用,而不是对象 ...
- java字符串常量存哪里_浅谈JAVA中字符串常量的储存位置
在讲述这些之前我们需要一些预备知识: Java的内存结构我们可以通过两个方面去看待它. 从该角度看的话Java内存结构包含以下部分:该部分内容可以结合:JVM简介(更加详细深入的介绍) 1.栈区:由编 ...
- Java字符串常量池
前言 本文主要用于记录和分享一下博主在解决如题问题时,从各种途径所查询到的个人认为比较可信的相关资料,以及他人或个人得出的一些结论.如果参考资料或者所得结论存在错误,欢迎批评指正. 注意:本文中提及到 ...
- Java字符串常量池详解(StringTable)
前言:在介绍字符串常量池之前,我们先来简单了解下Java中字符串的概念以及常见的一些问题. 参考书籍: <Java核心技术> 参考网站:牛客 作者水平很有限,如果发现错误,麻烦及时告知作者 ...
- Java基础-常量,变量,成员变量,局部变量
在java中,数据是以常量和变量两种方法形式进行存储和表示的(实际上,所有程序的数据都是这两种形式). 变量 变量代表程序的状态.程序通过改变变量的值来改变整个程序的状态,或者说得更大一些,也就是实现 ...
最新文章
- win10 Linux子系统 交叉编译器注意事项
- CodeForces 362C
- ie下提示SCRIPT1028:缺少标识符、字符串或数字
- java基础 第一章上(安装 配置java、简单dos命令)
- 嵌入式数据库 SQLite 浅析
- 如何禁用、隐藏、显示Windows11上的小部件菜单
- #define offsetof(TYPE, MEMBER) ((size_t) ((TYPE *)0)-MEMBER)
- Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)
- 我如何用 21 天在 GitHub 上获取 6300 个 Star?
- ZZULIOJ 1030~1039(oj入门题)
- 软件测试预演环境,什么是软件测试用例预演 有何优点?[3]
- 路由器选华硕还是tp_ASUS/Linksys/TPLINK三套路由测试,Linksys最强,华硕最差
- VBE2019的下载、安装和使用(最新版2019.5.30)
- TLD文件自定义标签
- matlab小课堂2
- lua中 高效判断数组(table)中是否存在某个字符 值
- Winform + Devexpress 实现看板效果
- 【Jetpack篇】LiveData取代EventBus,flutter安装
- Django Admin 管理工具, 以及问题解决
- 深度学习(deep learning)--资料大全