Java—关于String的分析

一、两种赋值方式的比较

1、直接赋值法:String s1="abc";

这种赋值方法用的最多,因为它可能不需要创建对象,或者只创建一次。

它首先会判断字符串常量池有没有存在字符串abc,如果没有存在,则将其保存在常量池中,并用s1指向该对象。如果已经存在了此字符串,则不需要再次创建对象。

比如:String s="abc";

String ss="abc";

则:s==ss执行结果为true,(此方法判断两个对象是否指向同一个地址),说明常量池已经存在的字符串没有再次创建。

2、new创建对象法:String s2=new String("abc");

此种赋值方法一般使用很少,因为它至少要创建一次对象,或者创建两次,相比之下比较占内存。

它首先判断常量池是否存在abc,如果不存在的话,需把abc先保存在常量池中,再在堆中创建一个对象,一共创建两次。

如果常量池已经存在abc,则只需要在堆中创建一次。

二、字符串相加时,编译期和运行期的分析

(1)String a="a";

String a1=a+1;

String b="a1";

System.out.println(a1==b);

结果为false

因为在编译期a和b的值就能确定,但是a1为变量加常量,还为变量,它在编译期时无法确定值,因为它无法确定变量a的值,只有运行期时才能得出值为a1。所以结果为false。

(2) final String c="c";

String c1=c+1;

String b1="c1";

System.out.println(c1==b1);

结果为true。

c被final修饰后为常量,b1也为常量,所以在编译期就可以确定值,所以c1也为常量,值为"c1",并且在编译期也可以确定值,所以结果为true。

(3)final String d=getD();

String d1=d+1;

String b2="d1";

System.out.println(d1==b2);

public static String getD(){
                 return d;

}

结果为false

d虽然为常量,但是需要调用方法来赋值,而调用方法只有值运行期才返回结果,所以它在编译期不能确定值,d1也无法在编译期确定值,而b2可以确定,所以结果为false。

——————————————————一些个人总结,如有不对的地方,还望各种博友指出交流。

时间: 2024-08-25 07:01:42

Java—关于String的分析的相关文章

java中String创建对象分析(转)

String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个. 接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识. 我们可以把上面这行代码分成String str.=."abc"和new String()四部分来看待.String str只是定义了一个名为str的String类型的变量,因此它并

分析Java的String对象

对于Java中的String对象,个人觉得每个程序员都会思考过.学习过.研究过这个对象,因为他是面试官们的最爱.如:String s = new String("abc");,创建了几个对象.这种问题反复出现在程序员面试的过程中.下面我们对应着一些代码片段以及其的执行结果,来深入分析Java的String对象. 首先我们要注意的是String对象的处理在JDK6和JDK7中的处理是不同的.下面通过代码来分析String的三个主要方面知识. 1.常量池的存在 先看看下面代码以及执行结果:

Java中String连接性能的分析

总结:如果String的数量小于4(不含4),使用String.concat()来连接String,否则首先计算最终结果的长度,再用该长度来创建一个StringBuilder,最后使用这个StringBuilder来连接所有String.      我建议大家如果确定需要连接的String的数量小于4的,直接使用String.concat()来连接,虽然StringBundler能够帮你自动处理这一情况,但创建一个String[]和那些方法调用都是一些无谓的开销. Java中的String是一个

从源码分析java.lang.String.isEmpty()

今天在写代码的时候用到了java.lang.String.isEmpty()的这个方法,之前也用过,今天突发奇想,就看了看源码,了解了解它的实现方法,总结出来,大家可以交流交流. 通常情况下,我们使用这个方法的时候是这样的: "hello wudb".isEmpty(); 上面的代码返回的是false,然后我们打开源码分析,isEmpty()这个方法在很多类里面都有,我们今天分析的是String里面的,所以找到java.lang.String这个类,然后去找idEmpty()这个方法

There is no getter for property named '*' in 'class java.lang.String'之源码分析

There is no getter for property named '*' in 'class java.lang.String',此错误之所以出现,是因为mybatis在对parameterType="String"的sql语句做了限制,假如你使用<when test="username != null">这样的条件判断时,就会出现该错误,不过今天我们来刨根问底一下. 一.错误再现 想要追本溯源,就需要错误再现,那么假设我们有这样一个sql查询

Java中String、StringBuffer、StringBuilder的比较与源 代码分析

Java中String.StringBuffer.StringBuilder的比较与源代码分析 众所周知String.StringBuffer.StringBuilder是java中常用的字符串类,下面我将从三个方面对他们三兄弟进行对比. 一.三者的数据组织及其功能实现 大家爱把String.StringBuffer.StringBuilder叫做三兄弟,经过分析代码发现说他俩三兄弟有点不太贴切,从组织结构上说,StringBuffer.StringBuilder更像是亲兄弟,这哥俩儿都有一个妈

Attempt to invoke virtual method &#39;boolean java.lang.String.equals(java.lang.Object)&#39; on a null object reference xxx 的问题分析与解决方案

最近,公司要求开发一个APP,所以很苦逼的学习了几天 Android 的上手手册,但是实际运用于开发中还是捉襟见肘,困难重重:好在的是,部门还有几个专门搞安卓的大佬可以问问,哈哈 好了,进入今天的正题吧,前天开发过程中,遇到一个如“标题”所示的问题,百思不得其解!最终上网搜报错的原因,才找到问题的所在:.xml文件中运用到了不存在的标签--我的是因为粗心把<View>写成了<view>,加载的时候找不到该标签,所以页面一直运行不出来. 所以,该问题基本出在于布局页面有错(有的错误页

Java源代码学习 -- java.lang.String

java.lang.String是使用频率非常高的类.要想更好的使用java.lang.String类,了解其源代码实现是非常有必要的.由java.lang.String,自然联想到java.lang.StringBuffer和java.lang.StringBuilder,下篇文章再来研究java.lang.StringBuffer和java.lang.StringBuilder. 重要属性 java.lang.String对象中字符串主要是以字符数组的形式存储.当调用对象方法获取字符串长度时

Java NIO原理 图文分析及代码实现

Java NIO原理 图文分析及代码实现 博客分类: java底层 java NIO原理阻塞I/O非阻塞I/O Java NIO原理图文分析及代码实现 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术