语法部分
1.java的技术结构:JAVASE JAVAEE JAVAME
2.Java的跨平台:基于JVM---java语言是跨平台的,JVM不跨平台。
3.入门程序:类名和java文件名不一定一致:class文件名和类名对应。(java、javac两个指令)
4.关键字:53个---goto,const---2个保留字
5.标识符:由字母、数字、_、$组成,数字不能开头,不能使用关键字,见名知意。
6.注释:单行//、多行/* */、文档/** */,文档注释一般用来标识类和方法---注释的作用:解释说明程序、排错
7.进制:开头标识:2进制以0b开头,8进制以0开头,16进制以0x开头。
byte b = 00010000;---报错(这是一个八进制的)
01111111->177
8.变量:先声明后使用,先赋值后操作
9.数据类型:基本数据类型(byte short int long float double char boolean)、引用数据类型(类、接口、数组)
A.byte的取值范围:-128-127;
B.整数默认是int类型,小数默认是double类型
C.float需要以F/f结尾,long需要有一个L/l结尾
D.科学计数法:dobule d = 3.2e4;32000 double d = 0x8p3;64
10.数据类型的转换:隐式转换,显式转换
A.隐式转换:小转大,整转小
B.当一个较大的整数赋值给一个浮点型的时候,可能会产生精度损失
C.虽然short和char都占2个字节,但是相互之间不能间接转换,但是可以直接赋值。
D.进制强转的时候,可能产生精度损失
11.运算符:算术、赋值、比较、逻辑、位、三元运算符
A.如果参与运算的是同一个类型,则结果必定是该类型
B.byte/short在运算的时候会自动提升为int类型
byte = 1+2;---可以---直接量参与运算的时候,编译的时候会自动优化,这句话在编译完成之后---byte b =3;
byte b = 2; b = b+1;---结果是int类型,int不能直接赋值给byte类型
Byte b1 = 1;byte b2 = 2;byte b = b1+b2;---结果是int类型
C.小数不能进行精确运算
D.注意取余运算
E.自增/自减:放在变量之前和变量之后的结果不一样;byte/short可以参与++/--的运算,结果依然是原来的类型。
byte b = 3;b++;---可以
F.+= -= *= /= %= &= |= ^= <<= >>= >>>= 要求变量必须先有值,才能运算。byte类型可以参与这些运算。
G.instanceof ---判断对象与类的关系
H.^(异或)的运算规则:true^true = false false^false =false false^true =true;
I.&和&&的区别:&是位运算,&&是逻辑运算
J.位运算操作的是整数,并且是数据的补码---正数的原反补三码一致
K.三元运算符的结果要求一致或者前后相容。
double d = e? 1 : 3.2;
L.当三元运算形成嵌套,最好用()分隔开
12.流程控制:顺序结构、分支结构、循环结构
A.判断结构:if,if-else,if-else if
B.如果代码块只有一句话,{}可以省略不写。
C.Boolean b = true; if (b= false){} (不会报错)
int i = 0;
While(i<10){ 不会报错,如果改为true,则最下面报错。
System.out.println(i);
}
System.out.println(i);
D.Switch-case:switch (|)需要一个值,本质上需要一个int类型的值(不能放long,可以放byte和short因为可以自动转化为int),JDK1.7允许是String类型,JDK1.5之后允许是枚举常量
E.如果每一个case之后都有break,那么case之间的顺序对结果没有影响
int i = 1;
switch(i){
case 1:int j =0;
case 2:j+=1; ---j未定义
case 3:j+=2; ---j未定义
default:j+=3;
}
System.out.println(j); ---j未定义 报错:case2和case3中j未定义
F.while,for的循环体只有一句,{}可以省略不写
G.尽量减少使用小数作为终止循环的条件
H.循环的标号
I.continue---跳出一层循环,继续下次循环
J.break---表示终止当前的一层循环或者选择
语法部分
1.数组---本质上是一个用来存储同一类型数据的容器
A.定义好之后大小不可变
B.冒泡排序的时间复杂度是O(n2)
C.折半查找的时间复杂度是O(log2n)
D.数组的扩容---本质是数组赋值---产生一个新的数组
2.方法---是将一段逻辑进行提取封装
A.如果一个方法有返回值类型,保证这个方法运行完成之后一定有返回值。
B.即使返回值类型是void,这个方法内部依然可以存在return语句。
C.方法签名---方法名+参数列表--参数列表实际上指参数的类型:
equals(Object t)---java.lang.Object.equals(java.lang.Object)
D.方法的重载---要求方法名一致,参数列表不同。和修饰符、返回值类型以及异常无关。
E.方法的重写---发生在父子类中,方法签名一致。和修饰符、返回值类型、异常都有关系。
F.递归---本质上是调用方法。---需要控制好递归的结束条件
内存
1.内存---栈内存、堆内存、方法区、本地方法栈、寄存器
2.栈内存---用于执行代码块---对其中的变量不会自动赋值---,方法一旦执行完,会立即移除出栈内存
3.堆内存---存储对象的。对存入其中的对象中的属性会自动赋予默认值。使用完成之后会由GC自动回收。---对象在推内存中采取的是分代回收机制。
4.方法区---用于存储类信息的。类加载到方法区的静态常量池。其中类中的静态方法是加载到静态区。对于直接量和类中定义的常量是存储到运行时常量池的。---信息一旦加载到方法区中以后就不在移除。
面向对象
1.面向对象---相对于面向过程来说的。
2.类与对象关系---类是对象的模板,对象是类的实例。
3.局部变量和成员变量:定义位置,使用范围,内存位置,生命周期
4.构造函数---与类同名但是没有返回值类型,可以重载但是不能重写,每一个类中都至少有一个构造方法---创建对象
5.this---代表当前对象的引用。
A.在本类中通过this来调用对应的方法或属性。
B.this用在构造函数中调用本来中其他的对应形式的构造函数
C.this语句必须放在构造方法的首行
6.代码块---局部代码块,构造代码块
A.局部代码块---定义在方法或者语句内部。---主要用于限制变量的生命周期和使用范围,以提高栈内存的利用率。
B.初始化代码块---定义在类内方法外---在创建对象的时候执行,用于完成一些指定的必要的操作。
7.面向对象的特征---封装、继承、多态(抽象)
8.封装---函数、属性的私有化、内部类---复用性、安全性
9.继承---利用的extends关键字形成继承关系
A.单继承,多实现。(一个类可以实现多个接口只能继承一个类,一个接口可以继承多个接口)
B.复用性,安全性,结构更加统一
10.多态
A.配合反射实现解耦
B.向上造型,重写,重载(多态的三个形式)
11.Super---代表的是父类对象的引用。
A.可以在子类中通过super调用父类中的方法或者属性
B.Super语句---在子类构造函数中调用父类对应形式的构造函数。每一个子类构造函数都直接或者间接有一个super语句;super语句必须放在构造函数的首行
12.权限修饰符---注意使用范围---注意在子类中用和子类对象调用是两回事!
13.static---修饰变量、方法、代码块、内部类
A.静态变量---随着类的加载而加载到方法区中的静态区,在静态区中会自动赋予默认值。由于静态属性是先于对象而存在的,所以可以通过对象来调用,但是一般用类来调用。这个类的所有对象存的是该静态属性在静态区中的地址,所以所有操作的是同一个静态属性。---静态属性只能定义在类中。
B.静态方法---随着类的加载而加载到了方法区中的静态区,在方法被调用的时候才到栈内存执行。静态方法可以重载,但是不能重写,然而父子类中可以存在方法签名一致的静态方法。---如果父子类中存在方法签名一致的方法,而其中一个是静态方法,另一个要求也必须是静态方法。
C.静态代码块---只在类加载的时候执行一次,用于加载一些静态资源。---注意执行顺序---父类静态->子类静态->父类非静态->子类非静态
静态代码块和非静态代码块的异同点如下:
相同点:都是JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行(静态代码块 > 非静态代码块)。静态代码块只在第一次new时执行一次,之后不再执行。而非静态代码块每new一次就执行一次。
14.final---修饰量、方法、类
A.常量--定义好之后值不可变。---对于基本类型而言是指值不可变,对于引用类型而言是地址不可变。
Public void m(){
final int i = 7
m2(i);
}
Public void m2(int i);{
}
B.final修饰方法的时候,表示这个方法不可被重写,可以被继承,可以重载。
C.最终类---不能被继承
15.abstract---修饰类、方法
A.抽象类不能创建对象,但是有构造方法。
B.具体子类继承了抽象类之后,一定要重写其中的抽象方法。
C.抽象类中不一定有抽象方法。有抽象方法的类一定是抽象类。
D.抽象方法之间可以重载。
E.抽象方法不能用private/static/final修饰
F.如果抽象方法是默认权限修饰符,要求子类必须是同包子类
16.接口---用interface声明一个接口
A.接口中的方法一定是抽象方法(JDK1.8之前)
B.接口中的方法默认是用public修饰
C.接口中只能定义静态常量---public static final修饰
D.一个类可以实现多个接口,一个接口可以继承多个接口
E.统一接口,解耦
17.内部类---封装的形式之一
A.方法、成员、静态、匿名内部类
B.除了静态内部类以外,其他内部类中都不允许定义静态方法和静态属性,但是可以定义静态常量。
C.匿名内部类定义在方法中的时候,和方法内部类一样使用当前方法中的量的时候,要求这个量必须是一个常量。
D.类中定义的接口,以及接口中定义的类和接口都是静态。
18.包---用于将不同的类进行区分。用package来声明包,用import导入包。
19.垃圾分代回收机制---将堆内存分为了新生代和老生代。一个对象刚创建的时候是存在新生代的伊甸园区(Eden),经过一次回收之后如果这个对象没有被回收,那么这个对象就会挪到新生代的幸存区(Survivor),在幸存区如果经过多次会后这个对象依然存在,则会挪到老生代中。老生代的回收频率远远低于新生代。老生代的对象一旦发生回收,则可能会导致程序的卡顿甚至崩溃。发生在新生代的回收称之为初代回收(minor gc),发生在老生代的回收称之为完全回收(full gc)
20.类加载器。ClassLoader----引导类加载器,扩展类加载器,系统类加载器。---双亲委派机制。
API
1.Object---java中的顶级父类。getClass,equals,toString(默认打印对象的地址),wait,notify,notifyAll---要求必须学会手动重写equals
2.String---代表字符串的类
A.字符串是存到常量池中的。
B.不同的方法创建的字符串对象的个数
C.调用+对字符串进行拼接的时候实际上是调用了StringBuilder中的append方法。
D.注意字符串中的方法
3.正则---Pattern---用于指定一系列比较规则
4.包装类---每种基本类型都提供了对应的引用类型
A.自动封箱拆箱---JDK1.5
B.值的判断--- -128-127值在这个范围内则判断值,若值超出范围则判断地址。
Integer i1 = 100;
Integer i 2= 100;
i1 == i2 ->true;
5.日期类---日期格式的转换
6.数学类---BigDecimal-用于精确计算的。
7.异常---时java中一套用于问题的处理和反馈的机制
A.顶级父类---Throwable---Error,Exception(两个子类)
B.捕获异常:单个,统一,分批
C.编译时异常---在编译时期就必须处理---要么捕获要么抛出
D.运行时异常---在编译时无错但是运行时出错---往往是语法无错---可以处理可以不处理,但习惯上会处理
ArrayIndexOutofBoundsException
E.捕获异常的时候,要求小的异常先捕获,大的异常后捕获
F.一旦某个方法抛出了一个Excetpion,要求必须捕获一个Exception
G.finally---无论代码出现异常与否都必须执行一遍
8.集合---存储一组数据的容器。---为了标识集合中元素的类型,添加了泛型---由于泛型的要求,集合中只能存储对象。
A.集合的顶级接口---Collection---List,Set,Queue
B.线性集合---有序,单链---List和Queue---LinkedHahSet
C.List---列表,其中的元素是有序(保证存入顺序)可重复的。
1)ArrayList---本身是基于数组的。内存空间是连续,初始容量是10,每次在上一次的基础上扩容一半。10->15->22->33 是一个线程不安全的集合。增删较慢,但是查询较快。
2)LinkedList---本身是基于链表的,内存空间不连续的。是一个线程不安全的集合。增删较快,但是查询较慢。
3)Vector---本身是基于数组的,内存空间是连续的,初始容量是10,每次扩容一倍。10->20->40,是一个线程安全的集合。
4)Stack---栈---先进后出。
D.Set---散列集合---元素无序(底层内存无序)不可重复---HashSet---初始容量是16,加载因子是0.75f,底层基于HashMap实例
E.Queue---队列---先进先出
9.Comparator---比较器,用于指定比较规则,重写compare方法。如果返回一个负数,说明第二个参数大;如果返回的正数,说明第一个参数比较大。
10.Iterator---迭代器---用于迭代遍历元素。允许改变原集合。
11.泛型---参数化类型---ParameterizedType---JDK1.5
A.泛型对应的是引用类型(若是基本类型需转换为对应的包装类)
B.泛型类的定义---尽量掌握
C.掌握泛型的上限、下限
12.Map---映射---接口---要求键唯一,而值随意
A.map中的每一个键值对可以看做一个Map.Entry对象
B.掌握map的遍历---先获取键再获取值;获取键值对集合
C.会用几个实现类
1)HashMap---异步式线程不安全的映射,允许一个键为null,允许多一个值为null;初始容量是16,加载因子是0.75f,每次扩容一倍。
2)Hashtable---同步式线程安全的映射,不允许键值为null;初始容量是11,加载因子是0.75f,每次扩容不是一倍
3)ConcurrentHashMap---异步式线程安全的映射
13.File---代表文件或者目录的类,这个文件或者目录在计算机中不一定真实存在。
A.File中有许多方法并不会真正检查这个文件是否真实存在
B.删除目录,统计文件个数
14.路径---绝对路径和相对路径。
A.绝对路径是以盘符或者/开头。绝对路径的计算不以当前路径为基准。
B.相对路径是不以盘符或者/开头。相对路径计算需要以当前路径为基准。
15.流---是java中一套用于数据传输的API
A.根据传输形式:字节流、字符流
B.根据传输方向:输入流、输出流
C.四个基本流都是抽象类
D.数据来源:硬盘、输入设备、网络、输入设备
E.大部分的字符输出流都有缓冲区,所以需要冲刷缓冲区
F.可以用字符流完成的事儿都可以用字节流完成
G.字节流没有缓冲区
H.Close操作是为了释放对应的文件或者其他资源,流关闭但是并没有释放所占用的内存,需要将流对象强制置为null;
I.转换流是字符流和字节流之间的桥梁,转换过程中需要指定编码,如果不指定编码采用的是系统平台码。
J.合并流---当合并多个流的时候,需要一个Enumeration对象(本质上是迭代器)。
K.序列化/反序列化流---接口,关键字,版本号
16.线程---是一个单独的小任务。
A.定义线程---继承Thread,实现Runnable,实现Callable
B.多线程的并发安全问题---同步代码块
C.锁对象---共享的资源---共享对象、类的字节码,this---同步方法的锁对象是this
D.死锁---减少共享资源,避免锁嵌套
E.等待唤醒机制---必须和锁机制连用
F.守护线程---一旦被守护的线程结束,守护线程随之结束
G.线程的状态:创建、活跃、阻塞(不执行任务但是抢占资源)、冻结、消亡
H.wait和sleep的比较
17.套接字---用于网络通信的API
A.UDP---基于流但是不建立间接,不可靠,传输速度比较快,会对数据封包,每个包不超过64K
B.TCP---基于流需要建立连接,经过三次握手,传输速度比较慢,可靠,理论上不限制数据的大小。
18.可变参数---本质上是一个数组,一个方法内只能定义一个可变参数,并且要定义到参数列表的末尾
19.枚举---用enum关键字来定义,用于一些取值相对固定的场景。枚举常量要定义在枚举类的首行,枚举类中的构造函数默认是private修饰;枚举类中可以定义抽象方法。所有的枚举类都继承了java.lang.Enum类。
20.反射---剖析类,获取类的字节码以及对应的实例对象。
A.获取一个class对象
B.产生实例对象
21.设计模式---在开发过程中常见的一些情况---单例模式、装饰模式、观察者模式
A.单例模式---在全局过程中只存在一个唯一对象。---饿汉式、懒汉式
B.装饰模式---通过将一个对象传入来构建另一个对象以使用新对象中增强或者改变之后的方法的过程
C.观察者模式---选定一个观察目标,根据观察目标的改变,观察者做出对应的变化