深复制:所有基本数据类型的赋值 Object.clone()、String
浅复制:引用数据类型的赋值,对于数组本身的复制是深复制,但是对于数组的每一个元素是浅复制。
策略模式Comparator接口/*指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。通过将不同的算法独立实现,并使他们之间可互相替换,从而使算法的变化独立于使用算法的客户*/ 比较常用
Array.sort使用了归并和快排
C静态绑定/早期绑定,在程序运行以前执行绑定,直接指向方法地址,使C程序的运行效率更高
Java动态绑定/后期绑定,可以让代码执行更加灵活,在执行时才知道调用哪个方法,java的final方法是早期绑定
覆盖方法override:访问性可以被增加,但是不能被缩小;满足异常规约的运行时多态,子类方法跑出的异常必须小于等于父类的异常声明,或者不抛出
下溯造型:不安全,使用之前先用instanceof检查类型是不是符合
上溯造型:安全,建议使用
编译器处理重载方法的顺序:寻找在还没有装箱动作前可以符合参数个数与类型的方法;尝试装箱动作后可以符合参数个数与类型的方法;尝试没有不定长度参数并可以符合的方法;都找不到合适的方法就报告编译错误
重载是静态多态,在编译时确定了调用的方法是什么(方法的描述:名称,参数列表)
实例变量的初始化步骤:1,绑定构造器参数;2,如果显式使用this(),递归调用,然后跳至5;3,递归调用隐式或显式的super调用,object出国;4,执行显式的实力变量吃实话;5,执行当前构造器的构造体。
纯java的系统中,不建议使用finalize
静态属性:在同一个类加载器中是唯一的
Class a = Class.forName(“类名”,”true/false是否初始化”,App.class.getClassLoader类加载器);
静态代码块在初始化的时候执行,执行完非静态代码块后开始执行构造方法
其中子类和父类都有代码块和静态代码块的时候顺序是:父类静态代码块,子类静态代码块,父类代码块,父类构造方法,子类代码块,子类构造方法
接口:定义类与类之间的行为标准,它体现的是一种契约关系,但不是具体的东西
接口比抽象类更灵活,更加没有侵害性。抽象类是继承关系,通常用来做代码模板,而且通常用来做内部标准实现方式,简化内部代码编写,因其抽象方法的不需实现的特性,实现工具类/函数库
接口:声明一个或多个类需要实现的方法;确定对象的编程接口,而不暴露类的实际主体;捕获无关联类之间的相似性,而无需强加类关系;通过声明一个实现若干决口的类来模拟多重继承;必要时可通过继承将几个小接口,合并成大接口,或给接口添加方法。
面向接口编程更高的灵活性和可扩展性
Adapter适配器模式:将一个类的接口转换成客户期望的另一个接口,让原来不可兼容的类合作无间,(接口与其实现类的配合)
Factory简单工厂模式:类装配,责任分配
内部类允许将逻辑上同属性的类组合在一起,并可在一个类中控制另一个类的状态
匿名内部类只在内部用一次,不考虑重用
Commond命令模式:匿名内部类的用法
Facade外观模式:把很多不认识的类都放在自己内部,声明成属性,这些不认识的类可以交给负责这些类的人,自己只需要做好自己的事情,以及这些不认识的类的人机友好界面
异常:可查异常、不可查异常
可查异常:正常的程序中很容易发生的情况/*Exception*/
不可查异常:通常视为致命错误的严重问题或程序可能存在错误的情况/*致命情况:Error、可能的错误:RuntimeException*/
因Throwable实现序列化接口,异常可以被远程传递
断言继承Error
定义异常体系需要尽量定义运行时异常(不可预见,没有正确使用的异常),它在使用的时候不需要做额外的处理
在确定方法执行的时候有可能会出现不可确定的情况就应该定义可查异常
Finally不能修改返回值,但可以修改返回对象的内容,返回窗口只有一个
Decorator装饰者模式 不断
使用断言记录并检验假设和某一方法的内部逻辑:内在不变式、控制流不变式、后置条件和类不变式
断言的不当使用:不要使用断言来检查共有方法的参数、不要在断言检查中使用可引起副作用的方法。
Java核心框架:Collection、Map、Iterator
List无序,可重复;Set无序,不重复;Map键值对
Iterator迭代器模式
Set没有对Collection接口进行扩展,但在具体方法的含义上进行了进一步的约定->最多包含一个null、不包含满足e1.equals(e2)的元素对e1和e2(hashset受hashCode影响,treeset对象要实现compareable,受compareto影响)
HashSet默认初始容量是16,加载因子0.75,当容量达到75%时,则增加容量
如果能明确一个集合的容量在一个区间内,则指定容量
Treeset的查询性能比hashset差,treeset是有序集合
LinkedHashSet 有链接循环链表
EnumSet对枚举支持的集合,抽象类无法实例化
ListIterator双向,Iterator单向
ArrayList/Vector是数组实现的,插入和删除元素的时候需要重建,
Vector的方法是同步的,线程安全,ArrayList是异步的,非线程安全;Vector的内部数组增长率为1倍,ArrayList是0.5
Collections.synchrronizedList()锁性能比Vector好
LinkedList implements List,Deque(Deque extends Queue)基于链表
Collections工具类的常用方法
unmodifiableCollection(Collection<T> c)返回制定collection的不可修改视图(所有方法的返回内容都不能给外部修改)
LinkedHashMap默认是按照插入顺序,可以为LRU最近少用
Composite组件模式
代理模式
函数的参数有泛型多个上限要求时,默认第一个
泛型不能协变
类型通配符<?>,不加修饰的类型通配符只解决了泛型类型的返回,并不支持泛型类型的参数传入,这个原因在于编译器,无法基于现有的信息作出类型的推断,基于安全的原因,只有禁止参数传入
<? extends Type>增加上限,更加具体,但不能解决数据传入问题
类型通配符的上限和下限是不允许同时使用
<? super Type>下限,符合数据存储要求,可以传入数据
泛型的局限性:不能用基本数据类型实例化类型参数(int,char...)、运行时的类型查询只适用于原始类型(bianliang instanceof Type,但bianliang.getClass().getTypeParameters()可以得到类型)、不能捕获泛型类型实例(无法catch,不过可用泛型声明方法的抛出类型throws)、参数化类型的数组是不合法的、不能实例化类型变量(不过可用通过传递类型变量,实例化泛型类)、泛型类的类型变量对它的静态成员无效、注意擦除后的冲突
io流框架大量使用了装饰者模式(具体对象,装饰对象){
bufferedReader&BufferedWriter/LineNumberReader/PipedReader&PipedWriter/InputStreamReader&OutputStreamWriter/DataInputStream&DataOutputStream.....
}
System.out和System.out.在控制台下无异
在取得流之前,先要告诉Java那个文件夹(File)或文件(File)要成为流的来源
在Java中,目录也被看作是文件;File类支持在目录中检索文件数组的方法。
File对象:物理文件、物理目录、不存在的物理文件/目录
一个函数的长度不应该超过一个屏幕的大小
实现接口FilenameFilter在调用File.listFiles(implements FilenameFilter)时可以直接过滤文件
RandomAccessFile类可以在文件中的任何位置查找或写入数据,同时实现了DataInput和DataOutput接口,可通过接口的方法对文件内容进行存取
UTF8对长的内容用多个字节表示,ASCII包含详细的数据信息
可以读入/写入数据序列的对象成为输入/输出流
来源流发起数据流(输入流),接受流终止数据流(输出流)
可以将流看做来自于源或到接受的数据流
节点流可被认为是:文件、内存以及线程或进程之间的管道
流中的数据:字符(readher,writer)和字节(inputstream,outputstream)
字节流可以处理字符流,反之虽然可以,但是操作难
读流核心方法read(cbuff,off,len);改变读流规则则重写这个
实现Serializable接口的类,并不一定需要给出serialVersionUID,但不给出序列化标识并不意味着该类没有序列化标识(jvm会自动残生,并类的任何变更都会引起标识的不同)
序列化是深度克隆的手段
对于不需要被序列化的属性,可用transient修饰
ZipOutputStream压缩ZipInputStream解压
阻塞方法是读写数据的核心 java.nio是非阻塞实现的(linux效果好,而windows因为系统底层问题而没太大影响)
线程不是为了提高运行效率,而是为了同一时间做更多的事情-为了提高资源使用效率来提高系统的效率。
提高效率最好的办法是接近机械码
线程适合与在SMP(对称多处理)机器上运行,而进程则可以跨机器迁移
线程编程是多核时代的最核心内容《Java并发编程实践》
Runnable可以共享数据
守护线程,其他线程停止后,跟着也停止了
守护线程设置setDeamon状态是在start调用之前使用,一般不用于执行关键任务(任务未执行完,线程就可能被强制结束),一般用来做辅助性工作(监控提示,帮助,等)
设置优先级仅仅能提高获得CPU时间的能力
Iterrupt可以用来请求终止线程
如果线程在调用wait/join/sleep方法的过程中受干扰,则其中断状态将被清除,它还将收到一个InterruptedException
Reference Handler记录对象有没被引用
Finalizer GC
Signal Dispatcher信号量监视
Attach Listener 工具管理监视
Synchronized释放:执行到代码块末端,抛出中断、返回或异常
Volatile修饰符,被修饰的变量,每次访问时直接取堆内存的值,而不在缓存取
避免死锁:确定获得锁的顺序、整个程序要遵守该顺序、按相反顺序释放锁
同步监控模型:使共享数据保持一致、确保程序不死锁、不要期望得到不同通知的线程放在同一等待池中
ThreadLocal多线程均要求有自己的存储空间(ThreadLocal实质是一个map,键是线程的hashcode,值是线程名字)
Java.util.concurrent并发包(Atomic;CopyOnWriteArrayList,多个线程并发修改内容;BlockingQueue,支持阻塞,非常适用于线程间的通信;Semaphore,计数信号量对象,用于限制可以访问的某些资源的线程数量)
Java.net
尽量不要在主线程中进行套接字通信
反射:通过代码操作代码本身