2021-08-10

我这两天在Java开发时遇到的问题(1)

最近有个项目需要做一个登录功能,在简单策划后就开始了,期间碰到了好多的小问题,这也深深地提醒我,基础好了写代码会更胸有成竹。接下来看看吧!

一、equals与HashCode和==的关系

我们先说说这三个“东西”的简单概念吧!

==: 对于基本数据类型比较的是值,对于引用类则是引用比较。

equals: 默认比较的是引用,在被一些类(Integer、String等 )重写后就变成了值的比较。

hashcode: 该方法用于哈希查找,当类需要放在一些哈希结构的集合中时需要重载hashcode。

==与equals

先看看equals的源码:

public boolean equals(Object obj){
	return(this == obj);
}

equals的本质就是‘==’。可以理解为是同一个工种但是职能不一样罢了。你我都是建筑工人,你造桥我盖楼的关系。
前者比较引用,后者比较内容。

String s1 = "abc";
String s2 = s1;
String s3 = new String("abc");
String s4 = new String("abc");
String s5 = "abc";
System.out.println(s1 == s5); //true
System.out.println(s1 == s2); //true
System.out.println(s3 == s4); //false
System.out.println(s1.equals(s2)); //true
System.out.println(s3.equals(s4)); //true

通过这段测试代码可以看出==比较的是他的引用,s1和s5、s1和s2所对应的引用内容都是abc,所以是true。由于s3和s4分别重写,开辟出了新的 内存空间,所以引用不同了不能用引用比较。另外,String方法本身就重写了equals方法,所以equals比较的是s3和s4的值,为true。同理,s1和s2中的值也是相同的。

equals与hashcode

equals和hashcode的区别基本就在与性能和可靠性上了。咱们分开来说:
性能: equals方法重写后一般比较全面且复杂,所以效率会相对低一些,而hashcode只需要生成一个哈希值进行比较就可以了。在性能方面hashcode >> equals。

可靠性 hashcode并不一定完全可靠,因为不同对象生成的hashCode可能会相同,而相同对象生成的hashCode可能会不同。而equals对比是直接通过返回true和false实现的,所以会更可靠。equals相等的两个对象的hashcode一定相等,而hashcode相等的两个对象equals不一定相等。

阿里巴巴开发规范里写了:“重写equals时必须重写hashcode”。两者结合是最好的选择,hashcode可以很快的查到小内存块,而且如果先比较hashcode不同时就可以直接返回false了,大大提高了效率。既有equals保底又有hashcode发挥效率,一个效率高,一个踏实,各有分工,一起工作效率和安全性都可以保障。

总结: 我在写密码登录时刚开始用的是==比较,想的是把用户的密码直接当作字符串存了就好了,但是被批了一顿。有点难受,后来一想确实不对,就改成了new String了,把密码也new成对象,一来比变量安全,二来方便将来更改密码的操作。

二、String||StringBuffer||StringBuilder

String: 简单的在字符串操作。
StringBuffer: 线程安全的复杂字符串操作。
StringBuilder: 非线程安全的字符串操作。

String声明是不可变对象,所以每次操作都会产生新的String对象,指针指向新的String对象,这样内存空间利用率低下。相比较而言,StringBuffer和StringBuilder在操作时是针对原有字符串进行操作的,所以空间利用率高。在需要大量字符串操作时,建议使用StringBuffer和StringBuilder。

在实现一个系统的登陆密码修改功能时我用了String方法,原因是密码操作相对较少,而且可以在找回密码时添加“请输入使用过的密码”的功能,仍然把之前用过的密码存在数据库当中,不需要重置修改、等操作。(仅为个人想法,应用在简单的小系统开发确实可行,大型的请另寻出路)。

StringBuffer和StringBuilder的区别在于是否线程安全,StringBuilder虽然非线程安全但是性能却高于StringBuffer。StringBuffer线程安全,故适用于多线程复杂字符串的操作。

建议: 需要字符串操作时,尽量少使用String,毕竟效率有点低,可能会卡,不流畅。单线程和多线程就分别使用StringBuillder和StringBuffer吧,记住不要用错,会出问题的。

总结: 这部分其实没有太大的疑问,之前就被告知要多线程的,就直接用了StringBuffer了。其实当时老师还说加一个保护密码的实现,想了半天也不知道用什么合适一些,才疏学浅,老师还说“先按你自己的方法来写,写完我再告诉你哪里不对”,哈哈哈哈好老师,实践出真知。最后我就打算用StringBuffer的字符串反转功能,设置密码时将设置的密码反转存放哈哈哈哈我也真是个鬼才。登录时输入密码了也是反转再对比哈哈哈哈鬼才,虽然到时候可能会被批但是还是很开心的写完了。

未完,过两天可能还有问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值