文档章节

final 关键字和字符串 “+”号

 程序羊
发布于 2017/08/15 20:19
字数 757
阅读 13
收藏 1

final可以用来修饰 类、成员变量、方法

1、修饰类

修饰类时,表示该类不可以被继承,同时,该类的方法也被默认为final修饰的(变量没有)

2、修饰方法

修饰方法时,表示这个方法不可以被重写,但是可以被继承(子类不能随便修改父类的方法了)

3、修饰成员变量

这个是最重要的一点。

当成员变量为基本数据类型时,则该值在初始化之后,则不可以被改变。如下代码

当成员变量为引用类型时,则该引用在初始化后,则不可以指向别的对象了,但是这个对象里属性的值还是可以改变的。

并且,在final修饰引用类型的成员变量时,必须显式的初始化(因为如果不显式的初始化,在代码中也不可能通过set方法来给它赋值,和基本数据类型一样,用set方法赋值时,会报错)

 

再说一个比较经典的问题,

public static void main(String[] args) {
    String s1 = "a";
    String s2 = "b";
    final String fs2 = "b";
    String s3 = "ab";
    String s4 = s1 + s2;
    String s5 = "a" + fs2;
    String s6 = "a" + "b";
    System.out.println(s3 == s6);//true
    System.out.println(s3 == s4);//false
    System.out.println(s3 == s5);//true
}

这是为什么呢

s3 == s6,

在jvm计算字符串相加时,如果是相当于“a” + "b",则在编译时就自动优化为“ab”。所以s3和s6相等

s3 != s4,

s4是两个变量的值相加,所以在编译时无法确认他们(s1和s2)的值,在执行时,会重新new 一个StringBuilder()来append他们的值,而最终s4指向的是堆中的一个对象,非String Pool中

s3 == s5

这个就是fianl的作用了,fs2被fianl修饰了,那么就是常量,在编译期就可以确定其值,所以,

s5 = "a"+fs2 其实就相当于 s5 = "a" + "b" 

 

通过上面的阐述,也就知道,字符串在相加时的一些“规则”

String str1 = “c”;

String str2 = “a” + str1 + "b"; 这样的写法,在jvm编译时是无法优化的,因为a和b之间夹了一个变量str1

String str2 = “a” + "b" + str1; 这样的写法,在jvm编译时自动优化为 “ab” + str1

 

在字符串相加时,加号直接相连的常量之间可以被jvm自动编译时就优化,一旦中间夹了变量,则会重新创建一个StringBuilder对象来append,所以,如下代码:

public static void test1(){
    String str1 = "a";
    String str2 = "";
    long l1 = System.currentTimeMillis();
    for (int i=0;i<1000000;i++){
        //这样效率很低
        str2 += str1;
    }
    long l2 =  System.currentTimeMillis();
    System.out.println(str2);
    System.out.println(l2-l1);
}

效率是极其低下的,因为一直在不停地创建StringBuilder对象。一般我们用如下代码代替

public static void test2(){
    StringBuilder stringBuilder = new StringBuilder();
    String str2 = "";
    long l1 = System.currentTimeMillis();
    for (int i=0;i<1000000;i++){
        stringBuilder.append("a");
    }
    str2 = stringBuilder.toString();
    System.out.println(str2);
    long l2 =  System.currentTimeMillis();
    System.out.println(l2-l1);
}

这个代码只创建了一次StirngBuilder,在时间消耗上,比第一段代码强了不止十倍百倍。

 

 

 

 

 

© 著作权归作者所有

上一篇: mybatis的异常
下一篇: 初识zookeeper
粉丝 4
博文 58
码字总数 19536
作品 0
朝阳
程序员
私信 提问
final 的特性和使用

final 的特性和使用 1:final 修饰符 在 Java 中声明类、属性和方法时,可使用关键字 final 来修饰。final 所标记的成分具有“终态”的特征,表示“最终的”意思。 2:final 的规则 其具体规...

luodis
2010/12/29
305
5
Java面试基础篇——第三篇:String,StringBuffer,StringBuilder区别

我们先对比下String, StringBuffer, StringBuilder这三个类。他们的主要区别一般体现在线程安全和执行效率上。 类名 String StringBuffer StringBuilder 线程安全 安全(final修饰) 安全 不...

liululee
2018/07/16
0
0
JavaSE基础【吐血整理汇总】

1. 方法 1.1 定义方法的完整格式 定义方法的完整格式: 定义一个两个int数字相加的方法。三要素: 方法的三种调用格式。 注意:此前学习的方法,返回值类型固定写为void,这种方法只能够单独调...

flyingwzb
2018/12/14
0
0
        

<![CDATA[ ]]> 如果要求借助 mybatis 在XML文件中写出分数小于72分的学生姓名,那么XML文件中相应的SQL语句为: SELECT FROM studentscoretable <![CDATA[ WHERE score < 72 ]]> 非 SELECT F......

DemonsI
2018/12/10
0
0
android group by

比如要用实现这么一个sql语句: SELECT id, number, date, duration, type, name, numbertype, numberlabel, COUNT(*) FROM calls GROUP BY number,type,date/8640000 ORDER BY date DESC 这......

xiahuawuyu
2012/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nproc systemd on CentOS 7

Increasing nproc for processes launched by systemd on CentOS 7 Ask Question I have successfully increased the nofile and nproc value for the local users, but I couldn't find a p......

MtrS
51分钟前
3
0
了解微信小程序下拉刷新功能

小程序提供了这个事件。 onPullDownRefresh() 监听用户下拉刷新事件。 如果要开启下拉刷新功能,要先到json配置: "enablePullDownRefresh":true 配置后下拉有反应了但是没有加载效果,在onP...

oixxan__
今天
2
0
springmvc java对象转json,上传下载(未完)拦截器Interceptor以及源码解析(未完待续)

package com.atguigu.my.controller;import java.util.Collection;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Contr......

architect刘源源
今天
29
0
[日更-2019.5.24、25、26] Android系统中的Binder通信机制分析(一)--servicemanager

声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得去年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾... 最近,刚好在做...

Captain_小馬佩德罗
昨天
24
0
聊聊dubbo的DataStore

序 本文主要研究一下dubbo的DataStore DataStore dubbo-2.7.2/dubbo-common/src/main/java/org/apache/dubbo/common/store/DataStore.java @SPI("simple")public interface DataStore { ......

go4it
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部