[英语学习]points.doc_第1页
[英语学习]points.doc_第2页
[英语学习]points.doc_第3页
[英语学习]points.doc_第4页
[英语学习]points.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

J2SE知识点记录l 学习方法n 一定要动手敲代码,只有出了错调试好才算学会了。n 面试相关的要背下来l 程序员的桌面设置n 显示所有文件n 标题栏地址栏全路径l 永远的作业n 每天总结与记录n 每天写课上没有敲完的代码n 有时间进行课程的预习l1 第一章,入门1.1 java的历史 1.2 Java体系结构包括4个独立但相关的技术 1.2.1 the Java programming language 程序设计语言 1.2.2 the Java class file format 字节码文件格式 1.2.3 the Java Application Programming Interface应用编程接口 1.2.4 the Java Virtual Machine 虚拟机 1.3 java的运行过程 (类装载器 (ClassLoader)/ 字节码校验器等)1.4 java的核心机制 (虚拟机 / 垃圾收集)1.5 JVM重要结论1.5.1 第一个JVM诞生于1995年。1.5.2 JVM的主要任务是:装载class文件并且执行其中的代码。1.5.3 一个java程序独占一个JVM,一个JVM中只存在一个堆。所以,每个java程序有它自己的堆,但同一个java程序的多个线程共享一个堆。 1.5.4 运行时数据区包括:方法区,堆,java栈,pc寄存器,本地方法栈。 1.5.5 方法区:大小不固定,根据需要动态调整,方法区可以被垃圾回收。 1.5.6 方法区包含:提取装载的类的信息,类的静态变量也放到方法区。 1.5.7 每个JVM实例都有一个方法区和堆。他们是由该虚拟机中所有线程共享的。 1.5.8 每个线程都会得到自己的pc寄存器和java栈。 1.5.9 pc寄存器的值指示下一条将被执行的指令。 1.5.10 java栈记录存储该线程中java方法调用的状态。(包括局部变量,参数,返回值,运算的中间结果。) 1.5.11 这些内存区域是私有的。任何线程都不能访问另一个线程的pc寄存器和java栈。 1.5.12 java栈由许多栈帧组成。一个栈帧包含一个java方法的调用的状态。 1.5.13 栈帧由3部分组成:局部变量区,操作数栈,帧数据区。 1.5.14 帧数据区保存常量池解析,正常方法返回,异常派发机制等信息。 1.5.15 当线程调用一个方法的时候,虚拟机压入一个新的栈桢到该线程的java栈中。 1.5.16 当方法返回时,这个栈桢被从java栈中弹出并抛弃。 1.6 垃圾回收1.6.1 运行的时机:通常,JVM 在被要求时才对内存进行分配。当且仅当内存分配发生错误(内存溢出)时才执行 GC。1.6.2 有较大开销:GC 要停止 JVM 里的所有线程才能开始执行,当然,其中不包括它正在其上运行的那个线程1.6.3 如果堆设置较大,可能导致 GC 的次数变少,但每次 GC 所花的时间很长,从而导致系统的处理能力抖动很大1.6.4 如果堆设置较小,可能导致 GC 变的频繁,但每次 GC 所花的时间不会太长,每次 GC 对系统的性能影响相对也会小些。1.6.51.7 java的特点 (面向对象 / 安全 / 跨平台)1.8 java是编译型还是解释型 (先编译,后解释)1.9 path (尽量改用户path / 改完要重新启动DOS窗口 / Echo %path%)1.10 classpath (放置.class文件的路径, *.jar也是一个路径)1.11 JDK&JRE 的概念1.12 HelloWorldl NoClassDefFoundError 一般是类名错误或者是classpath设置不对l 看见bug不许害怕 养成记录Bug、进行知识管理的好习惯l 类 / 类体 / public class 只能有一个,且和文件名字需要一致l Javac不区分大小写,跟classapth没关系1.13 程序格式的问题(视频)1.14 java类装载器的运行机制(懒加载)1.15 java垃圾收集器的运行机制2 第二章,基础语法2.1 标识符的规则不用记 关键字表不用记2.2 二进制 / 十进制 / 十六进制2.3 程序运行过程l Load into memory - find the main method - run line by line2.4 操作系统或运行环境对于内存的分块 (Code Segment / Data Segment / Heap / Stack)2.5 变量的本质 (内存中的某一块区域)2.6 字符编码重要结论(初步)2.6.1 unicode是一个字符集2.6.2 某个字符在Unicode中都对应一个位置,这个位置称为代码点(code point)。2.6.3 每一个在unicode中收录的字符有utf16,utf32,uft8等多种编码形式。2.6.4 代码点比 U+FFFF 还大的字符叫增补字符2.6.5 对于在 U+0000 to U+FFFF范围的字符来说, 代码点的值和UTF-16编码是一致的。2.6.6 java程序是基于Unicode 字符集来编写的,Java平台跟着Unicode的规范而变化,Java的每一个版本用到的准确的Unicode的版本号,定义在Character类的文档中,Java 1.1用的是Unicode 1.1.5。JDK 1.1 用的是Unicode 2.0, JDK 1.1.7 用的是Unicode 2.1, J2SE 1.4用的是Unicode 3.0, and J2SE 5.0 用的是Unicode 4.0。(J2SE 6.0 用的也是Unicode 4.0)2.6.7 JVM用UTF-16编码表示某个字符2.6.8 在UTF-16编码中,增补字符表示成两个char的值。第一个char的属于高代理范围(uD800-uDBFF), 第二个char属于低代理范围 (uDC00-uDFFF).2.6.9 一个char代表一个UTF-16编码单元。2.7 变量的作用域 (只在声明的内部)2.8 变量之间的类型转换(默认转换和强制转换)2.9 方法 (形参 实参 返回值 返回值类型)l 给形参和返回值分配临时空间 / 把实参的值copy到形参 / 方法执行l 执行完毕后释放所有和方法有关的局部变量内存2.10 if (可以省略大括号,但是不推荐省略)2.11 swtich (小心Case穿透 / 必须int类型)2.12 for (三个表达式都可以省略)2.13 while do while break continue2.14 递归调用 (内存分析图)l 重点考虑递归方法(名字、参数、返回值)其中参数一定是在不断变化的,并能最终让方法结束。2.15 三目条件运算符3 第三章,面向对象3.1 类,对象的概念3.2 面向对象l 类和类之间的关系 (依赖、关联、聚合、合成、泛化、实现)l 面向对象和面向过程思考方法的区别3.3 引用的概念3.3.1 new出来的对象被分配到堆空间3.4 值传递3.4.1 Java中进行方法调用中传递参数时,遵循值传递的原则:基本类型传递的是该数据值本身。引用类型传递的是对象的引用,而不是对象本身 。3.5 构造方法l 和类同名 / 没有返回值 不能写void / 如果没有则自动添加 /如果有就不再自动添加3.6 内存调用过程(多个程序的分析)3.7 javap的使用3.7.1 操作数栈的理解3.7.1.1 x=x+;3.7.1.2 x+ + +x3.8 方法的重载 (方法名字一样,参数不一样 | 个数 / 类型 / 构造方法也可以重载)3.8.1 如果方法名是类名,但被void修饰,则只是一个普通方法而已3.8.2 方法调用时匹配离的最近的参数类型3.8.3 null只能匹配到引用类型的参数。(子类型的参数离null更近一些)3.9 thisl 要调一个方法(动态)需要一个对象 / This一般出现在方法内部l 对哪个对象调用这个方法, this指的就是谁 / 对当前对象的引用,由运行期间决定3.10 static3.10.1 用static声明的成员变量为静态成员变量3.10.1.1 静态成员变量不属于单独的某个对象,3.10.1.2 对于该类的所以对象来说,静态成员变量只有一份3.10.2 用static声明的方法为静态方法3.10.2.1 静态方法属于整个类3.10.2.2 不需要对象,通过类名就可以调用静态方法3.10.2.3 无法从静态上下文中引用非静态的变量/方法3.10.2.4 静态方法被调用时,没有this这个局部变量3.10.2.5 main方法必须得是静态的3.10.3 可以通过对象引用或类名(不需要实例化)访问静态成员,但通过类名访问更合理3.10.4 静态初始化块常用,动态初始化块不常用3.10.5 关键顺序:类被载入-静态成员变量默认初始化静态成员变量显示初始化(静态初始化块)-new(成员变量默认初始化)成员变量(非静态)显示初始化(动态初始化块)-构造方法代码被执行3.11 解决类重名3.11.1 实验步骤l A.java 打包test,B.java 裸体类,B调用了Al A.java 打包,B.java 打到不同的包,B调用了Al A.java 打包,B.java 打到不同的包,B调用了A,A调用了B,编译时用javac d *.javal 把com文件夹剪切到c根目录,再设置正确的classpathl 又把com文件夹的一部分剪切到了d根目录,再设置正确的classpathl 生成一个jar包,,再设置正确的classpathl 要把类放到包里 / 第一句话加package / 包名一般公司域名倒过来l 编译好的class文件必须位于和包的层次一样的目录中l 类不一定放在同一个classpath下。l 同一个包中的类直接使用,不必引入。l Jar文件可以当成目录看待l 注意事项注意事项现象原因及解决办法包名要小写包名不能有敏感关键词(数字,java,javax)被引用的另外一个包的类必须是public避免这种情况:A位于test包内,B是裸体类,并且import test.*Can not resolv symble 类名错误的类文件 xxx.java把原代码拿走位于包中的类不能使用裸体类sun不推荐用裸替类最重要的,确认classpath设置是否正确。NoClassDefFoundErrorl 没有写全限定名l 因为做前面的练习的时候可能调整了这个环境变量。假设类打包为:com.bjsxt.lucene.util,那么请确认classpath指向的目录下包含com文件夹。l 当前目录下有其他的源文件或者class文件捣乱(建议建立一个新文件夹来做这个联系)不会自动创建目录javac -d . *.java(没有写点儿,点代表当前路径)3.12 子类继承父类所有的东西 (子类对象中有一个父类对象 / 子类对象比父类对象大)3.12.1 包括静态方法3.13 权限修饰符号:l 成员变量和成员方法有4种访问权限修饰符:Private / default / protected / public /l 类有两种访问权限修饰符 public / defaultl 关于在位于不同包的子类中访问父类的protected成员父类引用指向父类对象不行父类引用指向子类对象不行子类引用指向其他子类对象不行随便一个类,子类引用指向子类对象不行子类引用指向当前子类对象行子类中直接使用行3.14 子类可以重写父类的方法3.14.1 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型(最好去copy)3.14.2 Override3.14.3 重写方法不能使用比被重写方法更严格的访问权限,原因和多态有关3.14.4 子类重写父类的方法可以改变返回值。返回值可以改变为返回父类返回值的子类,但不能返回父类返回值的父类。3.15 super关键字 (理解内存模型)3.16 继承中的构造方法3.16.1 构造方法没有继承3.16.2 子类的构造的过程中必须调用其基类的构造方法。3.16.3 如果子类的构造方法中没有显式地调用父类构造方法,则系统默认调用父类无参数的构造方法。3.16.4 子类可以在自己的构造方法中使用super() 显式调用父类的构造方法。(更灵活了)3.16.5 对super() 的调用必须是构造函数中的第一个语句3.16.6 使用this(agument list)调用本类另外的构造方法3.16.7 对 this 的调用必须是构造函数中的第一个语句3.16.8 如果子类构造方法中既没有显式调用基类构造方法,而基类中又没有无参的构造方法,则编译出错。3.17 继承中构造方法的调用顺序3.17.1 父类的构造方法先执行。如果还有父类,那么父类的父类的构造方法先执行3.17.2 如果有静态成员变量。类被装载的时候被初始化3.17.2.1 是否静态成员变量被默认初始化是一起执行的吗?3.17.3 成员变量,在每次执行构造方法之前被初始化3.17.3.1 成员变量默认初始化,在调用父类构造方法之前就执行了?3.17.3.2 显示初始化,在调用父类构造方法们之后才执行3.17.4 如果父亲,爷爷,太爷爷。都有自己的静态成员变量,根据继承关系,先载入太爷爷,再载入爷爷,再载入父亲,再载入自己。然后,再从上往下准备这些静态成员变量显示初始化。3.17.5 顺序3.17.5.1 太爷爷类被载入3.17.5.2 爷爷类被载入3.17.5.3 父亲类被载入3.17.5.4 自己被载入3.17.5.5 静态成员变量分配内存3.17.5.5.1 太爷爷的静态成员变量被默认初始化3.17.5.5.2 爷爷的静态成员变量被默认初始化3.17.5.5.3 父亲的静态成员变量被默认初始化3.17.5.5.4 自己的静态成员变量默认初始化3.17.5.6 太爷爷的静态成员变量被显示初始化3.17.5.7 爷爷的静态成员变量被显示初始化3.17.5.8 父亲的静态成员变量被显示初始化3.17.5.9 自己的静态成员变量显示初始化3.17.5.10 成员变量默认初始化(对象分配内存)3.17.5.10.1 太爷爷对象分配内存3.17.5.10.2 太爷爷的成员变量默认初始化3.17.5.10.3 爷爷对象分配内存3.17.5.10.4 爷爷的成员变量默认初始化3.17.5.10.5 父亲对象分配内存3.17.5.10.6 父亲的成员变量默认初始化3.17.5.10.7 自己对象分配内存3.17.5.10.8 自己的成员变量默认初始化3.17.5.11 太爷爷的成员变量显示初始化3.17.5.12 太爷爷的构造方法执行3.17.5.13 爷爷的成员变量显示初始化3.17.5.14 爷爷的构造方法执行3.17.5.15 父亲的成员变量显示初始化3.17.5.16 父亲的构造方法执行3.17.5.17 自己的成员变量显示初始化3.17.5.18 自己的构造方法执行3.18 Objectl 查阅javadocs文档 (要学习运用API文档 / 碰到新的类要大概浏览一遍)l 有些知识点仅靠api文档是没法学会的。3.19 toString方法3.20 equals方法3.20.1 留神方法签名不要写错3.21 关于字符串3.21.1 String s1 = hello;在字符串池里分配一个对象。3.21.2 new String (hello);一共两个对象,一个在池子里,一个在堆里。3.21.3 intern方法确保返回池子里的对象。3.21.4 比较复杂的情况,jvm就不再尝试在内存里重用对象了。3.21.5 String s6 = s4 + s5 ,对象分配到堆。3.21.6 String s6 = hello + hello ,对象分配到字符串池3.22 对象转型l 父类引用可以指向子类对象l 一个父类的引用不可以访问其子类对象新增加的成员(属性和方法)。l 可以使用 引用 instanceof 类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。l 子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)3.23 多态polymorphism3.23.1 定义:多态也叫动态绑定,是指在执行期间(而非编译期),根据引用指向的实际类型调用其相应的方法。3.23.2 多态必要条件:1继承2方法重写3父类引用指向子类对象3.23.3 特殊情况:3.23.3.1 1成员变量(包括静态)没有多态3.23.3.2 2私有方法没有多态3.23.3.3 3静态方法没有多态3.23.3.4 通过super调用父类的方法(包括普通方法和构造方法),如果父类的方法调用了另外一个方法。另外这个方法又被子类重写了。那么有多态。(在子类直接靠super调用被重写的方法,没有多态)3.24 抽象类1.1.1 抽象方法只需声明,而不需实现1.1.2 含有抽象方法的类必须声明为抽象类1.1.3 抽象类可以没有抽象方法1.1.4 抽象类不能被实例化。1.1.5 如果子类中没有给出抽象方法的实现,这个子类依然是抽象类。3.25 Final1.1.6 final的变量不能被改变1.1.6.1 如果声明成员变量的时候没给初始值,最多在构造方法里赋值一遍。1.1.7 final的方法不能被重写1.1.8 final的类不能被继承3.26 interfacel java中一个类只能有一个父类,所以用接口可以实现多继承的逻辑 l 接口是一种特殊的抽象类,接口中只包含常量和方法的定义,而没有变量和方法的实现。l 接口中声明的属性默认为 public static final 的;也只能是 public static final 的;l 接口中只能定义抽象的方法,而且这些方法默认为public的、也只能是public的;l 当一个类实现一个接口时,它必须实现接口中定义的所有方法l 如果没有实现接口中定义的所有方法,那么这个类只能是抽象的。l 多个无关的类可以实现同一个接口。l 一个类可以实现多个无关的接口。l 与继承关系类似,接口与实现类之间存在多态性。ll 接口可以继承其它的接口,并添加新的属性和抽象方法。l 接口描述的是不相关的类的相同行为,而不需要考虑这些类之间的层次关系。l 优先使用接口还是抽象类?l 除非业务逻辑上有明显的继承关系,否则优先使用接口。l 有共同的代码需要在继承层次中上移,则使用抽象的父类。4 第四章,异常l 一张图: Throwable Error|Exception - RuntimeException .l 五个关键词:try catch finally throw throwsl 如果有异常,程序会非正常退出l 如果希望程序出现异常后继续执行,必须捕获异常并处理l 可以打印错误的堆栈信息。e.printStackTrace();l 如果一段语句有可能抛多种异常,得写多个catch块l 如果语句过多,可写多个try块l 异常产生后可不做处理,而是简单的抛出l 如果方法内的代码抛出了非RuntimeException的异常,那么方法也得声明抛出异常l 甚至main方法也可以抛出异常l 方法可声明抛出多个异常l 捕获多个异常应该先逮小的再逮大的。否则编译不通过l 自定义异常l 当抛出自定义的异常,那么方法的声明最好不要抛出父类的异常l finally永远会被执行到. 特殊情况:1,System.exit(0);2,returnl 重写方法需要抛出与原方法所抛出异常类型一致异常或者子异常或不抛出异常或者同时抛出RuntimeException。n 原因:跟多态有关l 一旦出错,养成注意观察excpetion的名字和行号的习惯l5 第五章,数组5.1 数组的内存模型 多维数组的内存模型5.2 排序 搜索 对象排序和搜索5.3 System.arraycopy6 第六章,常用类6.1 String 代表不可变的字符序列(char序列/utf-16编码序列)6.1.1 char代表的是:utf-16编码单元6.1.2 utf-16编码单元(2字节)对应一个Unicode代码点。6.2 StringBuffer可变字符序列 (适合字符串的删除 添加 插入等操作 / 线程安全)6.3 StingBuilder和StringBuffer类似 (不是线程安全)6.4 String, StringBuffer, StingBuilder 区别6.4.1 如果字符串内容需要频繁变化StringBuffer, StingBuilder6.4.2 如果是单线程编程优先用StingBuilder6.4.3 多线程编程,并且有多个线程操作同一个对象可能。-StringBuffer6.5 Math(不怎么重要)6.6 基础数据类型包装类l Byte / Short / Character / Integer / Long / Float / Double / Boolean6.7 Filel 文件夹内容树状排列 (典型递归应用 应该记住)6.8 Enum(项目中可以用)7 第七章,容器7.1 一个图7.2 两个类 (Collections/Arrays)7.3 三个知识点(7.3.1 泛型(推荐使用)7.3.2 增强的for循环(不推荐使用,不重要)7.3.3 自动的打包和解包(推荐使用)7.4 六个接口l Collection Set List Map Comparable Iterator7.5 容器这章最主要目的:l 必须掌握的是:了解有哪些种容器,如何分类的。常用的api的用法。每种容器的特点,知道如何在不同的容器中选择。7.6 Map7.6.1 一个映射不能包含重复的键;每个键最多只能映射一个值。7.6.2 Map如何遍历?7.6.2.1 Map 接口提供三种collection 视图,允许以键集、值集合或键-值映射关系集的形式查看某个映射的内容。映射的顺序 定义为迭代器在映射的 collection 视图中返回其元素的顺序。7.6.2.2 某些映射实现可明确保证其顺序,如 TreeMap 类;某些映射实现则不保证顺序,如 HashMap 类。7.7 HashMap现象(尽量去理解)7.7.1 键类没有重写equals,也没重写hashCode,不重复l 没重写hashCode会调用父类的hashCode方法Object的hashCode比较的是内存地址内存地址肯定不同所以hashCode不同所以key是不重复的,此时没有必要调用equals7.7.2 键类重写equals,但没重写hashCode,不重复,没有调用equalsl 没重写hashCode会调用父类的hashCode方法Object的hashCode比较的是内存地址内存地址肯定不同所以hashCode不同所以key是不重复的,此时没有必要调用equals7.7.3 键类重写equals,并且重写hashCode,重复, hashCode调用2遍, equals调用1遍l 先比较hashCode由于重写了hashcode方法,实现了hashcode常规协定第二条(即:如果equals为true那么hashcode也得一样)-所以hash码一样再比较是不是同一个内存地址结果不是同一个对象再判断equals,结果是truekey是重复的。7.7.4 为什么有时候调用equals方法,有的时候又没有调用。l 因为是短路与7.8 hashCode重要结论(应该掌握)1.1.1 重写equals方法,通常需要重写hashCode方法.l 因为你的本意是想让两个不同的对象实现业务逻辑上的相等。但是hashMap等容器判断两个key是不是相等(重复)是靠hashCode和equals,除非hashCode也相等并且equals也相等,hashMap才会认为2个key是重复的。l 如果不重写,不同的对象就不会相等。因为2个对象虽然equals是相等的。但是默认的Object类继承过来的hashCode方法将返回不同的整数1.1.2 hashCode 的常规协定1.1.3 一个对象被当作HashMap里面的key的时候,hashCode和equals用来比较两个key是不是重复。即:判断key是否重复有两条件必须同时成立:第一,hash必须相等,第二,内存地址相等或者用equals判断是相等的。l jdk1.6:e.hash = hash & (k = e.key) = key | key.equals(k)l jdk1.5:e.hash = hash & eq(k, e.key)1.1.4 hashCode用来在HashMap等容器里面计算索引。目的是为了提高搜索效率。甚至比数组遍历还要快很多。(原理,扩展的内容,不要求必须掌握)7.9 Collections7.9.1 Collections的sort方法,要求传入的list包含的元素类实现Comparable接口7.10 HashSet7.10.1 底层靠HashMap实现的。7.11 Iteratorl Iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法。否则会抛出ConcurrentModificationExceptionl 可能碰巧不会抛出(比如:iterator刚执行完最后一遍next方法,游标右边没有元素了)l fail-fastn 如果当一个算法开始之后,他的运算环境发生了变化,使得算法无法进行必需的调整时,这个算法就应当立即发出故障信号这就是fail-fast的含义n fail-fast是一种出现错误时的早期报警功能7.12 Enumeration/ Iterator/ ListIterator区别EnumerationIteratorListIterator不能删除元素删除元素不能不能增加元素不能不能反向迭代不支持fail-fast支持fail-fast支持fail-fast7.13 Vector & ArrayList的区别l Vector被ArrayList代替了l 因为Vector中的方法是同步的,一般不常用,但有时在多线程中可以用。7.14 hashMap和HashTable区别HashtableHashMap实现了Map接口实现了Map接口java.lang.Object java.util.Dictionary java.util.Hashtablejava.lang.Object java.util.AbstractMap java.util.HashMapHashtable中的方法是同步的,HashMap是Hashtable的轻量级实现(非线程安全的实现)。在多线程应用程序中,需要额外的同步机制。l 但HashMap的同步问题可通过Collections的一个静态方法得到解决:Map Collections.synchronizedMap(Map m)l 这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。Hashtable不允许。l 在HashMap中,null可以作为键,这样的键只有一个;l 可以有一个或多个键所对应的值为null。l 当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。HashTable使用Enumeration, HashMap使用Iterator。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap重新计算hash值,而且用与代替求模:由于非线程安全,效率上可能高于Hashtable。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。7.15 HashMap 和TreeMap区别(不是重点)HashMapTreeMapkey有无顺序HashMap通过hashcode对其内容进行快速查找(HashMap中元素的排列顺序是不固定的)。而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap判断key是否重复逻辑不同判断key是否重复有两条件必须同时成立:第一,hash必须相等,第二,内存地址相等或者用equals判断是相等的。compareTo方法比较是0对key类的要求不同key类重写equals有必要重写hashCode方法Key类必须实现了Comparable接口。7.16 如何选择数据结构7.16.1 Array读快改慢7.16.2 Linked改快读慢7.16.3 Hash搜索极快,遍历极慢7.16.4 Tree插入/搜索都比较快,7.17 良好的编程 (父类引用指向子类对象)7.17.1 Collection c = new HashSet(); 7.17.2 List list = new ArrayList();8 第八章,流8.1 流的分类8.1.1 按数据流的方向不同可以分为输入流和输出流。(以程序的角度来考虑)8.1.2 按处理数据单位不同可以分为字节流和字符流。8.1.3 按照功能不同可以分为节点流和处理流。l 如何判断某一个流是节点流还是处理流呢?8.2 J2SDK 所提供的所有流类型位于包java.io内都分别继承自以下四种抽象流类型。8.2.1 inputstram / outputstream / reader writer8.3 文件处理 8.3.1 Fileinputstream / fileoutputstrem / Filereader / filewriter8.4 阻塞式的方法的概念。8.5 要序列化一个类的对象,该类必须实现serializable接口8.5.1 Serializable,标记性的接口 (Serializable / java.util.EventListener)8.5.2 serialVersionUID为了让该类向后兼容。即在版本升级时反序列化仍保持对象的唯一性。l 你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式:l 一个是默认的1L,比如:private static final long serialVersionUID = 1L;l 一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。8.5.3 transient修饰的成员变量在序列化的时候,不予考虑8.5.4 Externalizable 接口:如果想精确控制序列化的过程,应用此接口l void writeExternal(ObjectOutput?out) throws IOException l void readExternal(ObjectInput?in) throws IOException, ClassNotFoundException 8.5.5 Serializable虽然没规定具体的方法。但是api里面提到的4个特殊的方法,依然有机会让你控序列化的过程。l private void writeObject(java.io.ObjectOutputStream out)throws IOExceptionl private void readObject(java.io.ObjectInputStream in)throws IOException, ClassNotFoundException;l ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;l ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;8.6 IO类:l InputStream / OutputStream / Reader / Writerl FileInputstream / FileOutputStream / FileReader / FileWriterl BufferInputstream /BufferedOutputStream/ BufferedReader/ BufferedWriterl InputStreamReader / OutputStreamWriterl ByteArrayInputStream / ByteArrayOutputStreaml DataInputStream / DataOutputStream / PrintWriter / PrintStreaml ObjectInputStream / ObjectOutputStream / Serializable / transient8.7 建议8.7.1 常用的组合没有必要死记硬背,放在手边即可8.7.2 建议经常使用缓冲流8.7.3 养成好的编程习惯:在close之前,要flush(其实,close时候自动flush。)8.7.4 只需关闭最外面的处理流(外面的流自动关闭里面的流)8.8 java.nio9 第九章,多线程9.1 进程的概念 线程的概念9.2 线程创建和启动的两种方式 (Implements runnable(recommended) / Extends Thread)9.3 线程的状态 (创建 / 就绪 / 运行 / 阻塞 / 中止)9.4 线程控制方法9.4.1 isAlive/set/getPriority/interrupt/start/stop/join/sleep/setName9.5 dead lock9.6 live lock9.7 producer consumer9.7.1 wait notify notifyAll9.8 wait sleep 区别l 来源不同l Sleep是Thread提供的方法l Wait继承自Objectl 代码位置不同l Wait需要写在Synchronize语句块里面l 是否释放锁定对象l 调用wait方法,释放锁定该对象l Sleep时别的线程也不可以访问锁定对象9.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论