文档章节

由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的数组实现,再进行比较。

 

 

 

© 著作权归作者所有

共有 人打赏支持
问题达人
粉丝 12
博文 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
Spring为啥把我的Mapper都给我创建了(直接依赖的只有一个)?

项目中用到了shiro,shiro中配置了securityManager,securityManager中又配置了realm,realm下又配置了adminUserService,adminUserService中用到了adminUserMapper(使用@Autowire注解),别...

Lucare
03/08
356
2
hywel_lee/NumberInputTextField

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

hywel_lee
2016/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Libusb交叉编译和移植

  Libusb交叉编译和移植      某项目内核需要支持USB的相关操作,所以考虑移植Libusb库      1、到官网下载最新的libusb源码(1.0.22)      2、解压源码      3、进入解压...

SEOwhywhy
9分钟前
1
0
阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶

一、八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储。持续8年的投入,历经8年双...

阿里云云栖社区
13分钟前
1
0
【58沈剑 架构师之路】数据库索引,到底是什么做的?

问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到《架构师之路》,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类,三楼...

张锦飞
13分钟前
1
0
android webpage err_unknown_url_scheme

搞一个 Android 的webview demo 来访问网页, 结果 模拟器就报错了: webpage err_unknown_url_scheme 于是去百度了 一下。发现挺多解决方案的,都拿来试试。居然有几种方式都可以。 1, 参考...

之渊
16分钟前
1
0
JVM总结

区域简介 JVM运行时区域有些随着虚拟机进程的启动而存在,有些依赖于用户线程的启动和结束而建立和销毁,大致分为以下几类:方法区,虚拟机栈,本地方法栈,堆,程序计数器,概念图如下(源于...

瑞查德-Jack
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部