仅适用于有一定基础的读者

2025/1/5 XPIPI

第一章 Java概述

1.Java的语言特性:面向对象、平台无关性、多线程、垃圾自动回收机制、安全性

2.Java源文件拓展名为.java,通过编译指令javac后可得到扩展名为.class的字节码文件,字节码可通过运行指令java运行

3.用java命令运行程序不需要添加字节码文件拓展名.class

4.javadoc命令用于生成文档,javap命令用于反汇编,jar命令用于打包Java字节码文件,jdb为命令行式的调试工具

5.使用package来创建一个包

6.使用import来导入一个包,默认已导入java.lang包

第二章 Java语法基础

1.文档注释 / ... / 与多行注释 / / 区分

2.对象实例化时,若成员变量没有显式赋值,则取值为对应数据类型的默认值;若数组没有显式赋值,各元素都取默认值

3.引用数据类型的默认值为null

4.将浮点型转换为整型时,小数点后数据将被截掉,精度下降

5.不推荐用包装类的构造方法创建包装类对象,一般用包装类的valueOf()方法

6.用parseXxx(String s)将字符串转为基本类型,用valueOf(Xxx x)将基本数据类型转化为字符串

7.instanceof为二元运算符,判断左边是不是右边的类型

8.若精度不同,==运算结果也为false

9.&&和||会发生短路现象,&和|不会

10.使用带标签的break语句,应当再break所在循环的外层循环之前定义

11.abstract和final修饰符不能同时使用

12.方法重载的名字一定相同,参数列表一定不同,其它随意

13.多维数组声明并初始化的三种方式

int a[][]=new int[][]{{1,1,1},{2,2,2},{3,3,3}};
int a[][]={{1, 1, 1}, {2, 2, 2}, {3, 3, 3}}
{
    int[][] a = new int[3][3];
    a[0] = new int[]{1, 1, 1};
    a[1] = new int[]{2, 2, 2};
    a[2] = new int[]{3, 3, 3};
}

14.foreach只能遍历访问,不能修改也不能局部访问

第三章 面向对象基础

1.一般来说,成员变量和属性是一个意思,实例与对象是一个意思,创建对象和实例化对象是一个意思

2.类体中不能对成员变量进行操作,只能在代码块中进行操作

3.栈内存和堆内存 类的对象在堆中分配空间

4.既可以用类.Xxx也可以用对象.Xxx来访问类变量

5.类都至少有一个构造方法

6.在程序块中,变量遵循就近原则,即同名的局部变量可以屏蔽外部的成员变量

7.this()调用构造方法时必须放在第一行

8.访问权限:private<default<protected<public

9.类不能用private和protected修饰

10.调用System.gc()方法和Runtime.getRuntime.gc()来强制进行垃圾回收

11.finalize()方法由垃圾回收器调用,不要主动调用

12.Runtime类是一个单例类,通过getRuntime方法来获得这个对象

13.运行顺序:静态块->构造块->构造方法

14.构造块在每次调用构造方法时前都会运行一次

15.没有任何前缀后缀修饰只由大括号{}括起来的就是构造快

第四章 面向对象高级技术

1.Java采用类的单继承可多重继承,接口可以同时多实现

2.方法重写的方法名、参数列表、返回值必须一模一样,而且子类重写的方法访问权限必须大于等于父类

3.方法重写和方法重载是实现多态的重要形式。

4.super调用父类的构造方法也要放在第一句

5.所有类直接或间接继承java.lang.Object类,因此都有toString,equals,hashCode,clone,notify,notifyAll,wait等方法

6.final修饰的类不能被继承

7.一般用static final来修饰常量

8.局部变量声明后必须显式初始化

9.wait,notify,notifyAll,getClass()方法是final修饰的,不能被重写

10.向下转型转换后引用对象可以访问子类成员,而向上转型转换后引用对象不能访问不是重写的子类成员

具体原因点我可看

11.向下转型时,必须确保运行时类型确实是子类对象,否则会抛出 ClassCastException

因此,为了避免产生异常,可以使用instanceof运算符进行目标类型的判断

12.抽象类的子类如果是普通类,必须实现所有抽象类的抽象方法

13.抽象类可以含有属性、方法、构造方法、程序块等

14.抽象类可以没有抽象方法,也可以有非抽象方法

15.接口可以使用extends继承一个或者多个接口,但是不能继承类

16.接口中变量都是常量,必须显式初始化

17.接口中方法都是public abstract修饰

18.如果一个接口中只有一个抽象方法,这个接口称作函数式接口,在lambda表达式中可以用到

19.接口中可以有默认方法,用default修饰

20.如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

21.如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么子类会继承父类的b方法而不是继承接口中的b方法

22.接口中也可以有静态方法,用static修饰

23.一个类可以同时实现多个接口;一个类只能继承一个类,但是能实现多个接口;一个接口可继承多个接口。

24.充分利用接口可以降低程序各个模块之间的耦合度,提高系统的可拓展性和可维护性

25.内部类可以用static修饰为静态内部类,但是内部类的成员不能声明为static类型

26.内部类名不能与外部类同名

27.

实例化静态内部类对象的模板是: 外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()

实例化非静态内部类对象的模板是:外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()

OuterStaticClassName.InnerStaticClassName objectName = new OuterStaticClassName.InnerStaticClassName();
OuterClassName.InnerClassName objectName = new OuterClassName().new InnerClassName();

28.局部内部类定义在方法内,作用域在方法里

29.局部内部类不能使用访问控制修饰符,也不能用static修饰

30.匿名内部类因为没有类名,所以不能复用,不能实例化

第五章 Java API

1.String的subString方法取的是左闭右开的区间,StringBuffer的delete方法也是

2.StringBuffer支持多线程,也是线程安全的

3.StringBuffer的默认缓冲区容量为16个字符

4.StringBuilder线程不安全,但是支持链式操作

5.拼接字符串效率:StringBuilder > StringBuffer > String

6.toString方法在没有重写时默认是返回 getClass().getName() + "@" +Integer.toHexString(hashCode());

7.String类重写了toString 方法

public String toString()  return this

8.String类重写了equals和hashCode方法,但是StringBuffer类和StringBuilder没有重写,equals方法仍然是比较两个对象的地址是否相等

9.StringBuffer类和StringBuilder类用于字符串追加、插入、删除、反转等操作,且其内容可以改变,且字符串拼接的效率明显比String类高

10.java.util.StringTokenizer类用于分割字符串

11.时间与日期相关的三个重要的类:Date、Calendar、DateFormat

12.Date类返回的时间是以毫秒ms为单位的

13.Calendar.DAY_OF_WEEK返回星期几

14.规定的标准时间格式:

日期:yyyy-MM-dd;

时间:HH:mm:ss;

带毫秒的时间:HH:mm:ss.SSS;

日期和时间:yyyy-MM-dd'T'HH:mm:ss; 日期与时间之间用'T'隔开

带毫秒的日期和时间:yyyy-MM-dd'T'HH:mm:ss.SSS

15.Local系列的类(LocalDateTime LocalDate LocalTime)都有parse方法用于进行将字符串转为相应的日期和时间类型

16.Instant.now()从系统时钟获得当前瞬时

17.Duration类和Period都是计算一个时间段,不同的是Duration类基于时间值,而Period类基于日期类,都使用以下方法创建:

Duration duration = Duration.between(time1,time2);

Period period = Period.between(time1.toLocalDate(),time2.toLocalDate());

18.DateFormat是一个抽象类,SimpleDateFormat是其实现类

19.通过SimpleDateFormat的format方法将一个Date对象转化为一个相应格式的字符串,回转用parse方法

20.Math.random()方法生成一个(0.0,1.0)的随机数

21.Random类在构建随机数生成器时可以自定义一个种子,也可以通过无参数来随机一个随机数种子

22.Random类的nextInt方法如果无参数则返回一个任意范围的整数,如果有参数X则返回一个[0,X]的整数

23.基本数据类型都有其对应的包装类

24.将十进制转化为二进制可以用包装类的toBinartString(int i)方法,转化其它进制同理

25.包装类才可以使用泛型,而基本数据类型不可以

26.基本数据类型比包装类占用的内存空间更小,是一种轻量级的

27.在小数点需要保留指定位数时,建议用参数类型为String的构造方法构造BigDecimal对象

28.System类代表当前Java程序的运行平台,Runtime类表示当前JVM的工作信息

29.System的类变量中:out和err属于PrintStream类型,in属于InputStream类型

30.另外,InputStream提供了read方法接受字节数据,因此可以用System.in.read()来读取单个字符

31.打开一个计算器可以用Runtime类的exec方法,记得要捕获异常

32.用Pattern类对正则表达式进行编译,用Matcher类在给定Pattern实例的模式控制下进行字符串的匹配工作

33.String也提供了matches方法,可以使用正则表达式进行匹配

34.Java集合由两个根接口派生:单列结构Collection和双列结构Map

35.List和Set是Collection其中两个应用最为广泛的子接口,List元素有序且可重复,Set元素无序且不能重复

36.集合遍历的方式有以下五种。

基本循环如for/while循环:这种方式功能上最为强大,遍历时也可以修改、删除元素。

Iterator:比较简便的遍历方式,遍历时可以删除元素。

ListIterator:Iterator的子接口,专门用于List集合的遍历,支持双向遍历。

Enumeration:遍历Properties等双列集合的方式,遍历时不能修改、删除元素。

foreach:遍历方式上最为简便,同时功能上也最弱,遍历时不能修改、删除元素。

除了基本循环之外,其他方式遍历时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException异常。Iterator提供的方法是有限的,只能对元素进行判断、取出、删除的操作,如果想要其他的操作如添加、修改等,就需要使用其子接口ListIterator。该接口只能通过List集合的listIterator方法获取。Enumeration和foreach方式功能上更为单一,遍历时不能修改、删除元素。

37.ArrayList效率没有数组高,但是可以动态改变大小,可以很方便添加删除修改元素

38.从集合中取出元素进行强制转换可能带来隐患,所以一般使用泛型,例如:

ArrayList<String> list = new ArrayList<String>();

39.TreeSet类在实现Set接口的同时,也实现了SortedSet接口,保证元素为升序

40.HashSet类在使用自定义类的时候,必须重写hashCode和equals方法

41.TreeSet本质上是一个自平衡二叉搜索树,即红黑树的实现 操作元素的时间复杂度为O(logN)

42.基本数据类型对应的包装类,String类都实现了Comparable接口,因此添加到TreeSet中可以按照自然排序的方式进行排序

43.添加其它引用类型的元素,必须实现Comparable接口,重写CompareTo方法,否则TreeSet无法排序,产生ClassCastException异常

44.Map中Key和Value都可以是null,但是Key一定是唯一的

45.Map接口的方法中

keySet 返回包含所有键值的Set集合

values返回Map中所有值组成的Collection集合

entrySet返回所有键值对组成的Set集合

46.HashMap类似于HashTable,但他是不同步的

47.SortedMap接口也有一个实现类TreeMap,对所有的键值对按照键进行排序,同时也需要实现Comparable接口

48.Properties类称为属性列表,继承于Hashtable类

49.泛型方法的类型参数可以用来声明返回值的类型,注意类型参数只能代表引用型类型,不能是基本数据类型

50.Lambda表达式中,一个参数可以不用圆括号,代码只有一个语句可以不用大括号,但是箭头一定有

51.Lambda表达式在很多场合下可以代替匿名内部类

第六章 异常处理机制

1.Throwable类是异常顶层父类,两个直接子类Error类和Exception类

2.Exception类分为运行时异常和编译时异常,编译时异常必须手动处理

3.getMessage方法可以返回异常对象的详细信息,toString方法可以返回异常对象的简短描述,printStackTrace方法将异常及其追踪输出至标准错误流

4.try-catch-finally语句中,finally一定会执行,而且返回值会覆盖掉前面代码的返回值,所以一般用来关闭字节流之类的收尾操作

5.应把捕获子类异常的catch语句放在前,捕获父类异常的语句放在后

6.return语句出现在catch语句内,直接退出方法,而不是回到异常抛出点

7.finally语句不是必须的

8.在方法名后面用throws声明一个或者多个异常,交给调用这个方法的程序来处理异常

9.自定义异常对象无法由系统产生并抛出,所以需要手动生成异常对象并抛出,使用throw语句

10.throw语句抛出的是异常对象,而不是一个异常类,所以需要先实例化异常类再抛出

11.自定义异常类必须继承Throwable类或者其子类,一般不继承Error类

12.当自定义异常类继承RuntimeException及其子类时,是运行时异常,在程序中可以不捕获并处理他

第七章 Java I/O流

1.数据从外部流向程序:输入流 数据从当前程序流向外部:输出流

2.Stream结尾就是字节流,Reader/Writer结尾就是字符流

3.节点流直接在输入输出媒介之上建立,过滤流在节点流类的基础上对节点流功能进行拓展

4.无论是节点流还是字符流,进行读写都是顺序读写的

5.但是也提供了一个随机读写类RandomAccessFile,也在java.io包中

6.标准输入输出流 System类的 in,out,err

7.File类只能对文件本身进行操作,即创建文件、删除文件、返回路径、文件是否存在等

8.File类也可以查看系统磁盘空间信息,以字节为单位返回

9.实现FilenameFilter接口的类实例可以用于过滤文件名,实现抽象方法:

boolean accept(File dir,String name)

10.字节流可以用来处理任何文件,而处理文本文件一般使用字符流

11.InputStream类和OutputStream类是字节流的顶层抽象父类

12.最常用的两个字节流类:FileInputStream和FileOutputStream 通过read和write方法可以对文件数据进行操作

13.实例化FileInputStream,输入参数需要为File类对象或者是一个字符串代表的文件地址

14.I/O流在不使用之后一定要用close关闭

15.FileInputStream找不到文件会抛出FileNotFoundException异常,而FileOutputStream找不到文件会创建一个对应的文件

16.FileOutputStream遇到一个只读文件的时候会抛出IOException异常

17.过滤字节流相当于一个过滤器,必须连接到一个节点流对象,例如

FileInputStream fis = new FileInputStream("xx.txt");
DataInputStream dis = new DataInputStream(fis);

18.FilterInputStream类和FilterOutputStream类为抽象类,

FilterInputStream有三个子类BufferedInputStream,DataInputStream,PushbackInputStream

FilterOutputStream有三个子类BufferedOutputStream,DataOutputStream,PrintStream

19.FilterInputStream类和FilterOutputStream类分别重写了InputStream类和OutputStream类的所有方法

20.BufferedInputStream为缓冲字节流,提高了读写效率,默认缓冲区为32B

21.缓冲输出字节流链接到节点输出流OutputStream

22.在使用缓冲字节流时,一定要在最后使用flush方法强制清空缓冲器,将最后没填满缓冲区的数据输出到节点输出流

23.PushbackInputStream顾名思义,用来需要对数据进行分析的时候,可能需要超前读入一个字节进行判断,然后再从缓冲区将字节返回

24.PushbackInputStream在顶层父类的基础上增加了unread方法,默认返回一个由低8位构成的字节

25.回退过程中如果缓存区满了就不能进行回退unread操作,否则产生IOException异常

26.PrintStream类捕获抛出IOException,而是通过checkError方法来设置测试的内部标志来检测异常

27.PrintStream可以在写入字节数组之后自动调用flush方法

28.实际上out是System类的一个PrintStream类型的类变量,可以调用println和print方法

29.管道字节流一般用于在互联网上传输数据,必须输入输出流同时使用

30.PipedInputStream类和PipedOutputStream类提供了两种方法进行输入输出流的链接

一个是使用connect方法

一个是在实例化管道流对象时进行链接

31.顺序输入流SequenceInputStream可以将几个输入流按顺序连接起来,也就是将多个不同的输入流统一为一个输入流

32.通过将一个Java类实现Serializable接口来表明这个类的对象是可以被序列化的,以此对该对象进行持久化,并可以使用对象流进行操作

33.序列化只能保存对象的实例变量,不能保存任何类的方法和类变量

34.对于用transient关键字标明的瞬时成员变量,对象也不会保存其状态

35.线程对象或流对象的状态是瞬时的,必须用transient修饰,否则编译出错

36.对象流ObjectInputStream和ObjectOutputStream类分别实现了ObjectInput和ObjectOutput接口

37.对象流的构造方法和使用方法于数据流的构造方法以及使用方法基本相同

38.利用对象流输入输出对象时,也需要与其它字节流作为节点流连接起来使用

39.Java采用16位的二进制字符编码方案:Unicode

40.Reader类和Writer类是所有字符流的顶层抽象父类

41.Reader类的ready方法可以用于判断是否准备读取此流

42.Writer类追加字符到字符流的方法为append

43.转换类:InputStreamReader和OutputStreamWriter类

用于处理字节流转换字符流转换

44.实例化转换类对象的方法:

InputStreamReader(InputStream in,String charsetName)

charsetName为可选的指定字符集

45.缓冲字符流BufferedReader和BufferedWriter和缓冲字节流差不多,但是提供了readline和newline方法,可以一行一行的进行操作,而且在行操作时候会使用到行结束标志

46.因为字节流的兼容性不好,操作Unicode编码的文件一般使用文件字符流FileReader和FileWriter

47.文件输出流在实例化时可以选择参数是否为追加模式

FileWriter(File file,boolean append)

48.管道字符流PipedRead和PipedWriter也必须同时使用

49.PrintWriter类类似于PrintStream,可以对基本数据类型进行处理,还可以接受Writer对象作为输出对象

50.RandomAccessFile可以实现随机读写文件,注意是读写都可以;使用getFilePointer方法返回当前指针位置,使用seek方法调整指针位置

51.RandomAccessFile操作文件的模式

r:制度

rw:读写

rws:同步读写,同步写文件内容和文件属性

rwd:数据同步读写,同步写文件内容,不修改文件属性

52.

InputStream和OutputStream是所有字节流类的“祖先”,读写数据的单位是字节。

Reader和Writer是所有字符流类的“祖先”,读写数据的单位是字符。

File类用于创建、删除指定的文件或目录,并且可以获取该文件或目录的属性信息及所在磁盘的信息等,但File类不能打开文件。

FileInputStream/FileOutputStream、FileReader/FileWriter和RandomAccessFile是处理本地文件的类。可以对文件进行读写操作,RandomAccessFile还可以随机地读写指定文件。

BufferedInputStream/BufferedOutputStream和BufferedReader/BufferedWriter提供了缓冲区,达到一定数量时再送到目的文件,以减少阻塞次数,提高读写效率,适合读写大文件。

PipedInputStream/PipedOutputStream和PipedReader/PipedWriter是管道流,要求管道输入流和管道输出流同时使用,适合网络编程。