java-学习笔记

来源:互联网 发布:如何整理mac桌面图标 编辑:程序博客网 时间:2024/05/03 09:53

#1.How do I know when to use an interface and when to use an abstract class?

If (almost)all classes implementing the behavior wouldhave the same code, then you can use 

an abstract class to implement it.Avoid repeating code with abstract classes.

#2.线程和进程

2.1为什么要引入线程和进程?

进程:为了使多个程序并发执行,以改善资源利用率及提高系统的吞吐量;

线程:为了减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性

2.2区分:

进程从来不执行任何东西,它只是线程的容器;每个程序至少包含一个线程,那就是主线程。

习惯上也称线程为轻量级进程(1ightweight process,LWP),进程则被称为重量级进程(heavyweightprocess,HWP)

线程为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位。

#3让工具类不可被实例化

private Math(){

throw new Error("我不能被实例化!");

}

#4 java字符池(池的概念,无处不在的!)

考虑到在一个系统中会使用到大量的String对象,所以java提供了字符池,String str="abc",执行这句话时,会先去“字符数据池”搜索时候有“abc”这个字符串,如果有,则将字符串的首地址赋值给str,如果没有,生成一个新的字符串“abc”并且将首地址赋值给str;

String str=new String("abc"),执行这句话时,不会考虑时候已经存在了“abc”这个字符串,而是直接生成一个新的字符串“abc”并将首地址赋值给str,注意“abc”并不放在“字符数据池”中;

由以上分析可知,String str="abc"和效率要高于String str=newString("abc"),因为如果有重复

的字符串时,第一种方式可以节省空间。

String a="abc";String b=new String("abc");syso(a==b.intern());

#6 String,StringBuffer与StringBuilder

6.1String str="123"  str=str+"456"与StringBuffer sb=new StringBuffer("123"); sb.append("456");的区别

str初始时是对"123"的引用,经过+之后,修改为对"123456"的引用,但是初始化的"123"对象没有改变,只是str指向了新的引用地址,而对sb来说,引用地址一直没变,只是值一直在改变。

6.2三者的应用场景

(1)String:声明字符串常量,当字符串不需要修改时使用。

(2)StringBuffer:需要频繁操作字符串,例如拼接,查找,替换等,并且在多线程环境下可以使用,常用于XML解析,Http参数的解析封装。

(3)StringBuilder:需要频繁操作字符串,例如拼接,查找,替换等,并且是在单线程环境下使用,常用于sql语句的拼接和json的封装。

#7.对象序列化机制是什么?为什么要进行对象序列化?

(1)目的:将对象变为实实在在数据,以便于传输;

(2)在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对

象的状态,重新创建该对象。

(3)总的来说,序列化,就是用实实在在的数据表示逻辑上的对象