口试中常会碰到String对象构造的题目。例如String s= new String("a");创建了几个对象。

下面根据代码具体解释一下各种String构造情况。

代码如下:

public class TestConstructString {

public static void main(String args[])

{

String s1 = "a";

String s2 = "b";

String s3 = "ab";

String s4 = "ab";

System.out.println("s3==s4? "+ (s3==s4));

String s5 = "a"+"b";

System.out.println("s3==s5? "+ (s3==s5));

String s6 = s1+s2;

System.out.println("s3==s6? "+ (s3==s6));

String s7 = new String("ab");

System.out.println("s3==s7? "+ (s3==s7));

final String s8 = "a" ;

final String s9 = "b" ;

String s10 = s8 + s9;

System.out.println("s3==s10? "+ (s3==s10));

}

}

输出结果为:

s3==s4? true

s3==s5? true

s3==s6? false

s3==s7? false

s3==s10? true

在解释之前先对String做个简单的先容。

百度百科:java中的字符串。 String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。

特别留意:String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.

String池:String是不可改变的,为了进步效率Java引用了字符串池的概念,例如new String("abc");首先会在String池中创建一个对象“abc”由于有NEW的 存在所以会分配地址空间copyString池的内容。当出现的String对象在String池中不存在时即在String池中创建该对象。

s3与s4根据String的概念他们都指向了同一个缓冲池内的地址,所以结果为true

s3与s5由于相加的两个为常量所以编译器会把s5="a"+"b"优化为s5="ab"。所以结果也为true。

s3与s6由于是两个变量的相加所以编译器无法优化,s1+s2即等同于(new StringBuilder(String.valueOf(s1))).append(s2).toString(); 在运行时,会有新的String地址空间的分配,而不是指向缓冲池中的“ab”。所以结果false。

s3与s7,根据缓冲池的定义在new的时候实际会新分配地址空间,s7指向的是新分配的地址空间所以与缓冲池地址不同,所以为false

s3与s10,类似于s3与s5,由于是final类型编译器进行了优化所以相同。

创建字符串的方式很多,回纳起来有三类:

其一,使用new关键字创建字符串,比如String s1 = new String("abc");

其二,直接指定。比如String s2 = "abc";

其三,使用串联天生新的字符串。比如String s3 = "ab" + "c";

String对象的创建

String对象的创建也很讲究,关键是要明白其原理。

原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,假如不存在,则在池中创建一个字符串s,否则,不在池中添加。

原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。

原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但尽不会在堆栈区再往创建该String对象。

原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。

另外,String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将留意力集中到String池上。当调用 intern 方法时,假如池已经包含一个即是此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

最后,有几点题目请大家留意:String a; 与String a=null在作为类变量时候是等价的,在局部变量则不同。null表示一个空引用,String a=null意思是在栈中声明了a,但是这个a没有指向任何地址。此时我们留意到String a 在栈中声明了a,但是也没有指向任何地址,但是java的语法检查假如在局部变量中,String a;是不能直接使用的,String a=null中的这个a可以直接使用。

总之:

//情况一

String s1 = "s"; // 创建了一个对象;

//情况二

s1 = new String("s"); //创建了两个对象

//情况三

String s2 = new String("a" + s1); //创建了三个对象

java自制缓冲池_java String 缓冲池概念的举例说明相关推荐

  1. java 反射用法_Java 反射的概念与使用

    一,反射的概念 对于一个人来说,了解自己的能力.本事.特点,对于他去干事创业来说,是很重要的. 同样的,对于一门面向对象的语言来说,了解类(对象其实就是类的实现)本身也是重要的,可以在很多地方帮助程序 ...

  2. java字符串定义_java字符串基本概念

    java字符串基本概念 那随意了 • 2020 年 02 月 23 日 字符串字符串本质是一个char类型的数组 private final char value[] //底层的实现代码 不可变字符串 ...

  3. java 字符串驻留_java String 以及字符串直接量 与 字符串驻留池 ...

    结果输出 :fancydeepin这是怎么回事?不是说 String 是不可变的字符串吗?怎么这里又变了?是这样的,在这里 name 只是一个引用类型变量,并不是一个 String 对象,@1中创建了 ...

  4. java架构分层_java分层架构概念

    service是业务层,DAO (Data Access Object) 数据访问 781407-20151031081225997-1073983018.jpg 1.JAVA中Action层, Se ...

  5. java split 坑_java String split 踩坑记

    split操作是出镜率非常高的一个方法, 但是我们使用中通常会使用两个类提供的split方法, 他们在入参类型一样, 但是效果却有一些差别, 稍不注意容易踩坑. java.lang.String#sp ...

  6. java 匿名内部类 百科_java匿名内部类具体概念是什么,在什么地方用到?

    展开全部 java匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们e69da5e887aa62616964757a686964616f313333376138 ...

  7. java竖线分割_Java String类的Split以竖线作为分隔符

    版权声明:本文为博主原创文章,转载请写明出处.https://blog.csdn.net/wo541075754/article/details/50668160 问题 Java中String类的Sp ...

  8. java equals 字符串_Java String 字符串 比较 == equals

    1.==该运算符表示指向字符串的引用是否相同,如t1==t2这种情况, 是因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存一份, 所以t1和t2指向的是同一个对象,而t1==t4返回 ...

  9. java 不可变_java - String是不可变的。 究竟是什么意思?

    java - String是不可变的. 究竟是什么意思? 这个问题在这里已有答案: Java中字符串的不变性                                     24个答案 我在不 ...

最新文章

  1. Oracle生成指定表的列名,并前后添加select from
  2. Latex 数学公式使用入门
  3. 发布任务PHP源码,Thinkphp5新威客任务平台源码
  4. 16薪,六险一金,深尚科技招聘视觉/图像算法工程师 ,包含社招和校招
  5. ADO.NET三个基本对象(一)
  6. JS 实现海康威视摄像头笔记
  7. android微信回调数据,Android 支付回调-1
  8. android webview加载图片不显示,解决android webview中图片不显示问题
  9. java 计算同比增长率
  10. Dell EMC Isilon命令行方式添加一个接口到pool
  11. Nvidia Graphics Card Drive Download 英伟达显卡驱动花屏问题解决处理方式
  12. 计算机模拟计算 电脑配置,Material Studio材料模拟计算的工作站配置方案
  13. 分享第三方支付申请流程政策
  14. 百变北京门头沟大觉寺养生温泉2日自驾游(可延住)
  15. 嵌入式入门学习笔记1
  16. 安卓+ios系统--手机端页面自适应手机屏幕大小,禁止手动放大和缩小VUE
  17. 论文最后一页是空白页的有效删除方法
  18. ATP 系列无线测温集中采集触摸屏
  19. 设计模式之状态机模式
  20. 毕业设计-基于机器学习的短期负荷预测算法

热门文章

  1. 数据源名称和 64 位操作系统
  2. SharePoint 2010 新体验7 - Managed Metadata (托管元数据)
  3. 什么是“软件架构设计”(推荐)
  4. html egg mac os 10.7,HTML Egg
  5. Spring AOP相关术语解释及简单使用
  6. go的错误处理(异常捕获、处理):defer+recover机制处理错误、自定义异常(自定义错误)
  7. 使用ssh连接WSL
  8. 【完整代码】使用Semaphore实现限流代码示例
  9. python3操作MySQL:查询
  10. Linux管道用法示例