java基础快速回顾-中
Contents
Java某些类
Object类
- java的根类
toString()
- Object类的toString()方法默认返回该对象实现类的“类名+@+hashcode”值
- 看一个类是否重写了toString方法,可以通过直接打印对象名字,没有重写的显示对象地址值,重写的按照toString重写内容自定义打印
equals()
- Object类的equals()方法默认就是用==来进行比较
|
|
Objects类
- Objectsq工具类提供了一些静态方法来操作对象,这些方法是空指针安全,容忍空指针的
|
|
Date类
- 毫秒是日期计算的最小单位
- 0毫秒点:1970年1月1日00:00:00(中国属于东八区,会+8小时)
- 日期转化为时间戳,就是距离0毫秒点经过了多少毫秒
|
|
DateFormat类
- 根据自定义格式相互转化Date & String
|
|
Calendar类
|
|
System类
|
|
StringBuilder类
- 字符串底层是一个final常亮,每次对String修改后都需要新建一个String类型的对象,效率很低,为了应对这种情况,StringBuilder应运而生。
- StringBuiler是字符串缓冲区,可以提高字符串操作效率,可以看做是长度可以变化的字符串,底层是一个不被final修饰的byte数组,初始容量16,在修改过程中如果不够会自动扩容
|
|
基本数据类型的包装类
- 目的是提供一些方法来操作数据类型
Byte | Short | Integer | Long | Float | Double | Character | Boolean |
---|---|---|---|---|---|---|---|
byte | short | int | long | float | double | character | boolean |
-
装箱:基本类型——>包装类:
1 2
Integer i = new Integer(1); Integer i = Interger.valueOf(1);
-
拆箱:包装类——>基本类型:
1
int ii = i.intValue();
-
自动装拆箱
1 2 3
ArrayList<Integer> list = new ArrayList<>(); list.add(1);//自动装箱 int a = list.get(0);//自动拆箱
-
基本类型和字符串之间转换:
- 基本类型——>字符串
+""
- 包装类中的静态方法toString
- String类中的静态方法valueOf
- 字符串——>基本类型
- 包装类中的静态方法parseXX
- 基本类型——>字符串
Java集合
- 会使用集合存储数据
- 会遍历集合,把数据取出来
- 掌握每种集合的特性
- 所有集合的父类:Collection
Collection集合(单列集合)
- Collection< T >
公共方法:
- boolean add(E e)
- boolean remove(E e)
- void clear()
- boolean contains(E e)
- boolean isEmpty()
- int size()
- Object[] toArray()
Iterator迭代器
- boolean hasNext()
- E next()
|
|
增强for
|
|
泛型
|
|
- 集合如果不使用泛型,默认就是Object类型
|
|
|
|
|
|
List接口:Collection的第一个子类
- 有序的集合
- 允许存储重复的元素
- 有索引index,可以使用普通的for遍历
特有方法:(带索引)
- public void add(int index,E element)
- public E get(int index)
- public E remove(int index)
- public E set(int index,E element)
Vector
- 底层是数组,查询快,增删慢
- 单线程(所以被ArrayList取代)
ArrayList
- 底层是数组,查询快,增删慢
- 多线程
LinkedList
- 底层是双向链表,查询慢,增删快
- 多线程
特有方法:
- public void addFirst(E e) == public void push(E e)
- public void addLast(E e) == public void add(E e)
- public E getFirst()
- public E getLast()
- public E removeFirst() == public E pop()
- public E removeLast()
Set接口:Collection的第二个子类
- 无序的集合
- 不允许存储重复元素(原理上来看,必须保证元素类重写hashcode和equals方法)
- 没有索引index,不能使用普通的for遍历,只能用迭代器遍历
TreeSet
- 底层是二叉树,一般用于排序
HashSet
- 底层是
哈希表(数组+红黑树)
实现的,查询速度极快
LinkedHashSet(有序)
- 底层是
哈希表(数组+红黑树)+链表
实现的,可以保证存取顺序
Collections工具类
|
|
Map集合(双列集合)
-
Map< K,V >
-
双列集合,一个元素包含两个值
-
key不能重复,value不能重复,且一一对应
公共方法:
- public V put(K key,V value):key存在返回null,key不存在返回被替代的value
- public V get(Object key):key存在返回对应value,key不存在返回nul
- public V remove(Object key):key存在返回被删除value,key不存在返回null
- public boolean containsKey(Object key):判断是否包含指定key
- public boolean containsValue(Object value):判断是否包含指定value
- keySet:Map集合的第一种遍历方式
|
|
- entryset:Map集合的第二种遍历方式
|
|
- 如果要存储自定义元素,对于key的元素,必须重写hashCode和equals方法来保证key唯一
HashMap
- 底层是
哈希表(数组+红黑树)
- 无序
LinkedHashMap
- 底层是
哈希表(数组+红黑树)+链表
- 有序(存储顺序==取出顺序)
Hashtable
- 不能存储null键,null值,已经被hashmap取代
- Hashtable的子类Properties依然在IO流中使用
JDK9中集合添加的优化
- 只适用于List,Set,Map接口
- of返回值是一个不能改变的集合,之后不能再使用add,put等方法
- Set和Map在调用of方法时,不能有重复的元素,否则会报错
|
|
可变参数
- 当参数列表数据类型确定,但是参数个数不确定,就可以使用可变参数
- 底层会根据传递参数的不同创建不同长度的数组(0到多个)
- 一个方法中最多有一个可变参数
- 如果参数有多个,可变参数必须写在参数列表最后
|
|
异常
- 语法错误——>编译失败
- 异常——>编译/运行失败
- Throwable的两个子类:Error 和 Exception
- Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
- Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
异常分类
Exception:编译期异常
- 在方法名后 throws Exception:虚拟机中断程序打印处理
- try catch处理异常:无需中断,程序正常执行
RuntimException:运行期异常
- try catch处理异常
Error:错误
- 程序无法治愈,必须修改源码
异常产生过程
异常的处理
- 5个关键字:try、catch、finally、throw、throws
throw
- 只能用在方法内部
- 后边的对象只能是Exception或者Exception子类对象
- 必须处理throw的异常对象
- 如果throw RuntimeException或者RuntimeException子类对象,可以自动交给JVM处理,自己不做手动处理
- 如果throw 编译期异常,必须手动处理,要么连续throws到jvm处理,要么try…catch…
|
|
throws
- 一步一步往上抛
- 如果同时throw多个异常且含有父子关系,throws后面只需写 父类
try…catch…
- try中如果产生了异常,会直接执行catch中内容,之后执行try…catch后代码
- try中如果没有异常,不会执行catch中内容,直接执行try…catch后代码
- Throwable中的3个异常处理的方法
- getMessage()
- toString()
- printStackTrace():默认
finally
- 解决try语句块中异常后的代码无法执行的问题
- 不能单独使用,只能和try一起使用
- 一般用于资源释放
- 避免在finally语句中写return语句
异常处理时注意:
- 多异常分别处理,多异常一次捕获多次处理,多异常一次捕获一次处理
- 父类方法抛出多个异常,子类重写时只能抛出同样异常 or 异常子类 or 不抛
- 父类方法没有抛出异常,子类重写时也不能抛异常,如果子类有异常只能捕获
自定义异常类
- 继承Exception:编译时异常
- 继承RuntimeException:运行时异常
|
|
多线程
- 进程是操作系统资源分配的基本单位,负责为程序分配内存空间
- 而线程是任务调度和执行的基本单位,负责程序实际的执行
- 一个进程中至少有一个线程
- 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。
- 每个线程拥有自己的栈段, 寄存器的内容,栈段又叫运行时段,用来存放所有局部变量和临时变量。
Thread类
- java程序属于抢占式调度,哪个线程优先级高就会优先执行哪个线程;同一优先级会随机选择一个执行
|
|
多线程内存图
|
|
sleep方法
- 是当前正在执行的线程暂停
|
|
Runnable类:创建多线程的第二种方式
|
|
- 好处:
- Runnable方式避免了单继承的局限性
- Runnable方式降低了耦合性:RunnableImpl设置线程 & Thread开启线程 解耦
使用匿名内部类的方式创建线程
- Thread和Runnable两种方式都可以
线程安全问题
- 多线程访问了共享的数据,会出现线程安全问题
- 这种线程安全问题是不能发生的,我们要确保某个时刻只能由一个线程访问共享资源
解决线程安全问题
-
同步代码块
1 2 3
synchronized(同步锁){ //多线程访问共享数据的代码 }
- 同步方法
- 方法修饰符:synchronized
|
|
- Lock锁机制
- Lock接口中的两个方法:
- void lock():获取锁
- void unlock():释放锁
|
|
线程状态
|
|
- 一共6种状态
- sleep(参数) 和 wait(参数) 其实都是一样的
- notify() 是唤醒一个等待的线程,notifyAll()是唤醒所有等待的线程
线程间通信(等待唤醒机制)
- 多个线程处理同一个资源,一个生产,一个消费
- wait和notify方法必须要使用同一个锁对象调用
- wait和notify方法属于Object类的方法
- wait方法和notify方法必须在同步代码块或者同步函数中使用
生产者&消费者问题
- 以包子铺为例
|
|
线程池
- 线程池就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建对象的操作,无需反复创建线程而消耗过多资源
|
|