我们于2021/07/15 的学习目标是:异常和工具,核心任务为:
1、学习技术:
1)、异常处理方案
2)、自定义异常(了解)
3)、Math类
4)、可变长字符序列
5)、基本数据类型的包装类
6)、String类常用方法
7)、Date时间类
2、文档总结
1)、异常处理方案
异常抛出(throw):把异常抛出到上一层,谁调用谁解决
异常捕获(try...catch):
try{
有可能出现异常的代码;
}catch(FileNotFoundException e){
处理异常代码;
}catch(NullPointerException e){
处理异常代码;
}catch(Exception e){
所有异常都能接收;
}finally{
无论try中是否会出现异常,都会执行finally中的代码
//资源的关闭等代码
}
一个try的后面可以接 1~n个catch
try中如果一旦出现异常,try下面的代码不会执行,直接进入catch的判断
catch从上到下一次判断,满足哪一个catch捕获的类型,就执行对应的语句体
异常一旦捕获,程序执行过程中出现的异常按照指定方案解决,不会影响后续代码的执行
public class Exception {
public static void main(String[] args) {
System.out.println("主方法开始了");
//异常捕获
try{
System.out.println("try开始了");
System.out.println(5/0);
System.out.println("try结束了");
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("最终的代码无论是否出现异常都会执行");
}
System.out.println("主方法结束了");
}
}
2)、自定义异常(了解)
自定义异常指自定义的异常类型。
所有自定义的异常类型必须直接或者间接继承自Exception。
如果自定义异常为运行时期异常,需要直接或者间接的继承自RuntimeException
通过throw制造异常
//自定义异常
class CustomException extends Exception{
public CustomException() {
}
public CustomException(String message) {
super(message);
}
}
3)、Math类
Math类即数学类,内含静态工厂,由于在java.lang包下故不需要导包和初始化,直接使用。
static double abs(double a)
返回 double值的绝对值。
static double ceil(double a)
返回大于或等于参数且等于数学整数的double最小值(最接近负无穷大)
static double floor(double a)
返回小于或等于参数且等于数学整数的double最大值(最接近正无穷大)
static double max(double a, double b)
返回两个 double值中较大的 double
static int min(int a, int b)
返回两个 int值中较小的 int
static double pow(double a, double b)
返回第一个参数的值,该值是第二个参数的幂
static double random()
返回带有正号的 double值,[0.0,1.0)
[min,max] (int)(Math.random()*(max-min+1)+min)
生成[min,max]范围的随机整数
static long round(double a)
返回与参数最接近的 long ,并将关系四舍五入为正无穷大。 只针对小数点后一位
static double sqrt(double a)
返回 double值的正确舍入正平方根
4)、可变长字符序列
String是不可变长字符序列,StringBuilder和StringBuffer是可变长字符序列。
StringBuilder | StringBuffer |
线程不安全,但不保证同步 | 线程安全 |
相对效率较高 | 相对效率较低 |
适合使用在单线程下大量操作字符串,效率高 | 多线程下大量操作字符串建议使用 |
效率: StringBuilder > StringBuffer > String
扩容(append):int newCapacity = (oldCapacity << 1) + 2;
每次扩容 = 原容量 * 2 + 2
public class StringBuilferStringBuffer{
public static void main(String[] args){
StringBuilder builder1 = new StringBuilder();
StringBuilder builder2 = new StringBuilder(10);
StringBuilder builder3 = new StringBuilder("abc")
builder1.length();//获取长度
builder2.capacity();//内部存储数据的字节数组的长度
builder3.append(“defgh1234567890”);//扩容
builder1.insert(0,"haha"); //将字符串插入此字符序列
builder3.reverse();//序列的反向替换
builder3.toString()//转换成字符串
}
}
总结:int,Interger,new Interger()三者之间比较是否相等
- 两个基本数据类型只要数据值相等,==比较结果就相等
- 两个new 包装类比较,无论数据值是否相等,都不相等,因为new在堆中创建新的地址空间
- 两个Integer自动装箱的对象比较,在[-128,127]范围之内相等,否则返回new Integer不相等
- int与Integer|new Integer() ,只要数据值相等就相等,因为会发生自动拆箱
public class Class002_Data {
public static void main(String[] args) {
int i1 = 127;
int i2 = 127;
//自动装箱 Integer.valueOf()
Integer i3 = 127;
Integer i4 = 127;
Integer i5 = new Integer(127);
Integer i6 = new Integer(127);
Integer i7 = 128;
Integer i8 = 128;
// == 基本数据类型:比较数据值 引用数据类型:对象地址
System.out.println(i1==i2); //true
System.out.println(i3==i4); //true [-128~127]
System.out.println(i5==i6); //false
System.out.println(i1==i3); //true
System.out.println(i1==i5); //true
System.out.println(i3==i5); //false
System.out.println(i7==i8); //false new Integer(128)
}
}
5)、基本数据类型的包装类
基本 | 包装 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
boolean | Boolean |
float | Float |
double | Double |
包装类的优点:
- 类可以提供很多成员、功能
- 集合中之能存储引用数据类型,想要存储基本数据类型数据的时候,可以先转为对应的包装类型,再存储
- 基本数据类型与对应包装类型数据的默认值不同,当在具体业务下,比如区分账户余额的0与null两种状态,可以使用包装类型表示账户余额
基本数据类型的优点:有利于节约内存
自动拆装箱
- 自动装箱:基本à包装
- 自动拆箱:包装à基本
public class Data {
public static void main(String[] args) {
//自动装箱 Integer.valueOf(int)
Integer in = 98;
//自动拆箱 in.intValue()
int i = in;
boxTest(1.7,2.5); //自动装箱
}
static void boxTest(Double d1,Double d2){
System.out.println(d1+d2); //自动拆箱
}
}
6)、String类常用方法
char charAt(int index)
返回指定索引处的 char值。
int codePointAt(int index)
返回指定索引处的字符(Unicode代码点)。
int compareTo(String anotherString)
按字典顺序比较两个字符串。
str1.compareTo(str2)
返回值 : 0-->str1=str2 >0--> str1>str2 <0-->str1<str2
int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,忽略大小写差异。
String concat(String str)
将指定的字符串连接到此字符串的末尾
boolean contains(CharSequence s)
当且仅当此字符串包含指定的char值序列时,才返回true
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结尾
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开头
byte[] getBytes()
byte[] getBytes(String charsetName)
字符串转为字节数组,可以指定编码格式
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将此字符串中的字符复制到目标字符数组中。
int indexOf(String str)
返回指定子字符串第一次出现的字符串中的索引。
int indexOf(String str, int fromIndex)
从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。
int lastIndexOf(int ch)
返回指定字符最后一次出现的字符串中的索引
int lastIndexOf(int ch, int fromIndex)
返回指定字符最后一次出现的字符串中的索引,从指定的索引开始向后搜索
String intern()
返回字符串对象的规范表示
boolean isBlank()
如果字符串为空或仅包含 white space代码点,则返回 true ,否则 false
boolean isEmpty()
返回 true ,当且仅当length()是 0
int length()
返回此字符串的长度
String repeat(int count)
返回一个字符串,其值为此字符串的串联重复 count次
String replace(CharSequence target, CharSequence replacement)
将此字符串中与文字目标序列匹配的每个子字符串替换为指定的文字替换序列
String[] split(String regex)
将此字符串拆分为给定 regular expression的匹配项
String trim()
返回一个字符串,其值为此字符串,删除了所有前导和尾随空格,其中space被定义为其代码点小于或等于 'U+0020' (空格字符)的任何字符。 --> 只针对于半角空格
String strip()
返回一个字符串,其值为此字符串,并删除了所有前导和尾随 white space 。 --> 全角以及半角空格
String stripLeading()
返回一个字符串,其值为此字符串,并删除了所有前导 white space
String stripTrailing()
返回一个字符串,其值为此字符串,并删除所有尾随 white space
String substring(int beginIndex)
返回一个字符串,该字符串是此字符串的子字符串
String substring(int beginIndex, int endIndex)
返回一个字符串,该字符串是此字符串的子字符串。 一般结束索引不包含
char[] toCharArray()
将此字符串转换为新的字符数组
String toLowerCase()
使用默认语言环境的规则将此 String所有字符转换为小写
String toUpperCase()
使用默认语言环境的规则将此 String所有字符转换为大写
static String valueOf(boolean b)
返回 boolean参数的字符串表示形式
7)、Date时间类
Date类表示特定的时刻,精度为毫秒。
import java.util.Date;
public class Class001_Date {
public static void main(String[] args) {
//Date() 分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒。
Date date = new Date();
System.out.println(date);
//获取date日期的毫秒数 标准基准时间1970年1月1日00:00:00 GMT。
long time = date.getTime();
System.out.println(time);
//Date(long date) 分配 Date对象并初始化它以表示自标准基准时间(称为“纪元”)以来的指定毫秒数,即1970年1月1日00:00:00 GMT。
Date date2 = new Date(162634300000L);
System.out.println(date2);
//boolean after(Date when) 测试此日期是否在指定日期之后。
//boolean before(Date when) 测试此日期是否在指定日期之前。
System.out.println(date.before(date2)); //false
System.out.println(date.after(date2)); //true
System.out.println(date.toString());
}
}
日期格式转换器 SimpleDateFormat
目标:
将指定格式的字符串转为日期对象 parse(str)
将日期对象转为指定格式的字符串 format(date)
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Class002_SimpleDateFormat {
public static void main(String[] args) throws ParseException {
//SimpleDateFormat() 默认格式
SimpleDateFormat simple = new SimpleDateFormat();
Date date = new Date();
//日期对象转为字符串--> 默认格式
String str = simple.format(date);
System.out.println(str);
// 2020-12-12 13:15:55
String strTime = "2020-12-12 13:15:55 888";
//指定格式的转换器 SimpleDateFormat(String pattern)
SimpleDateFormat simple2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
//字符串转为日期对象
Date date3 = simple2.parse(strTime);
System.out.println(date3);
}
}