String a= "test";

此语句含义是:在常量池中创建test字符串对象,变量aa是对常量池中此对象的引用

String aa = new String("test");

此语句含义是:如果常量池中没有test字符串对象,会在常量池中创建,并且还会在堆中创建一个test对象,变量aa是对堆中此对象的引用

String aaa= aa.intern() ;

此语句的含义是:如果常量池中有test字符串对象(判断条件是equal方法返回true),就直接返回常量池中该对象引用给aaa;如果没有,就会在常量池中创建test,再返回常量池中该对象的引用给aaa。

用以下代码运行结果验证一下:

package org.springmorning.demo.javabase.string;

/**
* @author 春晨
* @date 2019/1/7 9:05
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10232635.html
*/
public class StringAndNewStringDiff {
public static void main(String[] args) {
String a = "test"; //在常量池中创建test字符串对象,变量aa是对常量池中此对象的引用
String aa = new String("test"); //由于前面语句已经在常量也中创建了test字符串对象,那么只会在堆中创建一个test对象,变量aa是对堆中此对象的引用
String aaa = new String("test");//在堆中再创建一个test字符串对象,变量aaa是对堆中此对象的引用 System.out.println("判断它们是否为同一对象(内存地址是否一致):");
System.out.println("a和aa:" + (a == aa)); //false
System.out.println("a和aaa:" + (a == aaa)); //false
System.out.println("aa和aaa:" + (aa == aaa)); //false System.out.println("判断它们常量池中的对象是否为同一对象(内存地址是否一致):");
System.out.println("a和aa:" + (a.intern() == aa.intern())); //true
System.out.println("a和aaa:" + (a.intern() == aaa.intern())); //true
System.out.println("aa和aaa:" + (aa.intern() == aaa.intern())); //true System.out.println("判断它们引用的值字符串是否相等:");
System.out.println("a和aa:" + a.equals(aa)); //true
System.out.println("a和aaa:" + a.equals(aaa)); //true
System.out.println("aa和aaa:" + aa.equals(aaa)); //true }
}

总结:

new 关键字,不管常量池中有没有相同的对象,都会在堆中创建一个新对象。

String和new String的那点事的更多相关文章

  1. 经典String str = new String("abc")内存分配问题

    出自:http://blog.csdn.net/ycwload/article/details/2650059 今天要找和存储管理相关的一些知识,网上搜了半天也没有找到完善的(30%的程度都不到),没 ...

  2. 用java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解决乱码问题

    Java中String的数据是如何存储的,查看源代码就可以知道,String的数据是存储在char[] value这样一个成员变量中的,char类型的大小在java中是2个字节 我们还知道,现在普遍使 ...

  3. string.IsNullOrEmpty和string.IsNullOrWhiteSpace方法的区别

    string.IsNullOrEmpty 都知道,这个功能是判断字符串是否为:null或者string.Empty.如果是如"\t"这样的字符就返回false了,为了达到判断过滤这 ...

  4. 关于String str =new String("abc")和 String str = "abc"的比较

    String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...

  5. Javascript中String()与new String()的差异

    这里主要关注的是值类型和引用类型. 我们知道在javascript中的变量在内存中的存储有两种形式,值类型存储和引用类型存储. 通常可以进行值存储的包括  字符串类型,布尔值类型,数字类型,他们都包含 ...

  6. C#、.Net代码精简优化(空操作符(??)、as、string.IsNullOrEmpty() 、 string.IsNullOrWhiteSpace()、string.Equals()、System.IO.Path 的用法)

    一.空操作符(??)在程序中经常会遇到对字符串或是对象判断null的操作,如果为null则给空值或是一个指定的值.通常我们会这样来处理: .string name = value; if (name ...

  7. 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)

    通常情况下,我们判断一个字符串中是否存在某值常常会用string.contains,其实判断一个字符串中存在某值的方法有很多种,最常用的就是前述所说的string.contains,相对来说比较常用的 ...

  8. C# string.format、string.connect和+=运算 效率计算

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Stri ...

  9. 如何将List<string>转化为string

    Convert List, string. A List can be converted to a string. This is possible with the ToArray method ...

  10. 1,字符是否为空,2,比较两个字符大小。String.Compare(String, String)。string.IsNullOrEmpty(string)

    1, String.Compare 方法 (String, String) 比较两个指定的 String 对象. 值 条件 小于零 strA 小于 strB. 零 strA 等于 strB. 大于零 ...

随机推荐

  1. 移动端网页--better-scroll介绍

    移动端网页--better-scroll介绍 Options 起始位置及滚动方向 startX:0 开始时的X轴位置 startY:0 开始时的Y轴位置 scrollY: true 滚动方向为 Y 轴 ...

  2. 从源码角度深入解析Callable接口

    摘要:从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 本文分享自华为云社区<一个Callable接口能有多少知识点?>,作者 ...

  3. 五天学会Deep Learning

    五天学完deep learning......是时候来证明chatGPT和new bing的能力了...... DAY1 Sigmoid function Sigmoid 函数是一种常用的激活函数,它 ...

  4. Typora 最新中文版安装破解V1.4.8

    Typora中文破解版是一款好用极简免费的跨平台Markdown编辑器,软件使用这款软件能够帮助用户轻松将文本转换到HTML,软件从底层向上设计,软件支持markdown的标准语法,同时这款软件还支持 ...

  5. [白嫖]阿里云服务器ECS以及无影云桌面

    [白嫖]aliyun 阿里云ECS和无影云桌面 [云服务器 ECS]学生认证约7个月 适合入门级开发者,用于搭建网站.小程序.云博客.部署主流开发环境,如 lamp.node.js.wordpress ...

  6. 笔记:C++学习之旅---指针

    笔记:C++学习之旅---指针 为什么要使用指针 因为在操作大型数据和类时,由于指针可以通过内存地址直接访问数据,从而避免在程序中赋值大量的代码,因此指针的效率最高,一般来说,指针会有三大用途: 1: ...

  7. MQTT-会话

    MQTT会话 为什么需要会话 ​ 假如有以下场景,客户端A发送消息到服务端,服务端转发给客户端B,如果这个时候服务端和客户端B的网络连接断开,那么就无法保证消息到达,并且客户端A不知道B连接断开,还会 ...

  8. Selenium Grid入门详解

    一.简介 Selenium是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器.操作系统和机器上 Selenium Grid主要使用 master-slaves或者hub-no ...

  9. 【问题解决】RabbitMQ启动出现epmd error for host xx.xx: nxdomain (non-existing domain)

    问题描述 [k8s]或[普通容器]或[Linux]部署的RabbitMQ启动时出现了 epmd error for host xx.xx: nxdomain (non-existing domain) ...

  10. 【Python基础】数据类型与类型转换

    五种基本数据类型 在 Python 中,基本数据类型是指不可变对象的数据类型.以下是 Python 中的基本数据类型: 整数类型(int):表示整数,例如 1.2.3 等等. 浮点数类型(float) ...