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字符串常量和变量相关推荐

  1. JAVA字符串常量和变量相加问题

    字符串变量相加:先开空间(产生地址值),在相加,还需要判断当前相加后的结果在常量是否存在  *   * 字符串常来你相加:先相加,然后在常量池中是否存在该常量,如果存在,直接返回地址值::如果不存在再 ...

  2. 理解Java字符串常量池与intern()方法

    理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...

  3. java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)

    字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...

  4. 64位 java 数据类型_全面解析Java支持的数据类型及Java的常量和变量类型

    基本数据类型变量就是用来储存值而保留的内存位置.这就意味着当你创建一个变量时就会在内存中占用一定的空间. 基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中.因此,通过给变量分 ...

  5. java 字符串 常量_Java进阶——Java中的字符串常量池

    字符串常量池 JVM为了减少字符串对象的重复创建,其内部维护了一个特殊的内存,这段内存被成为字符串常量池(方法区中).实际上还有整型常量池.浮点型常量池等等.字符串常量池存放的是对象的引用,而不是对象 ...

  6. java字符串常量存哪里_浅谈JAVA中字符串常量的储存位置

    在讲述这些之前我们需要一些预备知识: Java的内存结构我们可以通过两个方面去看待它. 从该角度看的话Java内存结构包含以下部分:该部分内容可以结合:JVM简介(更加详细深入的介绍) 1.栈区:由编 ...

  7. Java字符串常量池

    前言 本文主要用于记录和分享一下博主在解决如题问题时,从各种途径所查询到的个人认为比较可信的相关资料,以及他人或个人得出的一些结论.如果参考资料或者所得结论存在错误,欢迎批评指正. 注意:本文中提及到 ...

  8. Java字符串常量池详解(StringTable)

    前言:在介绍字符串常量池之前,我们先来简单了解下Java中字符串的概念以及常见的一些问题. 参考书籍: <Java核心技术> 参考网站:牛客 作者水平很有限,如果发现错误,麻烦及时告知作者 ...

  9. Java基础-常量,变量,成员变量,局部变量

    在java中,数据是以常量和变量两种方法形式进行存储和表示的(实际上,所有程序的数据都是这两种形式). 变量 变量代表程序的状态.程序通过改变变量的值来改变整个程序的状态,或者说得更大一些,也就是实现 ...

最新文章

  1. win10 Linux子系统 交叉编译器注意事项
  2. CodeForces 362C
  3. ie下提示SCRIPT1028:缺少标识符、字符串或数字
  4. java基础 第一章上(安装 配置java、简单dos命令)
  5. 嵌入式数据库 SQLite 浅析
  6. 如何禁用、隐藏、显示Windows11上的小部件菜单
  7. #define offsetof(TYPE, MEMBER) ((size_t) ((TYPE *)0)-MEMBER)
  8. Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)
  9. 我如何用 21 天在 GitHub 上获取 6300 个 Star?
  10. ZZULIOJ 1030~1039(oj入门题)
  11. 软件测试预演环境,什么是软件测试用例预演 有何优点?[3]
  12. 路由器选华硕还是tp_ASUS/Linksys/TPLINK三套路由测试,Linksys最强,华硕最差
  13. VBE2019的下载、安装和使用(最新版2019.5.30)
  14. TLD文件自定义标签
  15. matlab小课堂2
  16. lua中 高效判断数组(table)中是否存在某个字符 值
  17. Winform + Devexpress 实现看板效果
  18. 【Jetpack篇】LiveData取代EventBus,flutter安装
  19. Django Admin 管理工具, 以及问题解决
  20. 深度学习(deep learning)--资料大全

热门文章

  1. 斯坦福校长被曝学术不端,正接受校方调查!11篇论文「篡改图片」涉嫌造假
  2. USB controller介绍及controller驱动移植
  3. 关于speedtree的spt文件和stf文件
  4. E-mail营销历史
  5. java 教学反馈系统_基于SSM框架下的JAVA教师教学质量评价信息反馈系统
  6. npm install卡住
  7. 百度发布小度在家智能屏X8,一场智能音箱边界的探索
  8. conda安装torch遇坑
  9. 51单片机俄罗斯方块游戏+Proteus在线模拟仿真
  10. (转载)国产手机为何败给苹果?