一、两种赋值方式的比较

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

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

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

比如:String s="abc";

String ss="abc";

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

2、通过关键字new调用String的构造方法: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。

(4)String e="e"+1;

String b3="e1";

System.out.println(e==b3);

结果为true,

因为e,b3都为常量,在编译期即可以确定值。

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

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

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

    String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案 ...

  2. [Java] 01 String 内存分析

    public class StringTest{ public static void main(String[] args){ String str1 = new String("123& ...

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

    今天在写代码的时候用到了java.lang.String.isEmpty()的这个方法,之前也用过,今天突发奇想,就看了看源码,了解了解它的实现方法,总结出来,大家可以交流交流. 通常情况下,我们使用 ...

  4. Java中String连接性能的分析【转】

    [转]http://www.blogjava.net/javagrass/archive/2010/01/24/310650.html 总结:如果String的数量小于4(不含4),使用String. ...

  5. SSM框架报错分析(一)——There is no getter for property named 'XXX' in 'class java.lang.String'

    一.发现问题 <select id="queryStudentByNum" resultType="student" parameterType=&quo ...

  6. Java中String连接性能的分析

    总结:如果String的数量小于4(不含4),使用String.concat()来连接String,否则首先计算最终结果的长度,再用该长度来创建一个StringBuilder,最后使用这个String ...

  7. Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较

    附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...

  8. Java动态代理全面分析

    代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1  主题:规定代理类和真实对象共同对外暴露的接口: 2  代理类:专门代理真实对象的类: 3 ...

  9. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

随机推荐

  1. AngularJS标准Web业务流程开发框架-4.AngularJS四大模块之一:Controller

    一.Controller的创建 angular.controller("name",funtion($scope){ }) 1.name:控制器的名称(建议参考Java包的命名规范 ...

  2. Spring 获取资源文件路径

    import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; s ...

  3. CGA裁剪算法之线段裁剪算法

    CGA裁剪算法之线段裁剪算法 常用的线段裁剪算法有三种:[1]Cohen_SutherLand裁剪算法,[2]中点分割裁剪算法,[3]参数化方法. 1. Cohen_SutherLand裁剪算法 为了 ...

  4. 讲解java异常

    J2EE项目异常处理                        为什么要在J2EE项目中谈异常处理呢?可能许多java初学者都想说:“异常处理不就是try….catch…finally吗?这谁都会 ...

  5. CentOS 7 安装MySQL 8.0.11

    1. 下载安装包 wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar 下载 ...

  6. 在循环中使用鼠标悬停时表示当前悬停选中,传入this关键字即可

    在前端循环中使用鼠标悬停事件 <div class="message-widget contact-widget"> <!-- Message --> {% ...

  7. WPF 的Listbox 滚动处理

    操作需求场景:Listbox 高150  item 高150 listbox有几十个item ,希望鼠标滚轮滚动一次listbox 能滚动到下一个item, 代码实现: <Grid x:Name ...

  8. 【Cocos2d-Js实战教学(1)横版摇杆八方向移动】

    本教程主要通过搭建一个横版摇杆八方向移动的实例,让大家如何用Cocos2dx-Js来做一款游戏,从基础了解Cocos2dx-Js的基本实现原理,从创建工程,到各个知识点的梳理. 教程分为上下两讲: 上 ...

  9. c# 1-2+3-4.....求和

    找规律: 下界:1 上界:n class Program { static void Main(string[] args) { ; ; i <=; i++) { ==) { sum -= i; ...

  10. Java并发编程读书笔记(一)

    ----------------------------------------------<Java并发编程实战>读书笔记-------------------------------- ...