当前位置: 代码迷 >> 综合 >> Java基础进阶-8-同步化+hashCode
  详细解决方案

Java基础进阶-8-同步化+hashCode

热度:90   发布时间:2023-10-09 04:49:49.0

目录

1、Socket连接服务器

2、Thread对象可以重复使用吗?

3、对象的锁

4、Synchronized同步化

5、集合

6、hashCode()与 equals()的相关规定

7、万能字符  ?

8、为什么要在乎String的不变性?


1、Socket连接服务器

Java基础进阶-8-同步化+hashCode

2、Thread对象可以重复使用吗?

不能,一旦线程的run()方法完成之后,该线程就不能重新启动了。其实它已经死翘翘了。Thread对象可能还呆在堆上,如同活着的对象一般还能接受某些方法的调用,但已经永远地失去了线程的执行性,只剩下对象本身了。

3、对象的锁

每个对象都有个锁。大部分时间都没有锁上。对象的锁只会在有同步化方法(Synchronized)上起作用。当一个对象有一个或者多个同步化方法时,线程只有在取的对象锁的钥匙的时候才能进入同步化方法。

锁不是配在方法上的,是配在对象上的。如果一个对象有两个同步化方法a、b,就表示两个线程无法进入到同一个方法a中,这两个线程也无法同时进入的两个不同的方法中a或者b。因为只有一把钥匙。

如果有多个方法都能修改一个对象的实例变量,那么这些方法都应该加上锁。

4、Synchronized同步化

同步化是有代价的,首先进入同步化的方法需要查询钥匙,带来性能的消耗。

其次,同步化方法会强制后面的线程进行排队等待,导致时间成本增加。

最后,就是同步化方法可能导致死锁。

5、集合

  • TreeSet:以有序的状态保持,并可防止重复。
  • HashMap:对成对的数据进行存取;
  • LinkedList:针对经常插入或者删除中间元素所设计的高效率集合;
  • HashSet:防止重复的集合,可快速地寻找到相符合的元素。
  • LinkedHashMap:类似HashMap,但可记住元素插入的顺序,也可以设定成依照元素上次存取的先后来排序。

注意:LinkedList对于中间元素的插入和删除会比较块,但对大多数的应用程序而言,ArrayList与LinkedList的差异有限,除非元素的数量真的很大。

6、hashCode()与 equals()的相关规定

API文件有对对象的状态制定出必须遵守的规则:

  1. 如果两个对象相等,则hashcode必须相等;
  2. 如果两个对象有相同的hashcode值,但这两个对象不一定相等。当若两个对象相等,则hashcode值一定相等;
  3. 因此若重写了equals()方法,hashCode()方法也要重写;
  4. hashCode()的默认行为是对在heap上的对象产生独特的值。如果你没有重写过hashCode(),则一个class的两个对象怎样都不会相同;
  5. equals()的默认行为是执行==的比较。也就是说会去测试两个引用是否是heap上的同一个对象。如果equals()没有被重写过,那么一个class的两个对象永远不会相等。

7、万能字符  ?

万能字符? 可以帮我们创建出接受任何父类的子类的范型参数。

Java基础进阶-8-同步化+hashCode

Java基础进阶-8-同步化+hashCode

8、为什么要在乎String的不变性?

当程序越来越大时,不可避免会有很多String对象。为了安全性和节省空间,String被设计为了不可变的。

Java基础进阶-8-同步化+hashCode

如上面的代码,实际上我们创建了10个String对象。分别是:0、01、012、0123.....

创建新的String时,Java虚拟机会把String对象放在一个“String Pool”的特殊存储区中。如果出现同值的String对象,Java虚拟机不会重复创建String,只会引用已经存在者。这是因为String是不可变的,引用变量无法改变其他参考变量引用到同一个String值。

为了不浪费空间,可以使用StringBuilder来改进上面的for循环。

 

 

 

 

 

 

 

 

  相关解决方案