目录
1、Socket连接服务器
2、Thread对象可以重复使用吗?
3、对象的锁
4、Synchronized同步化
5、集合
6、hashCode()与 equals()的相关规定
7、万能字符 ?
8、为什么要在乎String的不变性?
1、Socket连接服务器
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文件有对对象的状态制定出必须遵守的规则:
- 如果两个对象相等,则hashcode必须相等;
- 如果两个对象有相同的hashcode值,但这两个对象不一定相等。当若两个对象相等,则hashcode值一定相等;
- 因此若重写了equals()方法,hashCode()方法也要重写;
- hashCode()的默认行为是对在heap上的对象产生独特的值。如果你没有重写过hashCode(),则一个class的两个对象怎样都不会相同;
- equals()的默认行为是执行==的比较。也就是说会去测试两个引用是否是heap上的同一个对象。如果equals()没有被重写过,那么一个class的两个对象永远不会相等。
7、万能字符 ?
万能字符? 可以帮我们创建出接受任何父类的子类的范型参数。
8、为什么要在乎String的不变性?
当程序越来越大时,不可避免会有很多String对象。为了安全性和节省空间,String被设计为了不可变的。
如上面的代码,实际上我们创建了10个String对象。分别是:0、01、012、0123.....
创建新的String时,Java虚拟机会把String对象放在一个“String Pool”的特殊存储区中。如果出现同值的String对象,Java虚拟机不会重复创建String,只会引用已经存在者。这是因为String是不可变的,引用变量无法改变其他参考变量引用到同一个String值。
为了不浪费空间,可以使用StringBuilder来改进上面的for循环。