Java 基础(二)
toString () :使用 System.out.println() 方法时,调用对象的 toString() 。可以重写 toString() 。
== , equals 和 hashcode : 只有当两个引用都引用相同的对象时, == 才计算为 true 。 equals 默认使用 == 运算符比较。可以重写 equals 方法,比较两个对象内容是否相同。如果使类对象作为散列表中的键,必须重写 equals ,重写函数签名必须为: public boolean equals(Object o) 。 equals 的约定:自反性,对称性,可传递性,一致性。 x.equals(null) 返回 false 。
Object 类中的默认散列码总是为每个对象产生一个唯一号。
equals 和 hashcode 的约定:如果两个对象 equals ,他们必须具有相同的 hashcode ; hashcode 相同,对象不一定 equals ;对象不 equals , hashcode 不一定不同。搜索比较时首先使用 hashcode() ,然后使用 equals 检索正确的元素 , 只有当 hashcode 相同, equals 返回 true ,两个对象才能看成完全相同。 transient 标识的属性最好不要用来确定对象的散列码或相等性。
集合
两种顺序: Sorted 顺序,类实现 Compareable 接口定义的顺序或 Comparator 定义的顺序。
Ordered 顺序:可以按照特定顺序遍历集合。通过索引或者插入顺序访问。
List : 提供与索引相关的方法。按照索引位置排序,没有 Sorted 顺序。
ArrayList :提供快速遍历和快速随机访问。适用:要快速遍历但是不做大量的插入和删除时。非线程同步。
Vector :基本上和 ArrayList 同,线程同步。
LinkedList :元素之间是双链接,容易被选择设计栈和队列。元素遍历比较慢,可以快速插入和删除。实现 Queue 接口,支持 peek() , poll() , offer() 方法。
Set : 不允许重复
HashSet :非 Sorted ,非 Ordered 。
LinkedHashSet :非 Sorted , Ordered 。可以按照元素的插入顺序遍历它们。
TreeSet : Sorted ,非 Ordered ;将元素按照自然顺序升序排序;可以选择一个带构造函数的 TreeSet ,通过 Comparable 或者 Comparator 为集合提供自己的规则。
Map : 键值对,键惟一。
HashMap :非 Sorted ,非 Ordered 。允许一个集合中有一个 null 键和多个 null 值。非线程安全
Hashtable : HashMap 的同步版本。线程安全,不允许任何内容为 null 。
LinkedHashMap :非 Sorted , Ordered 。
TreeMap : Sorted ,非 Ordered 。
Queue:
PriorityQueue: 按照自然顺序或 Comparator 进行排序的。
排序集合和数组
使用 Collections.sort 和 Arrays.sort 对集合和数组进行排序。排序的对象需要 implement Comparable 接口中的 compareTo 方法,方法返回负数, 0 ,正数。
[Collections/Arrays].sort 的重载版本:接受 Comparator 的实现类,自定义排序方法。
对于基本类型, Arrays 始终使用自然顺序进行排序。
搜索集合和数组
binarySerach 返回值:成功返回值的 int 索引,不成功返回 int 索引标识插入点 = ( - 插入点) -1 )。
搜索的集合或者数组必须在搜索之前进行排序,否则返回结果不可预测。排序顺序和搜索的顺序必须是同一个顺序。
Arrays 和 Lists 之间进行转换
Arrays.asList :返回数组支持的固定大小的 list 。对 list 的操作更新到数组中。
泛型:
(1) 泛型使编译器强加类型安全,只在编译时保护,在运行时不会存在。
(2) 非泛型集合可以容纳任何非基本类型的任何对象,获取对象时只返回 Object 。混合泛型和非泛型集合会产生编译警告。
(3) 泛型集合元素赋值:集合元素可以是泛型类型的子类。
(4) 泛型集合赋值:多态适用于“基本”类型,不适用于泛型类型。泛型类型必须严格相同。通配符 <?extends Parents> , <? super Child> 可以实现多态赋值。 .<?> 完全等同于 <? extends Ojbect> 。集合参数类型为 <? extends Parents> 或 <?> 时,不能对集合 add 。通配符只针对声明使用。
(5) 使用泛型声明来创建泛型类和泛型方法。
内部类:
四种类型:静态内部类,实例内部类,方法内部类,匿名类。
实例内部类:
(1) 类内部没有 static 声明 , 可以访问外部类内部任何成员
(2) 在外部类外部,通过外部类的实例实例化内部类;在外部类里面,可以直接使用内部类类名实例化。
(3) 内部类内部使用 this 指内部类的实例,使用 Outer.this 引用外部类实例。
(4) 内部类修饰符:访问修饰符 public , protected , private , final , abstract , strictfp
方法本地内部类:
(1) 方法里面声明的类。只能在方法内部使用
(2) 只能引用方法内部 final 声明的变量。
(3) 不能标识方法内部类用访问修饰符, static 。只可以使用 abstract 和 final
匿名内部类:
一般用来产生一个类或接口的匿名类对象。可以在任何使用对象的地方使用匿名内部类来赋值。
静态内部类:
(1) 类内部声明为 static 的内部类。
(2) 不需要外部类的实例即可创建静态内部类实例。
(3) 不能访问外部类的非静态成员。因为没有外部实例的隐含引用。
线程
(1) 定义线程:两种方法, extends Thread , implements Runnable
(2) 实例化线程: new MyThread(); new Thread(new MyRunnable()); new Thread(new MyThread());
(3) 启动线程: t.start(); 线程启动后,同一个实例不能再次 start 。
(4) 线程状态:新,死,运行,就绪,阻塞。
(5)sleep 后只能回到就绪状态,等待调度。它是一个 static 方法。
(6) 线程优先级:数字越大优先级越高。 yield 方法让线程从运行状态到就绪状态。
(7)join : t.join() 让当前调用线程加到 t 线程的尾部,等待 t 线程结束后才可以运行。
线程离开运行状态的方法: yield , join , sleep , run 完成, wait , synchronized 阻塞,被线程调度程度转换成就绪状态。
(8)synchronized :线程在执行 synchrnoized 时需要获取对象的锁,执行完 synchrnoized 之后会自动释放锁,在释放锁之前任何别的线程不获取该对象的锁定。 Sleep 不释放锁。
Public synchronized void doStuff(){System.out.println(“test”);} 等价于:
Public void doStuff(){synchronized(this){ System.out.println(“test”);}}
Public static synchronized int getCount(){return count} 等价于
Public static int getCount(){synchronized(MyClass.class){return count;}}
(9) 线程死锁:获取两个或者以上的资源,获取资源的顺序不定,两个以上的线程。可以通过使用按照一定的顺序获取资源来避免死锁。
(10)wait , notify , notifyAll ,必须在 synchronized context 中,否则抛出 RuntimeException 。每个对象都有一个等待列表,等待来自该对象的信号。线程执行 wait 的时候,线程从运行状态进入阻塞状态,在对象的等待队列中加上该线程,在对象上执行 notify 的时候,从对象的阻塞队列中唤醒一个线程进入就绪状态, notifyAll 唤醒对象阻塞队列上的所有线程。