Java基础

1. Java中的关键字Synchronized

它用来修饰一个方法或者一个代码块的时候,能够保证在同一个时刻最多只有一个线程在执行该代码,实现了方法或代码块的线程同步。

它与lock比较:

lock是一个接口,Synchronized是Java中关键字.

Synchronized是内置的语言实现的,当Synchronized发生异常的时候,会自动释放线程占有的锁,不会导致死锁情况的发生;而lock在发生异常的时候,如果没有主动的释放锁,此时很可能造成死锁,因此在使用lock的时候需要在finally块中释放锁。

lock可以让等待锁的线程响应中断,Synchronized不行,使用Synchronized时,等待的线程会一直等待下去。

通过lock可以知道有没有成功获取锁,而Synchronized却无法知道。

如果用Synchronized修饰一个静态方法,锁住了什么?修饰成员方法,又锁住了什么?

修饰静态方法以及同步代码块时,该用法锁住的是类,线程若想执行对应的代码,必须先获得类锁。

修饰成员方法时,线程获取的是当前调用该方法的对象实例的对象锁。

Volatile:它和Synchronized都是Java实现线程同步的关键字,但是Volatile可以使得线程对变量的修改可以立刻被其他线程感知,从而不会出现数据脏读的现象,保证了数据的可见性。

2. Static和Final

·static

静态变量

静态方法

静态语句块

static{...}静态语句块在类初始化时运行一次。

静态内部类

非静态内部类依赖于外部类的实例,也就是说需要先创建外部类实例,才能用这个实例去创建非静态内部类。而静态内部类不需要,可以直接创建。但是静态内部类不能访问外部类的非静态的变量和方法。

静态导包  import static com.xxx.ClassName.*

在使用静态变量和方法时不用再指明 ClassName,直接使用类里面的方法,从而简化代码,但可读性大大降低。

初始化顺序

静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。

 

 

 

·final

当final修饰一个方法时,表明该方法不能在它的继承类中重写;当final修饰一个类时,表明这个类不会被其他的类继承(此时,final类中的所有成员方法都会被隐式地指定为final方法);当finally修饰基本数据类型变量时,则数值一旦被初始化之后便不能再修改了,如果修饰的是引用类型的变量,则在初始化之后,便不能再指向其他的对象。

使用final主要的原因就是把方法锁定,防止任何继承类想要修改它的含义。

3. HashCode()

hashCode() 返回哈希值,而 equals() 是用来判断两个对象是否等价。等价的两个对象散列值一定相同,但是散列值相同的两个对象不一定等价,这是因为计算哈希值具有随机性,两个值不同的对象可能计算出相同的哈希值。HashSet 和 HashMap 等集合类使用了 hashCode() 方法来计算对象应该存储的位置,因此要将对象添加到这些集合类中,需要让对应的类实现 hashCode() 方法。

Java集合类中的基本接口有:Set、List、Map。

Collection:代表一组对象,每个对象都是它的子元素。

Set:不包含重复元素的Collection

List:有顺序的Collection,可以包含重复元素

Map:可以把键映射到值的对象,键不能重复。

4. map的分类和常见的情况

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap。

 

 TreeMap:基于红黑树实现

HashMap、HashTable:基于哈希表实现

LinkedHashMap:使用双向链表来维护元素的顺序

       Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

       Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

        LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

       TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

       一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列。

 

 

Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: ErrorException。其中 Error 用来表示 JVM 无法处理的错误,Exception 分为两种:

  • 受检异常 :需要用 try...catch... 语句捕获并进行处理,并且可以从异常中恢复;
  • 非受检异常 :是程序运行时错误,例如除 0 会引发 Arithmetic Exception,此时程序崩溃并且无法恢复。
posted @ 2021-03-12 13:14  Ayeah~夭夭  阅读(59)  评论(0编辑  收藏  举报