Java—关于String的分析
一、两种赋值方式的比较
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的分析的更多相关文章
- java中String创建对象分析(转)
String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案 ...
- [Java] 01 String 内存分析
public class StringTest{ public static void main(String[] args){ String str1 = new String("123& ...
- 从源码分析java.lang.String.isEmpty()
今天在写代码的时候用到了java.lang.String.isEmpty()的这个方法,之前也用过,今天突发奇想,就看了看源码,了解了解它的实现方法,总结出来,大家可以交流交流. 通常情况下,我们使用 ...
- Java中String连接性能的分析【转】
[转]http://www.blogjava.net/javagrass/archive/2010/01/24/310650.html 总结:如果String的数量小于4(不含4),使用String. ...
- SSM框架报错分析(一)——There is no getter for property named 'XXX' in 'class java.lang.String'
一.发现问题 <select id="queryStudentByNum" resultType="student" parameterType=&quo ...
- Java中String连接性能的分析
总结:如果String的数量小于4(不含4),使用String.concat()来连接String,否则首先计算最终结果的长度,再用该长度来创建一个StringBuilder,最后使用这个String ...
- Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较
附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...
- Java动态代理全面分析
代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1 主题:规定代理类和真实对象共同对外暴露的接口: 2 代理类:专门代理真实对象的类: 3 ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
随机推荐
- IntelliJ IDEA 2017版 spring-boot加载jsp配置详解(详细图文实例)
一.创建项目 (File--->New-->Project) 2.项目配置内容 3.选择配置项目的Group包名,Artifact项目名称 4.选择项目类型为web类型 5.创建成功,点击 ...
- HDU 1846 Brave Game (博弈水题)
题意:中文...你们懂得. 析:这个就是一个水题博弈,就是一个巴什博弈定理,直接就没有变,如果你们看过我写的那个,这个题绝对水过. 附地址:http://www.cnblogs.com/dwtfukg ...
- Object_C初始化方法, 遍历构造器
//版本1 //- (id)init //{ // work = @"工作"; // return self; //} // // //版本2:调用父类的init ...
- android build.gradle(groovy)
一.build.Gradle 这个 build.Gradle 文件来自 drakeet 大神的 Meizi 项目我直接在代码上加注释,参照着注释看代码就行,是不是发现有很多代码平时都没看见过. //M ...
- C++总的const使用说明
C++总的const使用说明 1. const修饰类成员变量 程序: #include <iostream> using namespace std; class A { public: ...
- Linux 输入输出(I/O)重定向
目录 1.概念 Linux 文件描述符 2.输出重定向 格式 示例 注意 3.输入重定向 格式 示例 4.自定义输入输出设备 解释 示例 最后说两句 1.概念 在解释什么是重定向之前,先来说说什么是文 ...
- 探求Floyd算法的动态规划本质
Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...
- Flord算法传递闭包
POJ3660 对于flord算法得学习,这篇博客写的非常好http://blog.csdn.net/ljhandlwt/article/details/52096932 这个题问你给你n头牛得前后关 ...
- 第一章 JVM内存结构
注意:本系列博客,主要参考自以下四本书 <分布式Java应用:基础与实践><深入理解Java虚拟机(第二版)><深入分析Java web技术内幕><实战jav ...
- REST格式
首先要明确一点:REST 实际上只是一种设计风格,它并不是标准.(所以你可以看到网上一大堆的各种最佳实践,设计指南,但是没有人说设计标准).aisuhua/restful-api-design-ref ...