1、字符串的不可变性
String s="abcd";
s=s.concat("ef");
2、e'quals()和hashcode() contract
hashcode()旨在提高性能;
equals()和hasCode()之间的契约是:
- 如果两个对象相等,则它们必须具有相同的散列码。
- 如果两个对象具有相同的哈希码,则它们可能相等,也可能不相等。
散列的价值在于速度。
假如键没有按照一定的顺序进行保存,那么查询的时候就只能按照顺序进行线性查询,然而,线性查询是最慢的查询方式。所以,将键值按照一定的顺序排序,并且使用二分查找能购有效的提升速度。散列在此之上,更近一步,他将键保存在数组中(数组的查询速度最快),用数组来表示键的信息,但是由于Map的容量是可变的,而数组的容量是不变的。要解决这个问题,数组中存的并不是键本身,而是键对象生成的一个数字,将其作为数组的下标,这个数字就是散列码。
3、java异常类层次结构
红色被检查的异常必须在方法的子句中被捕获或者生命
4、集合框架类
5、java同步
同步的意思可以用一个建筑的类来说明
Java编程语言中提供了两种基本的同步用语:同步方法和同步语句。同步语句相对而言更为复杂一些,我们将在下一小节中进行描述。本节重点讨论同步方法。
我们只需要在声明方法的时候增加关键字synchronized即可:
- public class SynchronizedCounter {
- private int c = 0;
- public synchronized void increment() {
- c++;
- }
- public synchronized void decrement() {
- c--;
- }
- public synchronized int value() {
- return c;
- }
- }
c1和c2,这两个变量绝不会一起使用。所有对这两个变量的更新都需要进行同步。但是没有理由阻止对c1的更新和对c2的更新出现交错——这样做会创建不必要的阻塞,进而降低并发性。此时,我们没有使用同步方法或者使用和this相关的锁,而是创建了两个单独的对象来提供锁。
- public class MsLunch {
- private long c1 = 0;
- private long c2 = 0;
- private Object lock1 = new Object();
- private Object lock2 = new Object();
- public void inc1() {
- synchronized(lock1) {
- c1++;
- }
- }
- public void inc2() {
- synchronized(lock2) {
- c2++;
- }
- }
- }
6、别名
别名意味着可以更新的位置有多个别名,并且这些别名具有不同的类型。
别名现象:是java操作对象的一种基本方式,当对引用型变量进行赋值操作时,可能出现别名现象,两个引用变量共同指向同一个对象,当一个引用对对象进行改变时,另一个引用变量的对象值也跟着改变
7、对战和堆
此图显示了方法和对象在运行时内存中的位置。
8、java jvm在运行时的数据区
此图显示了整个JVM运行时数据区域。