首页 > 编程语言 >Java中用引号创建String对象和用构造函数的区别

Java中用引号创建String对象和用构造函数的区别

时间:2023-11-08 15:38:48浏览次数:37  
标签:abcd Java String System println new out 构造函数


创建一个String对象一般有以下两种方式:

String str1 = "abcd";  
String str2 = new String("abcd");



这两种方式有什么区别呢?我们可以通过下面两个小例子来说明.

Example 1:


String a = "abcd";  
String b = "abcd";  
System.out.println(a == b);  // True  
System.out.println(a.equals(b)); // True


这里 a == b 为 true,是因为 a 和 b 都引用了方法区的同一个字符串字面值。在java中,当同一个字符串字面值出现多次时,在内存中只会保存该字符串的一份拷贝,即 a 指向的 "abcd" 跟 b 指向的 "abcd" 在内存中是同一个对象。这种方法叫做 "字符串驻留(string interning)"。

Example 2:


String c = new String("abcd");  
String d = new String("abcd");  
System.out.println(c == d);  // False  
System.out.println(c.equals(d)); // True


我们知道,new运算符的作用是在堆内存中创建一个新的对象。因而这里两次 new 就会在堆中创建两个String对象,尽管它们的字面值是相同的,但其实是两个同不的对象,占两份空间。因此 c == d 自然会返回 false 了。图示如下:


Java中用引号创建String对象和用构造函数的区别_bc

此外,我们可以调用String的intern()方法来强制让JVM使用字符串驻留,例如下面的代码:



String c = new String("abcd").intern();  
String d = new String("abcd").intern();  
System.out.println(c == d);  // Now true  
System.out.println(c.equals(d)); // True



intern()方法调用时,首先会在字符串常量池中检查有没有 "abcd".equals(常量池中的字符串)为true的对象,如果有,则把该对象返回,如果没有,则创建一个"abcd"对象放到常量池中。因此,在创建d 的时候,intern()就会把先前创建的 "abcd" 的引用直接返回了。

标签:abcd,Java,String,System,println,new,out,构造函数
From: https://blog.51cto.com/u_809530/8255287

相关文章

  • JAVA Date 时间与时间相差计算
    JAVADate时间与时间相差计算Datedate=newDate("2014/1/1018:20");Datedate2=newDate("2014/1/113:5");longtemp=date2.getTime()-date.getTime();//相差毫秒数longhours=temp/1000/3600;//相差小时......
  • 非严格模式下JavaScript语句中“this”默认指向全局对象(window)
    请阅读以下代码varobj={};obj.log=console.log;obj.log.call(console,this);该代码在浏览器中执行,输出的日志结果是什么?obj.log.call(console,this)=console.log(this)。this这里指window,所以最后的表达式是console.log(window)这道题看似在考this的绑定问题,实际......
  • JavaScript权威基础语法教程讲解大全
    JavaScriptJS基础权威语法教程讲解大全https://developer.mozilla.org/zh-CN/docs/Web/JavaScript参考、来源:《爬虫7期:爬虫&逆向7期-第1章-爬虫&逆向7期-1.32-javascript入门_02.mp4》2:28:40......
  • Java中的传值和传引用
    三年以前读研究生的时候,就因为传值和传引用的问题给自己挖过一个坑情景是,我将matlab代码翻译到java中最后计算的结果偏差超过了限差的范围,也超过了java中数据截断误差的范围。经过最后的排查发现,在计算的过程中,一个不应该改变的值被我以引用的形式传入了方法中,方法内部对值进行......
  • 每个构造函数都有个propotype属性,每个实例化对象都有个隐式原型__propo__,对象的隐式原
    每个构造函数都有个propotype属性,每个实例化对象都有个隐式原型__propo__,对象的隐式原型指向其构造函数的显示原型所有的引用类型(数组,对象,函数),都有__proto__属性,属性值是一个普通的对象对象分为函数对象和普通对象,只有函数对象是有prototype的,object.__proto__也有prototype,但它......
  • 七、Java集合
    一、集合概述集合的特点如下:动态大小:集合可以根据需要动态调整大小,不像数组需要提前指定大小。灵活性:集合提供了各种不同类型的数据结构和容器,例如列表、集、映射、队列等,以满足不同的存储和操作需求。高效性:Java集合框架中的实现类经过优化,提供高效的插入、删除和查找......
  • JAVA遍历list是对其操作
    @Testpublicvoidremove(){ArrayList<String>list=newArrayList<>();list.add("php");list.add("java");list.add("php");list.add("php");list.add(......
  • java lambda表达式、匿名类和接口
    从匿名类重写已有类的方法开始这段代码,在AnonymousDemo内部创建了一个Polygon类的p1对象但这个Polygon类内部的方法被重写了,是一个匿名类,内部类和外部类重名,重写了内部的方法这个机制应该理解为继承,内部的Polygon继承了外部的Polygon类,重写了display方法,Polygon的其他没被重写......
  • 【Java SE】String.format格式化
    String.format1、字符串左对齐,不足10位的右侧补空格:[123      ]String.format("%-10s","123");2、字符串右对齐,不足10位的左侧补空格:[      123]String.format("%10s","123");3、整数格式化10位,不足左侧补0:[0000000123]String.format("%010d",123) ......
  • Java根据日期计算星期几的四种方法
    在我们日常业务代码中,经常要用到星期几,下面这篇文章主要给大家介绍了关于Java根据日期计算星期几的四种方法,文中通过代码将每种实现的非常详细,需要的朋友可以参考下方法一:根据基姆拉尔森日期公式publicstaticvoidmain(Stringargs[]){Scannerscanner=new......