1. API
API是一些预先定义好的函数
- 我们无需理解起内部机制和细节,就可以使用其功能
- API也作为规则,面向接口开发
- java.lang包是java的核心,包含了java基础类,无需导包,默认存在
- java.util包是java中的工具包,包含各种常用工具包
2. Object
每个类都使用Object作为超类(顶级父类),一个类没有明确指定父类,默认继承Object类。
常用方法:
toString():默认返回对象地址值,重写后打印对象类型+属性
hashCode():返回对应对象的哈希码值
equals():默认实现==比较两个对象地址值 String默认重写了equlas(),比较的是两个字符串的具体内容
3.String
String底层是封装的char[]数组对象,被final修饰
3.1 创建String对象的两种方法:
- 通过创建对象:存放在堆内存中
char[] value = {‘a’,‘b’,‘c’};
String s = new String(value); - 直接创建:底层也会new String(),存放在堆中常量池,效率高
String s = “abc”;
3.2 String的常用方法
length()-查看字符串的长度
charAt()—获取指定下标处位置上的字符
lastIndexOf()-某个字符最后一次出现的位置
substring()-截取子串,如果参数有两个左闭右开[1,5)
equals()-判断两个串是否相等,String重写了Object的此方法,内容相同就返回true
startsWith()-判断是不是以参数开头
endsWith()–判断是不是以参数结尾
split()—以指定字符分割
trim()-去掉首尾两端的空格
getBytes()-把串转换成数组
toUpperCase()-变成全大写
toLowerCase()-变成全小写
String.valueOf(10)-把int类型的10转换成String类型
StringBuilder/StringBuffer
append()方法对String拼接的优化
4.正则表达式
正确的字符串格式规则。 常用来判断用户输入的内容是否符合格式的要求,严格区分大小写。
常用方法matches():判断当前字符串是否匹配正则表达式
5.包装类型
byte,short,long,double,float,boolean首字母大写为对应包装类型
int包装类型为Integer,char包装类型为Character
数字包装类(Byte,Short,Integer,Double,Float)的抽象父类为Number,提供了获取值的方法(比如byteValue())
5.1 Integer、Double
Integer创建对象:
- new Integer(2);
- Integer.valueOf(2); 包含256个缓冲对象,范围-128~127。
使用valueOf()时,指定范围内的值直接访问缓存对象。
Double创建对象:
- new Double(2.7);
- Double.valueOf(2.7); //和new没区别
常用方法:
Double.parseDouble(“String”);//Double字符串解析为十进制
Integer.parseDouble(“String”);//Integer字符串解析为十进制整数
5.2 自动装箱/拆箱
自动装箱:把基本类型包装成对应包装类型的过程
自动拆箱:从包装类型的值,自动变成基本类型的值
6.BigDecimal
创建对象:
BigDecimal(double val):将double转换为BigDecimal
BigDecimal(String val):将String类型字符串的形式转换为BigDecimal
常用方法:
Add(BigDecimal bd) : 做加法运算
Subtract(BigDecimal bd) : 做减法运算
Multiply(BigDecimal bd) : 做乘法运算
Divide(BigDecimal bd) : 做除法运算,除不尽时会抛异常
由于double本身进制转换问题,使用BigDecimal还会有不精确现象,所以使用重载的参数类型是String的构造函数
7. I/O流
7.1 Stream
流只能单方向流动
程序角度思考in为写入程序,out为从程序输出
数据只能从头到尾顺序的读写一次
7.2 字节流
字节流–针对二进制文件。
继承关系:
字节输入流:
InputStream:抽象类,不能创建对象,作为超类,提供共性方法
FileInputStream:文件字节输入流,子类,操作文件的字节输入流
BufferedInputStream:子类,缓冲字节输入流,高效
ObjectInputStream:反序列化流
字节输出流:
OutputStream:抽象类,不能创建对象,作为超类,提供共性方法
FileOutputStream:文件字节输出流,子类,操作文件的字节输出流
BufferedOutputStream:子类,缓冲字节输出流,高效
ObjectOutputStream:序列化流
7.3 字符流
字符流–针对文本文件
继承关系:
字符输入流:
Reader:抽象类,不能创建对象,作为超类,提供共性方法
FileReader:子类,操作文件的字符输入流,
BufferedReader:子类,缓冲字符输入流
字符输出流:
Writer:抽象类,不能创建对象,作为超类,提供共性方法
FileWriter:子类,操作文件的字符输出流,
BufferedWriter:子类,缓冲字符输出流
8.泛型、集合
8.1泛型Generics
特点:
可以通过泛型约束集合中的元素类型,在编译期间进行类型检查
可以实现通用代码的编写,使用表示元素的类型是Element类型
编译后会被删除,不出现源码中,不会影响JVM运行时性能
泛型可以在接口、类、方法上使用
8.2集合 Collection接口
集合的继承:
Collection :父级接口
List :接口,数据有下标,有序,可重复
ArrayList: 子类
LinkedList :子类
Set :接口,数据无下标,无序,不可重复
HashSet:子类
Map:接口,以<K,V>键值对的方式存数据
HashMap:子类
方法:
add():将指定对象添加到集合末尾
addAll():将指定集合中所有元素添加到此集合中末尾
remove():将指定对象从集合中移除
isEmpty():判断当前集合是否为空
size():查看此集合的元素数
contains():判断集合是否包含指定元素
toArray():将此集合转化为 数组
iterator():返回此集合的迭代器,用于遍历集合中的对象
9.进程和线程
进程的特点:独立性、动态性、并发性
线程:是操作系统OS能够进行运算调度的最小单位。
进程和线程的关系:一个操作系统中可以有多个进程,一个进程中可以包含一个线程(单线程程序),也可以包含多个线程(多线程程序),每个线程在共享同一个进程中的内存的同时,又有自己独立的内存空间.
实现多线程的方式:继承Thread 实现Runnable
线程的生命周期:
新建状态、就绪状态、运行状态、阻塞状态(等待阻塞,同步阻塞,其他阻塞)、死亡状态
多线程不安全问题的条件:在多线程程序中 + 有共享数据 + 多条语句操作共享数据
多线程不安全问题的解决:synchronized修饰可能出现问题的类,synchronized修饰代码块
10. 单例设计模式
单例设计模式最重要的是确保对象只有一个
- 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
- 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。
- 定义一个静态方法返回这个唯一对象。
10.1 懒汉式
不管以后会不会使用到该实例化对象,先创建了再说
优点:实现起来简单,没有多线程同步问题。
缺点:在某些特定条件下会耗费内存
public class Singleton {
// 将自身实例化对象设置为一个属性,并用static、final修饰
private static final Singleton instance = new Singleton();
// 构造方法私有化
private Singleton() {}
// 静态方法返回该实例
public static Singleton getInstance() {
return instance;
}
}
10.2 懒汉式
先不急着实例化出对象,等要用的时候才创建对象–延迟加载思想
优点:在某些特定条件下会节约了内存
缺点:有线程安全问题,可以通过加锁方式(同步代码块/同步锁)解决
public class Singleton {
// 将自身实例化对象设置为一个属性,并用static修饰
private static Singleton instance;
// 构造方法私有化
private Singleton() {}
// 静态方法返回该实例
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
11. 反射
反射可以在运行时获取一个类的所有信息
获取字节码对象
Class.forName(“类的全路径”);
类名.class
对象.getClass();