Java编程思想(第四版)

基本类型   大小   最小值   最大值
boolean     -       -        -
char    16bits    0     (2^16)-1
byte       8bits    -128     127
short      16bits   -2^15   (2^15)-1
int        32bits   -2^31   (2^31)-1
long       64bits   -2^63   (2^63)-1
float      32bits   IEEE754  IEEE754
double     64bits   IEEE754  IEEE754
void       -          -         -


调用复杂对象构造器遵循下面顺序
1.在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零
2.调用基类构造器。从根类直到最后导出类(有静态变量和方法先初始化静态变量和静态方法)
3.按声明顺序调用成员的初始化方法。
4.调用导出类构造器的主体。






9.接口


包含抽象方法的类叫抽象类
接口中的任何域都自动是static和final的
接口可以嵌套类且为public和static




11.持有对象
List按插入顺序保存元素 Set不能有重复值 Queue只能从一端插入数据 按照排队规则来确定对象产生的顺序(通常与他们被插入的顺序相同)


Set-》
HashSet(快速查找,无序,添加),必须定义hashCode()
TreeSet(比较升序保存),必须实现Comparable接口
LinkedHashSet(链表顺序保存),必须定义hashCode()
Map-》
HashMap(快速查找,无序),
TreeMap(比较升序保存),
LinkedHashMap (顺序保存,快速查找)


List-》
ArrayList(随机访问快,插入删除慢)
LinkedList(随机访问慢,插入删除快)->Stack 栈 继承Queue可用于队列


对于正确的equals()方法必须满足:
1自反性:对任意想,x.equals(x)一定返回true
2对称性:对任意x和y如果y.equals(x)返回true,则x.equals(y)也返回true
3传递性:对任意x,y,z,如果有x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)一定返回true
4一致性:对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回的结果应该保持一致,要么一直是true,要么一直是false
5对任何不适null的x,x.equals(null)一定返回false


hashcode:
1.在一个Java应用的执行期间,如果一个对象提供给equals做比较的信息没有被修改的话,该对象多次调用hashCode()方法,该方法必须始终如一返回同一个integer。


2.如果两个对象根据equals(Object)方法是相等的,那么调用二者各自的hashCode()方法必须产生同一个integer结果


3.并不要求根据equals(java.lang.Object)方法不相等的两个对象,调用二者各自的hashCode()方法必须产生不同的integer结果。然而,程序员应该意识到对于不同的对象产生不同的integer结果,有可能会提高hash table的性能。
4.大量的实践表明,由Object类定义的hashCode()方法对于不同的对象返回不同的integer。


Java对象的eqauls方法和hashCode方法是这样规定的:


1、相等(相同)的对象必须具有相等的哈希码(或者散列码)。


2、如果两个对象的hashCode相同,它们并不一定相同。


hashCode理解
对象生成生成散列码,散列码不一定是唯一的,散列码一致对象不一定相同
用物理地址存储散列码,如果该地址有散列码则比较前后对象,可以实现快速查找


15.泛型方法
元组,可以存储多种类型的对象,可用于构建复杂模型,方法返回值等


static方法无法访问泛型类的类型参数,必须使其成为泛型方法


泛型类创建对象需要制定类型,泛型方法不用  “类型参数推断”


元组采用继承可以实现尽可能多的参数,fianl保证对象属性值不变


在泛型代码内部,无法获得任何有关泛型参数类型的信息,即ArrayList与linkedlist同为List  参数类型为泛型 在判断是无法获取详细参数类型
表示边界,即声明此泛型参数必须具有类型class或者从class导出的类型,才能调用class的方法


基本类型不能作为泛型类型参数


一个类不能实现同一个泛型接口的两种变体  由于擦除原因 会成为相同的接口


使用带有泛型类型参数的转型或instanceof不会有任何效果


不能对泛型容器直接转型 但是可以对容器元素转型,需要注解 


泛型不能重载(擦除原因)


18 Java I/O(装饰器模式)


InputStream   OutputStream  面向字节
Reader       Writer     面向字符


InputStream->AudioInputStream, ByteArrayInputStream, FileInputStream, 
FilterInputStream, ObjectInputStream, PipedInputStream, SequenceInputStream
OutputStream->ByteArrayOutputStream, FileOutputStream, FilterOutputStream, 
ObjectOutputStream, OutputStream, PipedOutputStream


Reader->BufferedReader, CharArrayReader, FilterReader, 
InputStreamReader, PipedReader, StringReader 


Writer->BufferedWriter, CharArrayWriter, FilterWriter, 
OutputStreamWriter, PipedWriter, PrintWriter, StringWriter 


Stream->StreamReader/StreamWriter->FileInputStream/FileOutputStream->BufferedReader/BufferedWriter





复制文件
public static void main(String[] args) throws IOException {
File copy = new File("F://copy.txt");
if (copy.exists() == false) {
if (copy.createNewFile()) {
//BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("F://test.txt")));
//BufferedReader br = new BufferedReader(new FileReader("F://test.txt"));
//BufferedWriter bw = new BufferedWriter(new FileWriter(copy));
//BufferedWriter br = new //BufferedWriter (new OutputStreamWriter(new FileOutputStream(copy)));
PrintWriter bw = new PrintWriter(new FileOutputStream(copy));
String s;
while ((s = br.readLine()) != null) {
bw.println(s);
}
bw.println("(copy)");
br.close();
bw.close();
}
}
}


Serializable接口可以序列化类,用objectinputstream和objectoutputstream传输,用关键字transient标志属性可以使该值不被序列化,即发送端不会序列化该属性值,接收端接收不到该属性值
Externalizable接口不会序列化对象


19.枚举类型



调用values()方法返回enum实例数组,保持声明时的顺序
实现枚举分类
使用interface 接口名{
enum 枚举名 implements 接口名{
枚举参数1,枚举参数2...
}
}
枚举的枚举:
enum 类名{
枚举参数1(枚举类型.class);
枚举参数2(枚举类型.class);
...
}


20.注解


@Target用来定义你的注解将应用于什么地方如方法或者域
@Rectention用来定义该注解在哪个级别可用,如源码(SOURCE)、类文件(CLASS)、运行时(RUNTIME)
没有元素的注解为标记注解


注解元素可用的类型:
所有基本类型(int,float,boolean等)
String,Class,enum,Annotation,以上类型的数组
其他类型编译器会报错
元素必须要么有默认值,要么在使用注解时提供元素的值
非基本类型的元素不能为null
注解不支持继承
apt注解处理器








21并发


Thread.yield():线程调度器,可以将CPU从一个线程转移给另一个线程(选择性)


Executor 管理Thread对象  shutdown()防止新任务提交给executorservice


CachedThreadPool  缓存线程池


FixedThreadPool  指定线程池数量


SingleThreadExecutor  单线程池相当于线程数量为1的FixedThreadPool


Runnable  没有返回值的线程接口,接口方法run()


Callable   有返回值的线程接口,接口方法call() submit()返回一个Future对象,用isDone()判断Future是否完成,用get()获取Future值


后台线程daemon,在线程启动之前调用serDaemon()方法,设置该线程为后台线程,当主线程终止时,后台线程会被终止


join()等待该线程终止,可以设定最长时间毫秒单位


synchronized锁  当有任务1访问该方法时,其他任务不能访问,当任务1同时访问多个synchronized方法时,锁的数量为访问方法数量,当锁数量为0时,其他任务才能访问锁方法


显式的Lock对象
Lock lock = new ReentrantLock();
lock.lock();  lock.unlock();.


线程的4种状态:
1新建(new)分配系统资源,初始化,有资格获得CPU时间
2就绪(Runnable)只需调度器分配到CPU时间即可运行,或等待调度器给予CPU时间,可运行可不运行
3阻塞(Blocked)能运行,或有条件阻止其运行,调度器忽略它,不会分配CPU时间,知道它重新进入就绪状态
4死亡(Dead)不可调度,不会得到CPU时间,



任务死亡的通常方式是从run()返回,但是任务的线程还可以被中断。


阻塞状态:
sleep()
wait()可用notify()或notifyAll()解开或者signal()、signalAll()
等待输入/输出
使用某个同步控制方法,但是对象锁不可用


wait()与sleep()有时间参数比较
1.在wait()期间对象锁死释放的
2.可以通过notify()、notifyAll(),或者令时间到期,从wait()中恢复执行


死锁发生条件:


1.互斥条件。任务使用的资源中至少有一个是不能共享的。
2.至少有一个任务他必须持有一个资源且正在等待获取一个当前被别的任务持有的资源。
3.资源不能被任务抢占,任务必须把资源释放当作普通时间。
4.必须有循环等待,这时,一个任务等待其他任务所持有的资源,后者又在等待另一个任务所持有的资源,这样一直下去,只有有一个任务在等待第一个任务所持有的资源,使得大家都被锁住。
进阶读物  《Java Concurrency in Practice》


























































你可能感兴趣的:(Java)