java坑吗_初学Java遇到的坑

人到大三,才发现自己会的语言还没包括Java,想到高程老师说的,你要是Java,python都不能自学的话,也别说是咱tj计算机的了……倍感羞愧,又想写点博客,方便以后回顾,遂随手写点东西,当作自己的一个review。

first impression

对于Java的第一印象还是很像C#的嘛,甚至还不如C#简单,但是自己貌似以前学C#的时候对于C#的框架理解的一般,只会写一点最基本的winform应用和console程序……以后有时间在开坑好了……

做的项目

这次选择用Java来填上个学期编译原理的坑,上个学期和队友用C++写,指针乱标,debug了半天,程序还是有时能运行,有时报出vector超出索引或者堆溢出这一类的error,干脆决定用Java来重构一遍,反正还有编译原理的课设。

遇到的小问题

equals()和hashCode()

最脑壳疼的大概就是这个equals()和hashCode()这个坑了吧……最开还是始注意到==和C++的区别了。但是没有仔细看,觉得equals和C++中的==应该差不多了,最后发现在Object这个类里面equals的实现依然是直接利用==来实现的……

public boolean equals(Object obj){

return (this==obj);

}

所以也难怪我之前都写完了,感觉没什么问题得时候程序不会停下来了。原来是equals这个导致我的判断出现了问题。

在朋友建议和网络查询之下,开始重写equals()和hashCode(),经过阅读之后,有下面几个问题

重写equals()方法的注意事项重写时需要注意满足离散数学中等价关系的三条,即对称性,传递性,反身性。

equals的输入参数是Object,也就是所有类,所以需要在其中加入一个instanceof或者getClass(),instanceof是用来判断两个对象之间的类的类型是不是一样的,如果是一样的返回true,否则返回false。getClass类似,字面意思。

为什么要一定要重写hashCode()?

因为Java里面有哈希表,如果不重写hashCode(),就可能会出现两个对象内容不同但是hashCode()返回值一样,这样两个不一样的对象有可能在一个哈希表里面呢得到的value都是一样的,就会error啦。

(小吐槽一下,为了规范肯定是要重写hashCode()的,但是有时候又觉得一个小项目里面如果没有写到继承的话,基本上很难出现hashCode()一样的情况吧,毕竟没有写父类的话内容基本还是不一样的,对于我这种只有几个类的作业,我觉得其实不写也不会错,但是为了规范还是老老实实写吧,而且还有lombok,i了i了)

说起lombok,那就要说起我从发现有这么个插件的时候,就放弃了自己写的想法,毕竟这东西又多又重复。但是每次用新东西的时候不出一点bug总是不可能的。

lombok使用

我是在IDE里面使用lombok的,安装起来还是蛮简单的,market里面直接搜索一下,install一下OK。比较无语的是后面了,所有的lombok的教程里面都会告诉你去pom.xml文件里面去添加依赖,但是说实话,我第一次写Java的项目,以前最多看看代码,简单了解一点语法,我压根不知道pom.xml是什么啊……在我随便创建的一个Java项目里面找了一下,没看到这个文件,于是更加郁闷……上网查才知道(依然不知道理解的是否准确),是需要在marven的框架里面才有这个文件,遂右击项目名,改变到marven框架解决问题。添加marven框架

在这之后就是在pom.xml文件里面添加依赖了,网上绝大部分依旧语焉不详,都说一句复制一段话上去……对于新手还是太不友好了,我改完之后的pom.xml文件如下所示:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

groupId

grammar

1.0-SNAPSHOT

org.projectlombok

lombok

1.18.12

建议一步一步打,这样可以有完整的提示,不过可能会有输入了之后会要等一会儿的可能,就算你已经install了lombok依旧会有版本问题……所以输入之后耐心等待,可以看到IDE下方会提示后台有进程在下载文件,打开看看直到下载完全OK即可。

至于具体@Data,@EqualsAndHashCode还是@什么,需要的时候查一查文档就好了。

hashCode()栈溢出

如果到这里就完了的话,我也不会说用新东西总会有bug了,我的项目中其中一个类如下所示:

public class terminator {

String val;

Vector FIRST_SET;

public boolean isterm;

}

terminator类里面还有一个关于terminator的Vector,于是在使用@EqualsAndHashCode时候出现了循环调用导致的stackoverflow,依旧是希望上网查一下有什么现成的解决方案,但是这种bug我自在CSDN上看到了一例,还没有什么明确的解决方法,或许这样的类不适合用lombok生成hashCode()吧,但是我需要用啊,解决问题我又两种思路,一是避免出现terminator的数组,二是自己手动你重写equals()和hashCode()方法,最终我才用的是后者,因为我写的项目中,对于terminator这个类,如果val一样的话,就是一样的,如果FIRST_SET不一样,可能只是因为还没来得及求之类的问题。所以对于我来说我只需要求一个就好了。

(写到这里忽然想到,这个类设计的是不是冗余比较大……)

最后解决问题~

一些小学习

对Java的整体框架算是更佳了解了,比之前只看w3c之类的好多了,java的语法糖还是挺好用的。不过让我感觉和C#,C++都不一样的除了前面的==和equals之外,还有Integer和int,Boolean和boolean等等了吧……

nice, first blog finished.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值