新手帖之String分析

String在java中算是一个比较特殊的类,既能作为基本数据类型使用(String str="123"),也能作为对象使用(String str = new String("123"))。我们先看几组简单的测试。

第一组:

String str1 = new String("123");
String str2 = new String("123");
System.out.println(str1==str2);//false
System.out.println(str1.equals(str2));//true

第二组:

String str1 = new String("123");
String str2 = str1;
System.out.println(str1==str2);//true
System.out.println(str1.equals(str2));//true

第三组:

String str1 = "123";
String str2 = "123";
System.out.println(str1==str2);//true
System.out.println(str1.equals(str2));//true

首先我们得知道==和equals的区别,==比较的是引用(即是否指向同一个对象)是否相等,equals比较的是字面量是否相等。

第一组结果很好理解,str1和str2作为对象使用,通过new关键字创建各自对立的内存堆(这只是其一,后面会再介绍)。

第二组也好理解,str1通过new创建自己对立的内存堆,然后将引用赋值给str2,两者指向的是同一片内存区域。

第三组为什么==比较的结果是true?我们发现第三组str1和str2是当作基本类型使用的,没有new关键字,也就是说JVM不会在堆中给两者分配空间,那它们存在哪里?其实在java中有一个String池这么个东西。我们知道String str = new String("123")这行代码其实是创建了两个对象,一个对象在String池中,一个在堆中。

小结:当作为对象使用时,首先会在String池中找是否存在该对象,如果有则不在String池中创建该对象,直接copy一份到堆中,如果没有,现在池中创建,也是copy一份到堆中,返回的是堆中对应的引用。

当作为基本数据使用时,只会在String池中创建,如果有不创建,返回该对象的引用,没有则创建,返回该对象的引用。

了解了这两种用法的原理后,我们扩展下。

String s1 = "s";

String s2 = "a";

String str = new String("123"+"456");该行代码会产生两个对象,等价于new String("123456"),java编译器有合并已知量的优化功能。

String str = s1+s2;该行代码会产生三个对象,等价与new String(new StringBuilder(s1).append(s2).toString()),String是常量不能相加,java会转换成等价写法。之所以不用StringBuffer(线程安全)可能是StringBuilder速度快把(非线程安全),个人猜想,未验证。

小结:

String str="s";//1个对象

String str=new String("s");//两个对象

String str="123"+"123";//一个对象

String s= str+"123";//三个对象

特例:final String s1="s";

final String s2="a";

s1+s2等价于"s"+"a"

最后再说一个null,String a 和String a=null在作为类变量时是相同的,但在局部变量中是不一样的,在局部变量中必须采后后者写法,必须初始化。这就是为什么局部中String 编译不通过的原因。

本人是java菜鸟,希望各位高手批评指正。

新手帖之String分析,布布扣,bubuko.com

时间: 2024-12-12 01:10:28

新手帖之String分析的相关文章

关于spring framework最新发布压缩包的下载问题 【非常非常新手帖】

关于spring framework最新发布压缩包的下载问题 [非常非常新手帖] - Java之道 - 博客频道 - CSDN.NET 最近,spirng官方改版,spring framework最新release的zip包已经在官网上找不着相应链接了,都改成maven构建下载的方式了,让初学者无从下载. 这里给大家提供springframework最新release的zip包的下载地址: ?1. 在浏览器中打开这个地址 http://maven.springframework.org/rele

[转帖]Java性能分析神器-JProfiler详解(转)

https://www.cnblogs.com/jpfss/p/8488111.html 前段时间在给公司项目做性能分析,从简单的分析Log(GC log, postgrep log, hibernate statitistic),到通过AOP搜集软件运行数据,再到PET测试,感觉时间花了不少,性能也有一定的提升,但总感觉像是工作在原始时代,无法简单顺畅,又无比清晰的获得想要的结果.遂花费了一定的时间,从新梳理学习了一下之前用过的关于jvm调优和内存分析的各种工具,包括JDK自带的jps, js

java中String s="abc"及String s=new String("abc")详解

1.   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共 享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要 在运行时动态分配内存,存取速度较慢. ==是判断

编译原理LL1文法分析表算法实现

import hjzgg.first.First; import hjzgg.follow.Follow; import hjzgg.tablenode.TableNode; import hjzgg.treenode.TreeNode; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.Stack; im

log4j 异步日志问题分析

1. 常用的DailyRollingFileAppender与RollingFileAppender是否同步? 1.1 代码分析 2. log4j 1.2.x提供了异步appender是什么?AsyncAppender 2.1 AsyncAppender配置 2.2 AsyncAppender分析 3. log4j 2.x 异步日志问题的解决方案及分析 3.1 log4j 2.x 异步日志问题的解决方案 3.2 log4j 2.x 异步日志性能高的关键 1. 常用的DailyRollingFil

<LeetCode OJ> 345. Reverse Vowels of a String

Total Accepted: 537 Total Submissions: 1488 Difficulty: Easy Write a function that takes a string as input and reverse only the vowels of a string. Example 1: Given s = "hello", return "holle". Example 2: Given s = "leetcode"

String s="abc"及String s=new String("abc")详解

一.相关知识点 1.   栈(stack)与堆(heap)都是Java用来在Ram(随机存取存储器)中存放数据的地方, 栈数据可以共享. 2.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性. 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.缺点是,由于要在运行时动态分配内存,存取速度较慢. 3.   ==是判断两个对象是否是同一个对象即引用地址:equa

如何分析网站日志文件

很多新手站长对于如何分析网站日志文件一筹莫展,打开.log日志文件看到的只有密密麻麻的数字和字母,细看能看出是什么含义,但是想要系统科学的去进行分析太耗时间,这时一般只能借助于第三方日志分析软件,而下面介绍一种不需要下载日志分析软件即可很有效率地分析log文件的方法: 步骤一:下载你的网站日志文件并打开,选择编辑替换功能,将空格替换成英文逗号: 步骤二:打开替换好的日志文件选择文件另存为,保存类型改成所有文件,文件名后缀为csv,比如log.csv,然后点击保存: 步骤三:新建一个excel表格

LeetCode-Interleaving String[dp]

Interleaving String Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = "aabcc",s2 = "dbbca", When s3 = "aadbbcbcac", return true.When s3 = "aadbbbaccc", return false