Java核心类库

object类的equals()方法比较是地址值,和== 是一样的

重写的equals方法
public boolean equals(Object obj) {
    if(this == obj) {return true;}
    if(obj == null) {return false;}
    if(obj instanceof Student) {
        return this.id == (Student) obj.getId();
    }
    return false;
}

equals相同的方法对应的hashcode()方法返回值也要一致

使用printLn方法会自动调用toString()方法
String类中重写了equals和hashCOde()方法 比较的是内容

从 int 到 Integer

使用Integer.valueOf(123) 代替 new Integer(123) Java9后过时

从 string 到 integer

使用Integer.parseInt("123") 替换 new Integer("123")

从 Integer 到 int

使用 new Integer(123).intValue();
Java5开始 可以有自动装箱自动拆箱机制
自动装箱池 -128-127之间的数值内部已经装箱好了,可以提高效率

考点

Integer i1 = 128    Integer i2 = 128;
i1 == i2 // false
Integer i1 = 127    Integer i2 = 127
i1 == i2 // true

Double

parseDouble("1.234");
isNaN()
Number 是 Byte Short Int Long Float Double包装类们的父类

Boolean

parseBoolean("true") 只要传的字符串不是true就返回false

Chracter

isUpperCase(char) isLowerCase()
isDigit() toUpperCase() toLowerCase()

java.Math

BigDecimal

用于精确计算
如果得到的结果有无尽的小数,可以指定获取几位数,最后一位数的规则

BigInteger

用于表示比long还大的整数

String

final
Java9 开始 底层不再以char[]存储 以private final byte[]存储 不可变常量,可共享
常量池
把"内容"的字符串放在常量池,以后有相同的字符串时直接用已经声明的
str1 = "hello"; str2 = "hello"
str1 == str2 // true



方法
compareTo(String anotherString)
startWith
endWith
indexOf 根据字符查找索引
charAt()    查找索引对应的字符
lastIndexOf
subString
String[] split(String regex) 
replace()         替换第一个字符   
replaceAll()    替换所有符合的字符串
replaceFirst() 替换第一个符合的字符串
正则表达式
^[0-9]{n}$
str.match(String regex)

String 不可变常量
StringBuilder线程不安全效率较高
StringBuffer 线程安全效率较低

StringBuilder

无参构造时,初始长度为16
有参构造
可以自己指定容量
可以放字符串,此时容量为16+字符串长度
扩容机制 2倍+2

常用方法
insert() 可以指定插入位置
append(String str) 末尾插入
deleteCharAt() 删除单个字符
delete(int start, int end) 指定位置删除
replace()
reverse()
indexOf()
charAt()

Java8之前的日期相关类

  • System类
    currentTimeMills()
    作用 测试某段代码的执行时间/生成订单号
  • java.util.Date
    Date new Date()
    Date new Date(Long time)
    Long getTime()
    Date setTime(Long time)
  • java.text.SimpleDateFormat 把日期转成我们想要的格式
    new SimpleDateFormat()
    new SimpleDateFormat(String pattern) 加格式如:"yyyy-MM-dd HH:mm:ss"
    String sdf.format(Date date)
    Date sdf.parse(String date) 需要抛异常
  • java.util.Calendar 适用于全球的设置时间
    是一个抽象类


Java8以后增加了java.time包

LocalDate LocalDate.now()           只返回日期
LocalTime LocalTime.now()           只返回时间
LocalDateTime LocalDateTime.now()   返回日期和时间 中间用T隔开

以LocalDateTime为例说明方法 拥有不可变性
LocalDateTime of = LocalDateTime.of(year,month,day,hour,minus,second);
int of.getYear()等等获取年/月/日/时/分/秒等值
LocalDateTime withYear()等设置年/月/日/时/分/秒等值
LocalDateTime plusDays()等用于增加
LocalDateTime minusDays()等用于减少

Instance

作用不大,需要时看api

DateTimeFormatter

DateTimeFormatter static ofPattern(String pattern) 如"yyyy-MM-dd HH:mm:ss"
String format(TemporalAccessor temporal) TemporalAccessor是接口,实现类有Lo'ca'lDateTime等
TemporalAccessor parse(CharSequence text) CharSequence 是接口,实现类有String

Colletion接口

contains方法中如果要判断自己定义的类的实例是否相等,需要重写自定义类中的equals方法
containsAll(Collection c) c中的每个元素是否在调用集合中都存在
retainAll(Collection c) 把两个集合的交集取出来,有的话返回true
remove()
removeAll()
toArray()

Iterator iterator()

迭代时不允许使用remove方法删除元素
增强for循环 底层是使用了迭代器
List 集合 元素可重复 有序

ArrayList

查询方便,增删不方便
扩容机制 1.5倍


LinkedList

查询不方便(内部没有索引),增删方便(采用链表)

Stack

Vector

方法
set() 返回值是被修改的元素
remove() 返回值是被删除的元素
注意!subList() 返回的集合和原集合共用同一块内存空间,操作一个会修改另一个

Queue 类 先进先出

实现类是LinkedList

Set 集合

没有先后放入顺序 数据不能重复

HashSet

LinkedHashSet

TreeSet

有两种比较的规则:自然排序和比较器排序

自然排序
需要泛型类实现comparable接口 重写compareTo方法

比较器
Comparator comparator = (Student s1, Student s2) -> { return s1.getAge() - s2.getAge(); };

Map接口

Key不允许重复

HashMap

containsKey()
containsValue()
get()

SET

keySet() 返回所有的key
Collection values() 返回所有的value
Set entrySet()

TreeMap

LinkedHashMap

Hashtable 相比HashMap 是线程安全的,不能在key中放null

Properties

Collections 集合工具类

max()
min()
swap()实现集合中两个元素的交换
sort() 排序
shuffle()
copy()  
List list1 = Arrays.asList(new Integer[10]);
Collections.copy(list1,list);

java.lang.throwable是所有错误ERROR和异常EXCEPTION的超类
error类描述Java中严重的错误 如JAVA虚拟机挂了


Exception类

子类分两大类

  • RuntimeException 编译器检测不出来
    子类
  1. ArithmeticException
  2. ArrayIndexOutOfBoundsException
  3. NullPointerException
  4. ClassCastException
  5. NumberFormatException
  • IOException和其他异常 编译器能检测出来

异常被catch后 后续的代码可以继续执行,没有catch的话后续的代码无法运行
有多个catch时,小异常要放在大异常的上面
异常处理 : 注意 采用不同异常处理方法结果是i不一样的
try-catch
后续代码会执行
throws
异常后的代码不执行

父类抛出异常的方法,当子类重写时不能抛出比父类还大的异常,子类可以不抛异常
若父类中被重写的方法没有抛出异常时,则子类中重写的方法只能进行异常的捕获处理。

自定义异常类

  • 继承Exception类
  • 声明无参构造和字符串参数的有参构造
    疑问
    为什么Integer.parseInt()方法内抛出了异常,当时去调用的时候没有提示要抛异常或try-catch处理?

File类

描写文件的抽象信息,如大小,名称
可以操作文件和目录
删除目录的话必须是空目录


IO流

根据读写数据的基本单位分为

  • 字节流
    可以读写任意文件
  • 字符流
    只能读写文本文件
    根据流的方向分为
  • 输入流
  • 输出流
    根据流的角色分为
  • 节点流 如 FileInputStraem/FileOutputStream/FileReader/FileWriter
    直接和文件关联
  • 处理流 如 BufferedInputStream/BufferedOutputStream/BufferedReader/BufferWriter
    间接关联文件

字节流

  • InputStream
  • FileInputStraem
  • BufferedInputStream
  • DataInputStream
  • ObjectInputStream
  • OutputStream
  • FileOutputStream
  • BufferedOutputStream
  • DataOutputStream
  • ObjectOutputStream
  • PrintStream
    字符流
  • Reader
  • FileReader
  • BufferedReader
  • InputStreamReader
  • Writer
  • FileWriter
  • BufferWriter
  • OutputStreamWriter
  • PrintWriter

FileWriter 文件字节输出流

new FileWriter(String path) 如果文件存在,会清空文件内容
new FileWriter(String path,true) 如果文件存在,会追加内容
如果文件不存在会自动创建
如果文件存在会清空
FileReader 文件字符输入流
read()
多个重载方法
FileInputStream
FileOutputStream
单个字节或字符进行读写效率太低
准备相对适当的缓冲区 byte[] barr = new byte[1024]

BufferedInputStream

new BufferedInputStream(InputStream is)
实现手动输入到流的功能
new BufferReader()
OutputStreamWriter
从字符流到字节流的转换
InputStreamReader
从字节流到字符流转换

BufferedReader
readLine() 读一行
BufferedWriter
writeLine() 写一行
newLine() 换行

使用对象流的对象需要实现序列化接口
ObjectOutputStream
ObjectInputStream
Object readObject() 主要用于从输入流中读取一个对象并返回 无法通过返回值来判断是否读取到文件的末尾
成员变量加了transient 关键字表示该变量不参与序列化

RandomAccessFile
可选择从什么位置开始读内容
write() 方法会覆盖该位置的元素

多线程和多进程

一个进程里面可以开多个线程
线程是轻量级的
进程是重量级的
java.lang.Thread 是线程对象的父类
创建方式

  1. 继承Tread类 重写run方法,创建该类对象调用start方法
  2. 实现runnable接口重写run方法,创建该类的对象作为实参来构造thread类型的对象,使用Thread类型的对象调用start方法
    Thread类调用无参构造后调用run()方法啥也没干,里面调用runnable.run()


Thread currentThread() 获取当前线程
int getPriority() 最高优先级是10
线程优先级越高的线程不一定先执行,但是该线程获得时间片的机会会多一些
setPriority()
void join() 让当前线程等待
isDaemon
setDaemon() 必须在线程启动前设置 主线程结束后守护线程也随之结束
start()

Synchronized关键字

同步代码块 synchronized(实例对象,不同线程必须使用同一个实例对象,不能在这里new对象) {}
同步方法 在方法上 使用 synchronized 等价于 同步代码块synchronized(this) {} 或者使用类名。class 代替this
可以使用Collections.synchronizedList 和 Collections.synchronizedMap() 来替换Vector和HashTable

java.util.concurrent.locks.Lock接口

Java5以后开始有
实现类是 ReentranLock
lock()
unlock()
Lock锁的JVM底层性能会比synchronized关键字要好

Lock和synchronized的比较

  • Lock是显式锁,需要手动实现开启和关闭操作,而synchronized是隐式锁,执行锁定代码后自动释放。
  • Lock只有同步代码块方式的锁,而synchronized有同步代码块方式和同步方法两种锁。
  • 使用Lock锁方式时,Java虚拟机将花费较少的时间来调度线程,因此性能更好。

Object类

wait() 会自动释放锁 所以要在锁定的代码内部调用
notify() 也要在锁定的代码中调用
notifyAll()

生产者消费者模型

Stocke类
生产的方法
消费的方法
生产线程
消费线程
两个线程共用同一个Stocke类

**调用线程的第三种方法 **
实现callable接口,重写call()可以有返回值

FutureTask ft = new FutureTask(Callable call));
Thread thread = new Thread(ft);
thread.start();

调用线程的第四种方法
Executors工具类
ExecutorService newFixedThreadPool(int i)
submit()
shutdown()


TCP模型

  • 服务端
    ServerSocket(int port)
    Socket accpet()
    void close()
  • 客户端 可以启多线程
    Socket(String host,int port)
    InputStream getInputStream()
    OutputStream getOutputStream()
    void close()

UDP模型

DataGramSocket 需要指定byte数组的长度


DataGramPacket

InetAddress

注意 打印数组元素时,没有重写toString方法

反射 可以动态获取想要获取类的一切信息和操作它 即使是私有的

Class类
获取Class实例的两种方法

  • (常用)类名。class 如 int.class Integer.class
  • 对象。getClass()
  • 第三种
    包装类。TYPE 返回对应基本类型的classs实例
  • 第四种
    (常用)Class.forName("类的全类名")
  • 第五种
    使用类加载器 classLoader
    loadClass()
    其他方法
    Constructor getConstructor

Constructor 类
newInstance()

Class c1 = Class.forName()
Constructor constructor = c1.getConstructor()
constructor.newInstance()


Filed类
get(Object obj)
set(Object obj ,Object value)
getAccessible(Boolean b) true时表示可以暴力访问 访问修饰为priva的成员变量
getModifiers() 获取所有成员变量的访问修饰符
getType() 获取成员变量的类型
getName() 获取成员变量名
Method类

Method getDeclaredMethod()

使用Class实例可以获取其他信息

疑问(已解决)
既然通过反射可以调用私有的成员属性,为什么通过反射不能调用除了public权限的成员方法?
调用getMethod方法不行,调getDeclaredMethod()可以
其实所有的私有变量和方法都是可以获取和调用的,通过 getDeclaredFiled() or getDeclaredMehtod()
获取到了 filed or method实例,然后调用setAccessible(true)后就可以使用了

你可能感兴趣的:(Java核心类库)