文档章节

由String.equals()方法引起的一系列思考

问题达人
 问题达人
发布于 2016/07/17 13:32
字数 668
阅读 19
收藏 0

    废话不多说直接贴String.euqals方法代码

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

在阅读equals方法实现的时候对红色字体的逻辑感觉不够简化(需要多定义一个变量  'i' ),所以自己实现了如下代码(替换红色部分),

while (n != 0) {
    if (v1[--n] != v2[n])
        return false;
}

自认为少定义了一个变量,可以优化代码行数(最近在关注代码质量问题,开始对代码有洁癖,多一行都感觉不够优雅 ^_^),然后心里小高兴的让媳妇(高前端)来探讨(其实就是想炫耀了)。

   我们就在代码优雅及可读性、常规思维的优先级各执己见,突然又想到数组根据下标取数据的效率快慢(这可是决定了我的优化在效率方面是否有提升哇),赶紧查看JDK数组的实现。

    上网查了一些资料却没有找到JDK 数组实现的相关内容,所以只能先暂时放下这个思路(有知道的大神给点提示哇)。另寻思路就是自己实现一个超级大的数组,然后比较数组取第一个元素及取最后一个元素的时间差,于是作者变实现了如下代码:

public static void main(String[] args) {
    int vArr[] = new int[15464691];//jvm默认数组最大值
    int i = 0;
    while(i != 15464691){
        vArr[i] = i++;
    }
    long start = System.currentTimeMillis();
    System.out.println(vArr[0] + " time:" + (start - System.currentTimeMillis()));
    start = System.currentTimeMillis();
    System.out.println(vArr[15464690]+" time:"+(start - System.currentTimeMillis() ));
}

控制打印信息:

    0 time:0(多次运行中,有一次出现-1)
    15464690 time:0

    所以在数组取值的效率这个问题上暂且结论为是没有影响的。

    现在我心里的观点是修改后的逻辑(数组从后往前比较)与常规逻辑(从前往后比较)及代码可阅读性上,对咱广大程序员来说还是小case的,那我觉着能少一个变量的定义、操作,少一行代码,对我来说都是小小的骄傲啊(我又对代码进行了优化哇O(∩_∩)O哈哈~)。

    现在未查找JDK中数组实现原理,所以暂且结论如上,如有哪位大大给指教一下啊。

    然后坐着会继续找一些JDK的数组实现,再进行比较。

 

 

 

© 著作权归作者所有

共有 人打赏支持
问题达人
粉丝 11
博文 92
码字总数 82252
作品 0
昌平
程序员
Java集合遍历引发的"血案"

一、List集合迭代方式遍历一 <1>、可能出现的问题一:出现并发修改异常(ConcurrentModificationException) import java.util.ArrayList; import java.util.Iterator; import java.util.Li......

www19
2017/06/20
0
0
Java7中的switch支持String的实现细节

在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。在Java7中,呼吁很久的String支持也终于被加上了。 例如,下面是一段switch中使用String的示例代码。 ...

Freewheel
2015/09/26
335
0
小型实时系统 - One OS

One OS 简介 One OS是一个专注于可靠性和简易可用的小型实时系统。它通过采取形式化方法来确保系统的可靠性。所有的实时操作系统必备的功能它都具备,但是并不在此基础上提供更多可选组件以确...

EDI-Systems
09/11
0
0
hywel_lee/NumberInputTextField

#NumberInputTextField 利用“类族模式”隐藏“抽象基类”背后实现的细节,以保持接口的简洁。主要是提供一种思考方式,实现输入框的纯数字或者带小数点数字金额的输入验证(也可以采用类扩展...

hywel_lee
2016/09/21
0
0
jquery的slideUp、slideDown、slideToggle等涉及滑动效果的一系列...

jquery的slideUp、slideDown、slideToggle等涉及滑动效果的一系列函数,在IE浏览器下有几处bug 原文出处 jquery的slideUp、slideDown、slideToggle等涉及滑动效果的一系列函数,在IE浏览器下...

吟啸_徐行
2013/01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

elastic search+kibana 5.6.12安装指南

前提准备: 1,安装jdk, We recommend installing Java version 1.8.0_131 or later. 2, 设置文件最大打开数(使用命令ulimit -n查看) ulimit -n 65536 3, 创建用户elastic/用户组elastic gro...

PageYi
32分钟前
2
0
安装mongodb碰到error: unpacking of archive failed on file /etc/init.d/mongod;5bcec214: cpio: open如何解决

今用yum安装mongodb4.0.3发现一个错误,当用yum install 安装mongo-org 时除了mongodb-org-server 没有安装以外其他的都安装正确,重新安装mongodb-org-server 时报如下错误信息 在一篇老外 ...

chanking
33分钟前
1
0
O2OA:企业办公数字化转型的更佳选择

在全球都在积极探索由新一轮信息技术所引发的第四次工业革命时,一场激发企业内生动力的数字化运动在互联网企业和传统企业之间却呈现出两种截然不同的状态。   传统企业办公数字化不彻底仍...

超能之法师
36分钟前
1
0
基于SylixOS 对 Goahead 进行配置使用 OpenSSL

1. 编译并部署OpenSSL SylixOS支持OpenSSL,git地址为:http://git.sylixos.com/repo/openssl.git 获取OpenSSL工程源码后,导入RealEvo-IDE中编译,编译完成后生成动态库文件和openssl可执行...

Baiqq
38分钟前
1
0
nginx+tomcat均衡负载

一、安装好nginx环境,启动至少两个的tomcat服务; 此处tomcat访问地址为:http://192.168.106.128:1000/、http://192.168.106.128:1001/、http://192.168.106.128:1002/ 二、修改nginx配置文...

狼王黄师傅
40分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部