String 对象的两种创建方式:

String str1 = "abcd";//先检查字符串常量池中有没有"abcd",如果字符串常量池中没有,则创建一个,然后 str1 指向字符串常量池中的对象,如果有,则直接将 str1 指向"abcd"";
String str2 = new String("abcd");//堆中创建一个新的对象
String str3 = new String("abcd");//堆中创建一个新的对象
System.out.println(str1==str2);//false
System.out.println(str2==str3);//false

这两种不同的创建方法是有差别的。

  • 第一种方式是在常量池中拿对象;
  • 第二种方式是直接在堆内存空间创建一个新的对象。

记住一点:只要使用 new 方法,便需要创建新的对象。

String 类型的常量池比较特殊。它的主要使用方法有两种:

  • 直接使用双引号声明出来的 String 对象会直接存储在常量池中。
  • 如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,JDK1.7之前(不包含1.7)的处理方式是在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用,JDK1.7以及之后的处理方式是在常量池中记录此字符串的引用,并返回该引用。
          String s1 = new String("计算机");String s2 = s1.intern();String s3 = "计算机";System.out.println(s2);//计算机System.out.println(s1 == s2);//false,因为一个是堆内存中的 String 对象一个是常量池中的 String 对象,System.out.println(s3 == s2);//true,因为两个都是常量池中的 String 对象

字符串拼接:

          String str1 = "str";String str2 = "ing";String str3 = "str" + "ing";//常量池中的对象String str4 = str1 + str2; //在堆上创建的新的对象      String str5 = "string";//常量池中的对象System.out.println(str3 == str4);//falseSystem.out.println(str3 == str5);//trueSystem.out.println(str4 == str5);//false

尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。

将创建 1 或 2 个字符串。如果池中已存在字符串常量“abc”,则只会在堆空间创建一个字符串常量“abc”。如果池中没有字符串常量“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共 2 个字符串对象。

验证:

        String s1 = new String("abc");// 堆内存的地址值String s2 = "abc";System.out.println(s1 == s2);// 输出 false,因为一个是堆内存,一个是常量池的内存,故两者是不同的。System.out.println(s1.equals(s2));// 输出 true

结果:

false
true

关于Java中String的问题相关推荐

  1. java中String new和直接赋值的区别

        Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...

  2. java中String的常用方法

    java中String的常用方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len ...

  3. java中String,int,Integer,char、double类型转换

    java中String,int,Integer,char.double类型转换----https://www.cnblogs.com/kangyu222/p/5866025.html 转载于:http ...

  4. java中String对象和String变量

    2019独角兽企业重金招聘Python工程师标准>>> java中String对象和String变量 (2011-12-27 20:40:27) 转载▼ 标签: it 最近在论坛上看 ...

  5. java中字符串的创建_【转载】 Java中String类型的两种创建方式

    本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...

  6. Java中String类的方法及说明

    String : 字符串类型 一.构造函数      String(byte[ ] bytes):通过byte数组构造字符串对象.      String(char[ ] value):通过char数 ...

  7. 如何理解java中String的不可变性

    文章目录 问题 String类的声明 final关键字的作用 String的不变性 String的不变性有哪些好处 String真的是绝对不可变吗 问题 为什么大家都在说String是不可变的? St ...

  8. Java中String和byte[]间的转换浅析

    Java语言中字符串类型和字节数组类型相互之间的转换经常发生,网上的分析及代码也比较多,本文将分析总结常规的byte[]和String间的转换以及十六进制String和byte[]间相互转换的原理及实 ...

  9. Java中string拼接,StringBuilder,StringBuffer和+

    Java中string拼接,StringBuilder,StringBuffer和+,到底哪个更合适? StringBuilder线程不安全,效率较线程安全的StringBuffer高.jdk1.5之 ...

  10. Java中String、StringBuffer、StringBuilder的区别

    Java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

最新文章

  1. 推荐一位二本毕业1年,上海买房的大佬,牛逼!
  2. boot spring 打印请求参数_SpringBoot打印请求参数与响应参数
  3. linear-gradient与radial-gradient
  4. 前端 PDFObject.embed预览PDF,另类方式隐藏工具条样例
  5. LeetCode 372. 超级次方(快速幂)
  6. Java获取并Kill系统进程
  7. 使用剪切板[2]: Assign、HasFormat
  8. 机器学习常见面试题整理
  9. 百万人学AI 万人在线大会, 15+ 场直播抢先看!
  10. noip模拟赛 寻宝之后
  11. html php插入百度地图定位
  12. Tap titans乐趣
  13. freekan电影网站制作教程
  14. oracle 11g xdb.,Oracle 11g升级到11.2.0.3过程中XDB.DBMS_XMLSCHEMA相关报错
  15. 数据库update方法同时更新多条数据
  16. 云计算知识3:弹性计算云EC2的基本架构
  17. MySQL临时表的作用
  18. windows下远程连接Mysql
  19. 全面阐述蓝牙高精度AOA定位技术原理,帮你解决蓝牙定位一切隐患-新导智能
  20. mac SourceTree 配置比较工具 Beyond Compare 4

热门文章

  1. rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问
  2. 广东计算机电子学校,广东省电子职业技术学校
  3. leftjoin多表联合查询_leetcode-sql练习精讲系列文章——一、多表如何连接
  4. 利用python处理中国地面气候资料日值数据集(V3.0)
  5. SharePoint REST API - 确定REST端点URL
  6. java解析string_java读取文件内容为string字符串的方法
  7. idea+JRebel实现项目热部署
  8. Python 数据分析三剑客之 NumPy(四):字符串函数总结与对比
  9. CCIE-LAB-第五篇-SDN-SD-WAN-BGP-OMP(sdwan版的路由协议)
  10. 电影与爆米花(模拟)