一、两种赋值方式的比较

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. 【Unity】2.2 Unity编辑器中的常用菜单项

    分类:Unity.C#.VS2015 创建日期:2016-03-26 Unity 5.3.4编辑器共提供了7个主菜单项,这一节主要学习其中的常用项. 一.File 1.基本功能 New Scene:新 ...

  2. 解决Jedis链接报超时异常和connection reset异常的方法

    一.链接池配置 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" ...

  3. 01-html和head介绍

    一.web标准 web准备介绍: w3c:万维网联盟组织,用来制定web标准的机构(组织) web标准:制作网页遵循的规范 web准备规范的分类:结构标准.表现标准.行为标准. 结构:html.表示: ...

  4. (最小生成树 Prim) Highways --POJ --1751

    链接: http://poj.org/problem?id=1751 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1150 ...

  5. MessageBox的常见用法

    一 函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer; hWnd:对话框父窗口句柄, ...

  6. 后台返回的json数据传到前端页面并在页面的表格中填充

    web前端页面: <table id="myTable" cellpadding="1" cellspacing="0" border ...

  7. 转:ObjectInputStream类和ObjectInputStream类的使用

    ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流. 创建文件输出流代码: FileOutputStream file_out = new ...

  8. PHP环境的搭建及与nginx的集成

    1.  去php官网下载最新稳定版(最新其实是7.0,为了兼容性,使用5.6.16) wget http://cn2.php.net/get/php-5.6.16.tar.gz/from/this/m ...

  9. Ubuntu-18.04.2系统 Nginx+uWSGI+Django 部署生产环境

    首先准备环境: 1.使用虚拟机 VMware Workstation Pro (也可以不用),安装Ubuntu-18.04.2系统 开始搭建环境 (因为ubuntu18.4.2集成了python3.6 ...

  10. Spring Boot - StateMachine状态机

    是Spring Boot提供的状态机的现成实现. 理论(有点像工作流) 需要定义一些状态的枚举,以及一些引起状态变化的事件的枚举. 每个状态可以对应的创建一个继承自org.springframewor ...