【Java】知识点汇总(2)
创始人
2024-06-02 13:34:12
0

书接上一回,为了方便日后汇总序号也将从上一篇延续下去。

7. for与foreach使用比较

结论
  • for适用于下标循环;
  • foreach采用的是迭代器循环;
  • 在ArrayList的情况下for优势明显;
  • 在LinkedArrayList的情况下foreach优势明显;
分析
  • 由于for采用的是下标的循环方式,因此属于随机读取,我可以通过下标读取任意下标对应的值,但是这种方式也存在一些问题,譬如通过循环删除集合中的元素时就会抛出下标越界的问题。
  • 而foreach采用的是顺序读取的数据结构格式,可以通过iterater(迭代器)来遍历集合,这个时候由于没有下标什么事了,因此也不会影响到集合遍历删除,但是这种方式没有办法删除指定的对象。

8. 当前线程被锁定时用wait代替sleep

结论

当前线程被锁定时调用Thread.sleep,则可能导致性能和可伸缩性问题,更有甚者可能会出现死锁的情况,这是因为持有锁的线程执行被冻结。

所以在这种情况下使用wait方法代替,以临时释放锁并允许其他线程运行。

分析

Thread.sleep与wait的区别:

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu中其他线程,但是它的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。

9. 不要直接使用URL类操作

结论

请不要直接使用java.net.URL来进行操作了,我建议在实际需要访问资源时可以使用URI.toURL方法将URI转换为URL。

分析

java.net.URL的equals和hashCode方法都可以触发名称服务(通常是DNS)查找来解析主机名或IP地址。
根据配置和网络状态,可能需要很长时间。 另一方面,URI不进行此类调用因此应该使用它,除非需要特定的URL功能。

10. Long和String的比较判断

曾经在一个编码不规范的项目中发现主表字段id为bigint类型,子表中对应字段为逻辑外键且数据类型为varchar类型的存在。由于数据库没有强制外键关联,因此没有在数据库层面进行校验。从而导致了在Java实体中主表实体id的数据类型为Long,而子表实体中该id对应的数据类型为String。
在Java中Long类型是存在equals判断的,有很多小伙伴在修改代码时只关注字段名称而忽略数据类型时,就会出现以下写法:

// 伪代码
if(Long.equals(String)){...
}

不幸的是在IDE中这种写法是不会抛出错误提示的,而实际上在编译器层面上也是可以编译通过的。
但是在实际操作上数据在判断时会判false,因为equals方法是不会类型转换的,因此两个数据类型不同的情况下是无法进行判断的。
万一真的不幸在工作过程中遇到这种情况,不想改祖传代码的情况下最低成本的修改方式是:

if(String.valueOf(Long).equals(String)){...
}

先用String.valueOf转换成String再做比较。反之若要判断大小,则将String转换为Long之后再做比较。

11. ResultSet循环取值不能用isLast方法

会有人使用isLast方法来判断是否最后一行的吗?
在 Java 的 ResultSet 中,isLast() 方法用于判断当前 ResultSet 是否指向结果集的最后一行。虽然这个方法在某些情况下可以使用,但是不建议在实际开发中使用它,主要有以下两个原因:

  1. 不同数据库的实现不同

不同的数据库实现中对 isLast() 方法的支持情况可能不同。有些数据库可能无法直接确定 ResultSet 的最后一行,因此对于这些数据库,isLast() 方法的实现可能需要遍历整个结果集。这会导致性能问题,因为遍历整个结果集需要大量的时间和资源。此外,由于不同数据库对 isLast() 方法的实现可能不同,因此在不同的数据库之间移植代码时可能会出现问题。

  1. 结果集的变化

在某些情况下,如果结果集在检索期间发生了变化,isLast() 方法的结果可能会出现问题。例如,如果在检索期间插入或删除了行,则结果集中的行数会发生变化。这可能会导致 isLast() 方法的结果不正确,因为结果集中的最后一行可能已经不是原来的最后一行了。
因此建议大家不要用isLast方法了,用next来代替吧:

stmt.executeQuery("SELECT name, address FROM PERSON"); 
ResultSet rs = stmt.getResultSet(); 
while (! rs.isLast()) { // Noncompliant 
// process row 
} 

改为

ResultSet rs = stmt.executeQuery("SELECT name, address FROM PERSON"); 
while (! rs.next()) { 
// process row 
}

12. 关于Long的原子性操作推荐使用LongAdder

LongAdder和AtomicLong都是用于实现原子更新长整型数据的类。LongAdder和AtomicLong的主要区别在于它们对高并发环境下的性能表现不同。

AtomicLong的性能在低并发环境下非常好,但在高并发环境下,因为所有线程都需要竞争同一个内部变量的更新,因此可能会导致性能瓶颈。

相比之下,LongAdder的性能在高并发环境下更好。

LongAdder的内部实现是基于分段锁的思想,它将内部状态分成了多个变量,每个变量独立地累加值。这些变量被称为“单元”,每个单元都有一个独立的计数器。当多个线程同时更新时,它们可以分别更新不同的单元,从而减少了线程之间的竞争。

LongAdder中有两个关键的成员变量:base和cells。base是一个长整型变量,表示所有单元的总和。cells是一个数组,每个元素都是一个单元,表示独立的计数器。在初始化时,LongAdder只有一个单元,即base,它的值为0。当有多个线程更新计数器时,LongAdder会根据需要动态地增加单元的数量。

更新单元时,LongAdder会使用分段锁来避免竞争。分段锁将内部状态分成了多个部分,每个部分都有一个独立的锁,因此多个线程可以同时更新不同的部分,从而提高了并发性能。

在更新单元时,LongAdder使用ThreadLocalRandom来选择要更新的单元,以减少线程之间的竞争。具体来说,它使用线程本地的随机数生成器来选择要更新的单元,而不是简单地采用轮询或其他策略。

在获取当前值时,LongAdder将所有单元的值相加,得到总和。如果存在多个单元,则需要获取它们的值并加上base的值。由于单元数量可能会动态变化,因此在计算总和时需要特殊处理。

LongAdder的内部实现基于分段锁和ThreadLocalRandom,它将内部状态分成了多个部分,每个部分有一个独立的计数器和锁,在高并发情况下,这种分离状态的方式可以更好地利用多核处理器的性能。

坦白说,如果你需要在高并发环境下进行原子长整型的累加操作,那么使用LongAdder比AtomicLong更有可能提高程序的性能。

相关内容

热门资讯

小仓鼠在笼子里一动不动的是怎么... 小仓鼠在笼子里一动不动的是怎么回事?小仓鼠应该是生病了,建议尽快处理,找兽医看看,他们最专业。目前应...
扬州何园的寻访感受 扬州何园的寻访感受 你好,请参考: 初见何园,似乎有种似曾相识的感觉,或许意识到这种想...
童年傻事作文---速来 童年傻事作文---速来童年傻事 童年是多么美好,童年的生活令人向往,童年的天空总是那么蓝,而童...
家庭幽默大赛老韩头一家幽默服装... 家庭幽默大赛老韩头一家幽默服装秀家庭幽默大赛老韩头一家幽默服装秀这都被他看出来了  今天晒内裤了,室...
乐器名称 乐器名称我在小提琴协奏曲《梁祝》的视频里这种乐器不知叫什么名字,请懂音乐和乐器的朋友给予解答,谢谢。...
电视剧《老马家的幸福往事》中的... 电视剧《老马家的幸福往事》中的马鸣和徐丽娜在马鸣的大学里的图书馆里偷书时用留声机听的歌是什么名字的请...
流鬼的介绍 流鬼的介绍 流鬼,是古代民族,分布在今俄罗斯勘察加半岛,有数万人。
请问为爱所困火吗 请问为爱所困火吗一般般。爱情偶像剧。此剧上一年开播,还上了微博热搜榜我认为很火,为爱所困第二部还有不...
什么是手诊 什么是手诊手诊的概念就是指通过人体手的纹路形态、变化、规律等方式,对人体器官的演变作出推理的一种防治...
双子星公主法和希的有几集,第一... 双子星公主法和希的有几集,第一部第二部都要,如果知道第三部也透露一点,请求不要编,法和希最后怎样了拜...
王熙凤简介 王熙凤简介《红楼梦》中人物,贾琏之妻,王夫人的内侄女。长着一双丹凤三角眼,两弯柳叶吊梢眉,身量苗条,...
大学生应从哪些方面进行自我探索 大学生应从哪些方面进行自我探索兴趣、能力、价值观、性格,这四个是最主要的方面,其中价值观是核心
谁有好看的卡通人物的电脑背景! 谁有好看的卡通人物的电脑背景!卡通人物的背景要清色! 看得清 要男生的 我有Clannad主题...
幼儿园小班孩子座位固定好还是经... 幼儿园小班孩子座位固定好还是经常换好?我家孩子座位老换,我觉得不好,大家觉得呢?... 我家孩子座...
我的爸爸的作文 我的爸爸的作文我的父亲 人们常说父爱如山,可在我看来,我的父亲对我的爱,并非完全如山那样严峻,有时却...
潘朵拉之心第二季动漫什么时候出 潘朵拉之心第二季动漫什么时候出动画只出了第一季 没有要出第二季的消息 可能性估计很小目前漫画还在连载...
时不我待是什么意思 时不我待是什么意思时不我待的意思是时间不等待人,要抓紧时间,不要虚度光阴。出处:日月逝矣,岁不我与。...
葫芦小金刚里大娃怎么被抓的 葫芦小金刚里大娃怎么被抓的掉泥潭被捉的
有一部小说叫穿越千年来爱你还是... 有一部小说叫穿越千年来爱你还是什么的有一部小说叫穿越千年来爱你还是什么的内容讲的是一个女的在路上走着...
火影忍者力 米娜是红眼吗 火影忍者力 米娜是红眼吗红眼?首先这几集是原创,非岸本创作。在岸本的剧情结构里面只有木叶白眼、写轮眼...