文档章节

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

问题达人
 问题达人
发布于 2016/07/17 13:32
字数 668
阅读 19
收藏 0
点赞 0
评论 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
博文 91
码字总数 82252
作品 0
昌平
程序员
Java集合遍历引发的"血案"

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

www19 ⋅ 2017/06/20 ⋅ 0

关于性能比较的应用误区

今天周末,就不写太长的文章了,刚不小心看了篇性能比较的文章,有感而就写了此篇。 这年头,好多人都对性能比较产生了兴趣,然后就开始写比较示例,之后就得出了一个正确但误导新手的误区。...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

Java7中的switch支持String的实现细节

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

Freewheel ⋅ 2015/09/26 ⋅ 0

hywel_lee/NumberInputTextField

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

hywel_lee ⋅ 2016/09/21 ⋅ 0

jquery的slideUp、slideDown、slideToggle等涉及滑动效果的一系列...

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

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

维基百科网站或临时关闭 抗议美国反盗版法案

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

红薯 ⋅ 2011/12/14 ⋅ 12

java8之lambda表达式(变量作用域)

通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main(String[] args) { repeatMessage("Hello", 20); ...

柳哥 ⋅ 2015/05/25 ⋅ 15

在 React.Component 中如何优雅的绑定函数的 context

在 stub Component 的一个方法时,发现这个方法没在 prototype 上。研究了下编译后代码发现出一些猫腻,同时也引起思考:对于 React.Component 方法,如何优雅的去绑定 this。 问题现象 和 ...

Agreal ⋅ 2017/11/15 ⋅ 0

【外刊IT评论】清除代码异味

本文是从 Cleaning up code smells: Venkat Subramaniam @ Chennai 这篇文章翻译而来。 今天,Venkat Subramaniam 就关于清除代码异味的话题给我们做了一个非常有趣的演讲。下面就是我记录的...

红薯 ⋅ 2011/05/18 ⋅ 8

目标检测ssd等one stage算法中关于小目标识别问题的解决方法

考察很多算法 包括 yolo ssd等这一系列 onestage的方法 都不能解决检测时目标较小的问题,经过思考认为 问题出在小目标的特征图和 大目标不同上。 有篇论文解决了这个问题,就是RSSD算法 R ...

necther ⋅ 04/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具

压缩打包介绍 使用压缩工具的好处: 使用压缩文件,不仅可以节省磁盘空间,而且在传输时还能节省网络宽带。 我们通常讲的家用宽带和机房宽带100M是有区别的: 机房宽带的上行和下行都是100M,...

Linux_老吴 ⋅ 25分钟前 ⋅ 0

SpringBoot热部署加持

概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件、或者一些诸如xml的配置文件、以及一些静态文件生效,这样耗时又低效。所谓的热部署指的...

CodeSheep ⋅ 32分钟前 ⋅ 0

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 今天 ⋅ 5

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部