文档章节

由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
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
维基百科网站或临时关闭 抗议美国反盗版法案

据国外媒体报道,维基百科网站联合创始人吉米·威尔士(Jimmy Wales)就美国打击在线盗版现象而草拟的法案,表示维基百科网站应该临时关闭,以表达对该法案的抗议。据悉,吉米在其个人主页上...

红薯
2011/12/14
1K
12

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day63-20180821-流利阅读笔记-待学习

性别歧视在日本:“我是女生,所以社会不让我学医” 毛西 2018-08-21 1.今日导读 大家在看病的时候,有留意过女医生的比例吗?在性别歧视现象十分严重的日本,男医生和女医生的比例达到了惊人...

aibinxiao
53分钟前
2
0
Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
4
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
2
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部