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中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
随机推荐
- 初探Java反射机制
反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序库.这项功能被大量地应用于JavaBeans中.反射机制提供了在运行状态中获得和调用修改任何一个类的属性和方法的能力. ...
- IntelliJ IDEA 2017版 spring-boot 实现jpa基本部署,通过实体类自动建立数据库
一.添加Spring Boot JPA-Hibernate步骤 1.在pom.xml添加mysql,spring-data-jpa依赖 2.在application.properties文件 ...
- LA 3026 && POJ 1961 Period (KMP算法)
题意:给定一个长度为n字符串s,求它每个前缀的最短循环节.也就是对于每个i(2<=i<=n),求一个最大整数k>1(如果存在),使得s的前i个字符组成的前缀是某个字符串重复得k次得到 ...
- public class 和class 的区别
Java在编写类的时候可以使用两种方式定义类: public class定义类: class定义类: 如果一个类声明的时候使用了public class进行了声明,则类名称必须与 ...
- Spring3.x错误----Bean named "txAdvice" must be of type[org.aopallibance.aop.Advice
Spring3.x错误: 解决方法: aopalliance-1.0.jar 和 aopalliance-alpha1.jar之间的冲突.
- Java Toolkit类用法
这是一个AWT工具箱.它提供对本地GUI最低层次的JAVA访问.在大多情况下,这个类不直接用在小应用程序或应用程序中.具有把行图形数据转换为可显示的图像.返回字体信息.得出显示尺寸和分辨率以及获得系统 ...
- 零停重启程序工具Huptime研究
目录 目录 1 1. 官网 1 2. 功能 1 3. 环境要求 2 4. 实现原理 2 5. SIGHUP信号处理 3 6. 重启线程 4 7. 重启目标程序 5 8. 系统调用钩子辅助 6 9. 被 ...
- Win & Mac 系统之间U盘传递的U盘文件格式选取问题
Win & Mac 系统之间U盘传递的U盘文件格式选取问题 1. Win系统与Mac系统之间可以通过 exFat U盘文件系统传递 exFAT(Extended File Allocation ...
- const 用法全面总结
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...
- 开源的前端web框架推荐
B-JUI前端框架:http://demo.b-jui.com/ gentelella :https://colorlib.com/polygon/gentelella/ admui(收费):http ...