java开发小细节(equals,封装类和基本类型)

(Notice:欢迎交流和沟通,Wx:IT_Ezra,QQ 654303408。仅个人观点和个人理解有问题讨论也可联系我。)

(PS:写这篇博客的原因是因为刚入行不久,第一次把自己的自己所学的东西应用在实际层面,更让我意识到,基础的重要性。)

为什么我们需要重视基础?

对于一个科班生,一定会学到很多很多专业的课程,还有最基本的语法课程。当我们去学习某些语法,某些结构的时候,我们要思考,这些基础而高效的结构在哪里可以用到。对于java开发而言,现在更多的是框架开发,模块化开发,大公司里面,一个架构师帮你把框架搭好,自己填空就行了。这样对自己的成长并不是很友好。如果自己不主动去学习和思考“为什么这样做”的话,很容易迷失自己。

点题

下面我想说三个场景,运用到的基本语法和知识。

一:选择结构之判断——“== ,equals。以及比较顺序”。

说到这里的时候,我想拓展说一点。封装类和基本数据类型,Integer 和 int 是有很大区别的。Integer是封装好的类,有默认值,有自动转型。

	    Integer temp_1 = 10;
        int temp_2 = 10;
        String result = "10";
        if(temp_1.equals(result))
        {
            //代码
        }
        if(temp_2.equals(result))
        {
            //代码
        }

当我们看到这部分代码的时候,你们是否会思考一个问题。这两个有区别吗?如果觉得没有任何问题的同学可以去IDE上去亲自操作一下。
我来说明一下。由于Integer是封装好的类,它在比较的时候重写了equals方法。

Integer源码

我们可以看到,它的参数是object。所以,无论temp_1是什么值,在编译的过程中都不会报错。但是这并不是我们想要的结果,但是又为我们埋下了一个坑。为什么。因为,这句话肯定是希望如果temp_1 如果和 result的值相同的话,就会返回true,但是这句话无论如何都不会返回true,但是有时候又看不出什么问题。我现在把它单独提出来了,也许你会说,一个Integer型和String类型比,肯定不会相等啊。那么问题来了,既然你知道不会相等,为什么会有这个判断呢? 那我给你一个应用场景,也许你会觉得有道理:我一个实体类,里面有Integer类型的属性,然后从前端的request传过来的数据都是String类型。两者需要做判断。有的人就会直接写成第一种情况的代码。然后运行的时候发现报错。然后去调试,发现问题,甚至在发现问题的时候都会说,“我的代码应该没错呀”。
我们会希望是第二种情况。因为java是一个动态编译的过程。当你int和String比较的时候,都直接飘红了(如下图),告诉你,类型有问题。当然,Integer肯定有它的优点。同理,在通过获取某些数据的时候,它可能为空。但是如果直接为null,会造成空指针异常,那么Integer会很好的规避这个问题。所以如何取舍,看自己吧。

在这里插入图片描述

此外,我们也知道,对于String类型,它是final类型的,所以对于相等的判断,也是equals,并且equals也是经过重写了的(下图)。不要用“==” , 我见过很多博客在写微信支付接口的时候对返回值的判断都是用的 “ ==” ,个人感觉是有问题的。

String的equals方法重写

二:判断顺序——常量放在前面

其实这个应该是一个总所周知的小细节,并且非常通用和常用。当我们写代码时,经常会用到判断。一个常量和一个变量相比较,而那个变量也是通过外部获取,比如从前端传过来等等。这个时候,从前端过来可能为空。如果我们把常量放在前面,那么会省去变量为空的判断,并且也会少抛出一个异常(NullPointException),是不是很熟悉。

三:Redis的使用——对象的读写

通常在Redis里面是不支持对象的直接存储的,网上一些博客使用了序列化,这个是不错的选择,另外通过Json存放也是一个选择。但是最高效的方法是通过字符串存储。因为我们知道,流的速度是最快的。通过字符串流的读写,在Redis里面存的仅仅是字符串,速度是最快的。

具体实现:创建一个字符串变量Stringbuilder,然后设置分隔符(自己定),然后append各个属性。然后将这个字符串变量存到Redis里面或者取出来,然后对字符串进行操作。

(tips)我们可以写一个方法类,来对数据进行专门的转化,对固定对象的封装。

猜你喜欢

转载自blog.csdn.net/sinat_29039125/article/details/89380258