一.Java异常类
1.异常的概述
异常就是程序出现了不正常的情况。
2.异常的体系结构
3.JVM默认处理异常的方式
如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:把异常的名称,错误原因及异常出现的位置等信息输出在了控制台 程序停止执行。
4.try-catch方式处理异常
(1)定义格式
try{
可能出现的异常代码
} catch(异常类名 变量名){
异常的处理代码
}
(2)执行流程
- 程序try里面的代码开始执行
- 出现异常,就会跳转到相应的catch里面去执行
- 执行完毕之后,程序还可以继续往下执行
5.Throwable成员方法
常用方法
方法名 | 说明 |
---|---|
public String getMessage() | 返回此 throwable 的详细消息字符串 |
public String toString() | 返回此可抛出的简短描述 |
public void printStackTrace() | 把异常的错误信息输出在控制台 |
6.编译时异常和运行时异常的区别
编译时异常
- 都是Exception类及其子类
- 必须显示处理,否则程序就会发生错误,无法通过编译运行时异常
运行时异常
- 都是RuntimeException类及其子类
- 无需显示处理,也可以和编译时异常一样处理
7.throws方式处理异常
(1)定义格式
public void 方法() throws 异常类名{
}
(2)示例代码
(3)注意事项
- 这个throws格式是跟在方法的括号后面的
- 编译时异常必须要进行处理,两种处理方案:try…catch…或者throws,如果采用throws这种方案,将来谁调用谁处理
[^ 1]运行时异常可以不处理,出现问题后,需要我们回来修改代码。
8.throws和throw的区别
throws
- 用在方法声明后面,跟的是异常类名
- 表示抛出异常,又该方法的调用者来处理
- 表示出现异常的可能性,并不一定会发生这些异常
throw - 用在方法体内,跟的是异常对象名
- 表示抛出异常,有方法体内的语句处理
- 执行throw一定抛出了某种异常
9.自定义异常
- 自定义异常类
public class ScoreExceptiion extends Exception {
public ScoreException(){};
public ScoreException(String message) {
super(message);
}
}
二.Java常用类
1.包装类
(1)基本数据类型包装类
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一:用于基本数据类型与字符串之间的转换
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Int |
long | Long |
float | Float |
double | Double |
char | Char |
boolean | Boolean |
(2)创建对象方式
Integer num = new Interger(0);
(3)自动装箱和自动拆箱机制
- 自动装箱
把基本数据类型转换为对应的包装类类型 - 自动拆箱
把包装类类型转换为对应的基本数据类型 - 示例代码
Integer num1 = new Integer(1); //基本数据类型转为包装类
int num2 = num1.intValue(); //包装类型转为基本数据类型
System.out.println(num1 +" "+ num2);
//1、包装类中的自动装箱拆箱机制
Integer num1 = 1; //自动装箱
int num2 = num1; //自动拆箱
System.out.println(num1 +" "+ num2);
反编译
Integer integer = Integer.valueOf(1);
int i = integer.intValue();
System.out.println((new StringBuilder()).append(integer).append("\t").append(i).toString());
(4)包装类的优点
- 某些方法的参数必须是对象,为了让基本数据类型的数据作为参数,提供包装类
- 包装类还提供更多的功能例如:
获得类型的最大值:Integer.MAX_VALUE
最小值:Integer.MIN_VALUE
将一个类型转为另一个类型:integer.doubleValue()
将字符串转化为数字:Integer.parseInt(“100”)
将数字转化为字符串:Integer.toString(100) - 其他特别重要的功能:可以实现字符串和基本数据类型的相互转换
2.String类
(1)String类概述
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!
(2)String类特点
- 字符串不可变,它们的值在创建后不能被更改
- 虽然 String 的值是不可变的,但是它们可以被共享
- 字符串效果上相当于字符数组( char[ ] ),但是底层原理是字节数组( byte[ ] )
(3)String类构造方法
- 常用的构造方法
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
String s = “abc”; | 直接赋值的方式创建字符串对象,内容就是abc |
(4)创建字符串对象两种方式的区别
- 通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同 - 直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
(5)帮助文档查看String常用方法
方法名 | 说明 |
---|---|
public boolean equals(Object anObject) | 比较字符串的内容,严格区分大小写(用户名和密码) |
public char charAt(int index) | 返回指定索引处的 char 值 |
public int length() | 返回此字符串的长度 |
3.StringBuffer和StringBuilder类
(1)概述
StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的
(2)String和StringBuilder类区别
- String类:内容是不可变的
- StringBuilder类:内容是可变的
(3)StringBuilder类的构造方法
- 常用的构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
(4)StringBuilder类添加和反转方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
public class TestStringBuilder {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("Test");
System.out.println(builder);
System.out.println(builder.append("builder"));//可以拼接几乎所有能看到的东西,并返回自身
System.out.println(builder.insert(5, "String"));//在指定位置追加字符串
System.out.println(builder.append(new Text()));//拼接啥玩意都能放进去
System.out.println(builder.charAt(2));//获取指定字符
builder.setCharAt(2,'神');//设置某个字符
System.out.println(builder);
builder.deleteCharAt(2);//删除指定的字符
System.out.println(builder);
System.out.println(builder.replace(20,30,"飘柔就是你油"));//替换指定位置的字符串
System.out.println(builder.delete(20,30));//删除这个区间里的字符串
System.out.println(builder.reverse());//倒转串
String string = builder.toString();//StringBuilder转String
System.out.println(string);
StringBuilder builder1 = new StringBuilder(string);//String转StringBuilder
System.out.println(builder1);
}
}
class Text{
StringBuilder builder = new StringBuilder("Test");
Text(){
}
}
(4)StringBuilder扩容机制:
`默认长度是16,如果传入参数则字符串的长度+16
在数组的长度没有装满时不会扩容
字符串达到最大长度后会重新创建一个:(原来最大长度<<1)+2的长度的新数组,并将原来的数据拷贝到新数组里
public class TestStringBuilder2 {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("Test");
System.out.println(builder.length());
System.out.println(builder.capacity());//底层数组长度默认为16+传进去的字符串长度
for (int i = 0; i < 16; i++) {
builder.append('a');
}
System.out.println(builder.capacity());//在数组没装满之前数组长度不变
builder.append("123456");
System.out.println(builder.capacity());//在长度超出之后,数组会扩容到原来的2倍+2的长度
}
}
3.Date类和DateFormat类
(1)Date类
- Date类概述
Date 代表了一个特定的时间,精确到毫秒 - Date类构造方法
方法名 | 说明 |
---|---|
public Date() | 分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒 |
public Date(long date) | 分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数 |
(2)Date类常用方法
方法名 | 说明 |
---|---|
public long getTime() | 获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值 |
public void setTime(long time) | 设置时间,给的是毫秒值 |
(3)SimpleDateFormat类
- SimpleDateFormat类概述
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。 - SimpleDateFormat类构造方法
方法名 | 说明 |
---|---|
public SimpleDateFormat() | 构造一个SimpleDateFormat,使用默认模式和日期格式 |
public SimpleDateFormat(String pattern) | 构造一个SimpleDateFormat使用给定的模式和默认的日期格式 |
- SimpleDateFormat类的常用方法
- 格式化(从Date到String)
public final String format(Date date):将日期格式化成日期/时间 - 字符串解析(从String到Date)
public Date parse(String source):从给定字符串的开始解析文本以生成日期
5.Calender类日期类
(1)Calendar类概述
Calendar 为特定瞬间与一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法 Calendar 提供了一个类方法 getInstance 用于获取这种类型的一般有用的对象。
该方法返回一个Calendar 对象。
其日历字段已使用当前日期和时间初始化:`Calendar rightNow = Calendar.getInstance();
(2)Calendar类常用方法`
方法名 | 说明 |
---|---|
public int get(int field) | 返回给定日历字段的值 |
public abstract void add(int field, int amount) | 根据日历的规则,将指定的时间量添加或减去给定的日历字段 |
public final void set(int year,int month,int date) | 设置当前日历的年月日 |
6.JDK8的日期类
属性 | 含义 |
---|---|
Instant | 代表的是时间相当于Date |
LocalDate | 代表日期,比如2022-01-14 |
LocalTime | 代表时间,比如12:20:30 |
LocalDateTime | 代表具体时间,比如2022-01-14 12:20:30 |
ZonedDateTime | 代表一个包含时区的完整的日期时间 |
Period | 代表时间段 |
ZoneOffset | 代表时区偏移量,比如+8:00 |
Clock | 代表时钟,比如获取美国纽约的时间 |
DateTimeFormatter | 日期和字符串格式转换 |
7.Math类和Random类
(1)Math类概述
Math 包含执行基本数字运算的方法
(2)Math中方法的调用方法
Math类中无构造方法,但内部的方法都是静态的,则可以通过 类名.进行调用
(3)Math类的常用方法
方法名 | 说明 |
---|---|
public static int abs(int a) | 返回参数的绝对值 |
public static double ceil(double a) | 返回大于或等于参数的最小double值,等于一个整数 |
public static double floor(double a) | 返回小于或等于参数的最大double值,等于一个整数 |
public static int round(float a) | 按照四舍五入返回最接近参数的int |
public static int max(int a,int b) | 返回两个int值中的较大值 |
public static int min(int a,int b) | 返回两个int值中的较小值 |
public static double pow (double a,double b) | 返回a的b次幂的值 |
public static double random() | 返回值为double的正值,[0.0,1.0) |
(4)Random类,随机数类
Math类中虽然为我们提供了产生随机数的方法Math.random0,但是通常我们需要的随机数范围并不是[0, 1)之间的double类型的数据,这就需要对其进行- -些复杂的运算。如果使用Math.random0计算过于复杂的话,我们可以使用例外-种方式得到随机数,即Random类,这个类是专门用来生成随机数的,并且Math.random(底层调用的就是Random的nextDouble0方法。
import java.util.Random;
public class TestRandom {
public static void main(String[] args) {
Random random = new Random();
System.out.println(random.nextInt(100));//获取100以内的随机整数
System.out.println(random.nextFloat());//获取浮点随机
}
}
8.枚举
/**
*使用普通方式定义日期常量
*/
public class DayDemo {
public static final int MONDAY =1;
public static final int TUESDAY=2;
public static final int WEDNESDAY=3;
public static final int THURSDAY=4;
public static final int FRIDAY=5;
public static final int SATURDAY=6;
public static final int SUNDAY=7;
}
枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。我们大概了解了枚举类型的定义与简单使用后,现在有必要来了解一下枚举类型的基本实现原理。实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类。
三.泛型
1.泛型概述
是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。
是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
2.泛型定义格式
<类型>:指定一种类型的格式。这里的类型可以看成是形参
<类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
3.泛型的好处
- 把运行时期的问题提前到了编译期间避免了强制类型转换
- 避免强制类型转换
4.泛型类定义格式
修饰符 class 类名<类型>{ }
- 示例代码
public class Generic<T>{
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
5.泛型方法
(1)定义格式
修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
(2)示例代码
public class Generic {
public <T> void show(T t) {
System.out.println(t);
}
}
6.泛型接口
(1)定义格式
修饰符 interface 接口名<类型>
(2)示例代码
- 泛型接口
public interface Generic<T>{
void show(T t);
}
四.容器
在Java当中,有一个类专门用来存放其它类的对象,这个类就叫做容器,它就是将若干性质相同或相近的类对象组合在一起而形成的一个整体 。Java的容器主要分为2个大类,即Collection和Map。Collection代表着集合,类似数组,只保存一个数字。而Map则是映射,保留键值对两个值。
List(对付顺序的好帮手)
: 存储的元素是有序的、可重复的。
Set (注重独一无二的性质):
存储的元素是无序的、不可重复的。
Queue (实现排队功能的叫号机):
按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
Map (用 key 来搜索的专家) :
使用键值对(key-value)存储,类似于数学上的函数 y=f(x),“x” 代表 key,“y” 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。
1.Map集合概述和特点
- 键值对映射关系
- 一个键对应一个值
- 键不能重复,值可以重复
- 元素存取无序
2.Map集合的遍历
我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
- 遍历丈夫的集合,获取到每一个丈夫根据丈夫去找对应的妻子步骤分析
- 获取所有键的集合。用keySet()方法实现