Java中String两种不同创建方式的区别及intern的用法
一,
Java有两种创建字符串的方式,
String str1 = "abc";
String str2 = new String("abc");
用双引号创建和用new来创建。这两种方式创建出来的String存储的位置上不同的。当使用双引号方式时,相当于显式的声明了字符串的值(字面值),所以是作为一个常量,存储在方法区的常量池中。使用new方式来创建String时,JVM会在堆上分配一块区域,存储一个String对象,值为“abc”。
二,
String的==和equals是不同的,==比较的是两个String在内存中的地址是否相同,equals比较的是两个String的值是否相同。所以,如果String是用双引号方式创建,则两个String都指向常量池中的同一个位置,这时==是成立的,equals也成立。如果String是用new方式创建的,两个String如果不是指向堆上的同一个String对象,则==不成立,而如果值相同,则equals成立。如:
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
String str4 = str2;
System.out.println(str1 == str3);//true
System.out.println(str1.equals(str3));//true
System.out.println(str2 == str3);//false
System.out.println(str2.equals(str3));//true
System.out.println(str2 == str4);//true, str4和str2指向同一个对象
System.out.println(str2.equals(str4));//true
三,
两种不同方式创建的字符串,在进行运算时结果是不同的。如果一个String是由两个常量运算得到的,相当于用双引号创建出来,会存入常量池,如:
String s = "a" + "b";
String t = "ab";
//以上两种创建方式,完全等价
如果运算时,等号右边有一个“运算数”不为常量(即使该“运算数”是用双引号创建的常量),则得到的结果相当于new创建的一个新的String对象,如:
String str1 = "abc";
String str2 = "abcd";
String str3 = "abc" + "d";
String str4 = str1 + "d"; System.out.println(str2 == str3);//true
System.out.println(str2.equals(str3));//true
System.out.println(str2 == str4);//false
System.out.println(str2.equals(str4));//true
四,intern()方法的用法。intern方法会返回一个字符串对应的常量值。在执行intern方法时,JVM会检查常量池中是否存在和该字符串相同的常量值,如果有,则返回该常量值,若没有,则创建该常量值,并返回。即,intern返回的是值常量池中的String,不是堆上的String,相当于用双引号创建String。
String str1 = "abc";
String str2 = "abcd";
String str3 = "abc" + "d";
String str4 = (str1 + "d").intern(); System.out.println(str2 == str3);//true
System.out.println(str2.equals(str3));//true
System.out.println(str2 == str4);//true
System.out.println(str2.equals(str4));//true
//注意和上例的区别
Java中String两种不同创建方式的区别及intern的用法的更多相关文章
- JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- Java中的两种异常类型及其区别?
Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...
- Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- Form表单中method=post/get两种数据传输的方式的区别
Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...
- Java中String、StringBuffer和StringBuilder之间的区别
String在Java中是字符串常量 例如 String str = "abc"; str = str + 1; System.out.println(str); 结果将是abc1 ...
- JS的两种函数声明方式的区别
---恢复内容开始--- js中常见的两种函数声明方式如下: // 函数表达式 var f = function() { console.log(1); } // 直接声明 function f () ...
- get和post 两种基本请求方式的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- java多线程(一)-五种线程创建方式
简单使用示例 Java 提供了三种创建线程的方法: 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 还有 定时器 线程池 下 ...
- Java中String类通过new创建和直接赋值字符串的区别
方式一:String a = “aaa” ; 方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优. 因为字符串是保存在常量池中的,而 ...
随机推荐
- netty6---序列化与反序列化
package com.cn; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ja ...
- Web安全学习笔记之Nmap脚本编写
0x00 Nmap脚本简介 夜无眠,看了一下Nmap官方的英文API文档(全是English),瞬间心态崩塌,不想吐槽它们的nmap官网前端太丑了=.=,但是都是大牛啊,挺敬佩开源开发者的. Nmap ...
- cordova linux 安装并编出第一个demo-android
cordova可以做到一次编写到处运行各个平台(android.ios.wp.bb.firefoxos.web等几乎所有平台) 手上只有一个android手机 ,安装的时候没有那么顺利,第一大问题就是 ...
- 20145312 《Java程序设计》第四周学习总结
20145312 <Java程序设计>第四周学习总结 学习笔记 Chapter 6 6.1何为继承 1.定义:面向对象中子类继承父类,避免重复的行为定义. 6.1.1 继承共同行为 1.以 ...
- 20135320赵瀚青LINUX第五章读书笔记
第五章--系统调用 5.1 与内核通信 作用 1.为用户空间提供一种硬件的抽象接口 2.保证系统稳定和安全 3.除异常和陷入,是内核唯一的合法入口. API.POSIX和C库 关于Unix接口设计:提 ...
- ubuntu文字界面与图形界面切换
redhat: (据说是) 图形界面->文字界面:crtl+alt+F1~6 文字界面->图形界面:crtl+alt+F7 -------------------------------- ...
- C++ 程序崩溃时生成Dump文件
#include <DbgHelp.h> //生产DUMP文件 int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExcept ...
- java堆排序(大根堆)
实现堆排序的算法思路是先创建堆,也就是从叶子节点起对每一层的孩子节点及其对应位置的父亲节点进行比较,较大的孩子节点替换较小的父亲节点,一级一级比较替换,就创建出了大根堆,小根堆反之.创建好大根堆以后, ...
- Python学习札记(十五) 高级特性1 切片
参考: 高级特性 切片 Note 1.掌握了Python的基础语法之后,就可以写出很多很有用的程序了,比如打印1-90的奇数: #!/usr/bin/env python3 L = [] n = 1 ...
- JavaScript对象、JSON对象、JSON字符串的区别
一.首先看下什么是JSON JSON:JavaScript Object Natation,JavaScript对象的表现形式,已经发展成一种轻量级的数据交换格式. JavaScript对象的表现形式 ...