为什么要抛出异常:
在编写程序的时候,很多情况不是程序本身出现了问题,而是外界环境造成的系统异常
用户输入的内容:int 来接收数字 期待用户输入数字
进行文件读取的时候,期待想要读取的文件永远存在 但是实际上没有保证文件永远存在
写入文件的时候 期待 磁盘永远有空间
异常 运行时异常 普通的异常
区别:
RunTimeException 与 Exception的区别
RunTimeException 在编译阶段可以用不强制处理
Exception 在编译阶段必须强制处理
Throw throws try catch finally
Throw 手动抛出一个异常
Throws 用在方法声明处,声明在方法上抛出一个异常,由该方法的调用处 处理异常
Try{} 存放可能出现异常的代码
Catch 匹配异常的类型,如果匹配成功,则进行异常的处理
Finally 永远执行的代码 主要用于资源关闭
今天知识点:
常用类库
StringBuilder
Stirng这个类 字符串的内容不可改变
public static void main(String[] args) {
// String str="hello"; // // changeStr(str); // // System.out.println(str);
StringBuilder sbd=new StringBuilder("hello");
changeStr(sbd);
System.out.println(sbd); } public static void changeStr(StringBuilder str) { str.append("world"); //hello world } |
可以频繁修改字符串,在实际使用中,一般来说首选使用String来完成,只有在需要频繁小修改字符串的时候才使用StringBuilder 后者StringBuffer
以上两个类除了线程的安全性之外,其他的功能全部一样
RunTime类
RunTime属于运行时的操作类,也是JVM运行时需要加载的类
RunTime类的方法
public native long totalMemory(); 取得总共的可用内存
public native long maxMemory(); 取得最大可用内存
public native long freeMemory(); 取得空闲内存
public native void gc(); 调用垃圾收集器,释放内存空间
范例:通过RunTime类取得JVM内存信息
System类
在程序以开始输出的时候就已经在使用这个类,属于系统类
System.out 输出
System.err 错误的输出
System.in 输入
System类常用的方法
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); |
数组拷贝
Object src 源数组 int srcPos 原数组开始拷贝的位置
Object desc 目标数组 int destPos目标数组的开始位置 int length长度
范例:数组拷贝
package org.wubo.test;
public class SystemDemo {
public static void main(String[] args) { int arr1[]=new int[] {1,2,3,4,5};
int arr2[]=new int[10];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
for(int i=0;i<arr2.length;i++) {
System.out.println(arr2[i]); } } }
|
方法2
public static native long currentTimeMillis(); 取得当前的系统时间
范例:取得当前的系统时间
long currentTime=System.currentTimeMillis(); //取得当前的时间
System.out.println(currentTime);
Date date=new Date(currentTime);
System.out.println(date); |
练习: 通过 currentTimeMillis()方法可以取得当前时间,计算一个操作过程所花费的时间是多少
例如 字符串拼接的操作 拼接10000次之后 得出总共用了多少时间?
package org.wubo.test;
import java.util.Date;
public class SystemDemo {
public static void main(String[] args) {
long start=System.currentTimeMillis(); //取得当前的时间
String str="";
for(int i=0;i<10000;i++) {
str+="hello world"; }
long end=System.currentTimeMillis(); //获得结束时间
System.out.println("时间:"+(end-start)+"ms"); } }
|
Finlize 作用
对象在创建的时候,存在构造方法表示对象属性的初始化
package org.wubo.test;
import java.util.Date;
public class SystemDemo {
public static void main(String[] args) {
Person per=new Person();
per=null;
System.gc();
} }
class Person{
public Person() {
System.out.println("出生了 地动山摇 满天乌云 代表妖孽出生了"); }
@Override public void finalize() throws Throwable { // TODO Auto-generated method stub System.out.println("我真的还想在活500年"); }
} |
范例:对象的创建与销毁
日期类
Date
主要掌握Date类与long类型相互转换的操作
Public Date(); 获取的当前时间
Pubic Date(long time) 把long类型的时间转换为Date类型
Public long getTime() 把Date类型的时间转换为long类型
范例:
public static void main(String[] args) {
Date date=new Date(); //把当前时间转换为long类型 long time=date.getTime(); System.out.println(time); //把long类型的time转换为Date类型输出 System.out.println(new Date(time)); } |
日期格式化类
SimpleDateFormat java.text
对于SimpleDateFormat 只有两种操作 第一种
把Date类型格式化为字符串类型 ,格式化的格式由用户给定
package org.wubo.test; import java.text.SimpleDateFormat; import java.util.Date; public class SystemDemo { public static void main(String[] args) { Date date=new Date(); //把当前时间转换为long类型 long time=date.getTime(); //System.out.println(time); //把long类型的time转换为Date类型输出 //System.out.println(new Date(time)); SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");
String d=sd.format(date);
System.out.println(d); } } |
第二种
把字符串日期格式 转换为Date类型格式
package org.wubo.test;
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;
public class SystemDemo {
public static void main(String[] args) throws ParseException {
Date date=new Date();
//把当前时间转换为long类型 long time=date.getTime();
//System.out.println(time);
//把long类型的time转换为Date类型输出 //System.out.println(new Date(time));
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");
String d=sd.format(date);
// 转换的内容由可能为用户输入的内容 输入的内容 Date mydate=sd.parse(d); //通过parse方法 转换
System.out.println(mydate);
} }
|
随机数类
Random 主要目的产生随机数
AtomicLong 原子数据
public static void main(String[] args) {
Random ran=new Random();
for(int i=0;i<10;i++) {
System.out.println(ran.nextInt(100)); //输出0~10范围内的随机数 输出10次 } } |
public static void main(String[] args) {
UUID uid=UUID.randomUUID();
System.out.println(uid); } |
Math类
java为用户提供的一些数学操作类,其中四舍五入的操作 以及PI的定义
public static void main(String[] args) { System.out.println(Math.round(15.5)); //16 System.out.println(Math.round(-15.6)); //-16 System.out.println(Math.PI); } |
大数字操作类
package org.wubo.test;
import java.math.BigInteger; import java.util.Random; import java.util.UUID;
public class RandomTest {
public static void main(String[] args) {
int max=Integer.MAX_VALUE;
System.out.println(max);
BigInteger bigA=new BigInteger(max+"");
BigInteger bigb=new BigInteger(max+"");
System.out.println( bigA.add(bigb)); //两个大整数相加
System.out.println(bigA.subtract(bigb)); //两个大整数相减的方法
System.out.println(bigA.multiply(bigb)); //两个大整数相乘
System.out.println(bigA.divide(bigb)); //相除 } }
|
Arrays类
数组的工具类,提供了一系列的数组相关的操作方法
Arrays类中提供的方法
BinarySearch()二分查找
int[]arr=new int[]{1,2,3,4,5,6,7,8,9};
int key=Arrays.binarySearch(arr, 3);
System.out.println(key); |
toSting() 理解该方法
Fill(); 给定数组 为其填充内容
int[]arr=new int[10];
Arrays.fill(arr, 20);
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]); } |
数组的比较
数组是 引用数据类型
public static boolean equals(long[] a, long[] a2) { if (a==a2) 两个地址相同 return true; if (a==null || a2==null) return false;
int length = a.length; if (a2.length != length) return false;
for (int i=0; i<length; i++) if (a[i] != a2[i]) return false;
return true; } |
使用Arrays.equals进行数组的排序
int[]arr=new int[] {1,2,3}; int[]arr2=new int[] {1,2,3}; boolean flag=Arrays.equals(arr, arr2); |
以上排序代码必须保持两个数组顺序必须一致的情况下才能进行正确比较
任务
实现二分查找
给定一个有序的数组
1 递归
2 非递归
3 二分加强版
任务2 实现改版的数组比较 equals
比较器:
Comparable 接口
接口代表一种标准 或者约定 Comparable接口进行对象的排序,如果一个类想要进行排序就必须实现这个接口
package org.wubo.test;
import java.util.Arrays;
class Person implements Comparable{
private int age;
private String name;
public Person(String name,int age) {
this.name=name;
this.age=age; } @Override public String toString() { return "Person [age=" + age + ", name=" + name + "]"; } @Override public int compareTo(Object o) { //该方法只需要反回3个值 0 -1 1 // TODO Auto-generated method stub Person p=null; if(o instanceof Person) { p=(Person)o; } if(this.age>p.age) {
return 1; }else if(this.age<p.age) {
return -1; }
return 0; }
} public class CompareTest {
public static void main(String[] args) {
Person per[]=new Person[] {new Person("张三",60),new Person("李四",70),new Person("隔壁薛哲",18)}; Arrays.sort(per);
String System.out.println(Arrays.toString(per)); } }
|
另一个比较器:
Comparator
如果一个类已经编写完成,但是在设计之初没有考虑到排序的情况,但是这个类已经编写好了,不太方便进行再次修改,又想完成排序的功能
package org.wubo.test;
import java.util.Arrays; import java.util.Comparator; class Person{ private int age; private String name; public Person(String name,int age) { this.name=name; this.age=age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person [age=" + age + ", name=" + name + "]"; } } class PersonCompare implements Comparator{ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub Person p1=null,p2=null; if(o1 instanceof Person && o2 instanceof Person) {
p1=(Person)o1;
p2=(Person)o2; }
if(p1.getAge()>p2.getAge()) {
return 1; }else if(p1.getAge()<p2.getAge()) {
return -1; } return 0; } } public class CompareTest { public static void main(String[] args) { Person per[]=new Person[] {new Person("张三",60),new Person("李四",70),new Person("隔壁薛哲",18)}; Arrays.sort(per,new PersonCompare()); System.out.println(Arrays.toString(per)); } } |
对象克隆
其实就是对象复制 Object类中存在clone方法,在使用克隆之前必须实现相应的接口
Clonealbe 接口
范例:
Person per1=new Person("张三",20);
Person per2=(Person)per1.clone();
System.out.println(per1==per2); |
总结:
StirngBuilder 和 StringBuffer 两个的区别?
StringBuilder异步处理 线程不安全
StringBuffer 同步处理 线程安全
Date
与long类型相互的转换
SimpleDateFormat(格式要求 yyyy-MM-dd)
对String进行格式化成date 把Date 格式化成String
System Runtime 类
获得当前的系统时间 gc方法 finlize方法的使用
排序比较
Compareable comparator