2018.4.17
collection
Object数组
数组:保存大量数据采用的方式。
8大基本数据类型 byte 1字节 short 2 int 4 long 8 float 4 double 8 char 2 boolean 不计
自定义类对象:Student Player
java中的类对象 String
数组局限性:
1.只能保存一种数据类型的数据。
2.数组的元素个数创建时是确定的,无法对当前数组进行元素个数修改。(此前是新建数组赋值过去)
3.数组里面保存的元素内存空间是连续的。
问题:
如果我需要保存任意类型的一个数组,所有的数据类型都可以在这个数组中保存。
用Object数据类型,因为Object是java中所有类的直接父类或者间接父类 基类/根类
public class Demo1 {
public static void main(String[] args) {
//创建了一个数据类型的Object数组,元素个数为5
Object[] arr = new Object[5];
arr[0] = "过年放假通知已经下来了,我不能告诉你们";
arr[1] = 8;
arr[2] = 0.5f;
arr[3] = new Demo1();//如果当你没有自定义构造方法,那么java编译器会默认提供一个无参的构造方法
arr[4] = true;
System.out.println(Arrays.toString(arr));
}
}
结果:
[过年放假通知已经下来了,我不能告诉你们, 8, 0.5, com.bitware.collection.Demo1@69066caf, true]
集合
重点知识:
【集合】 集合就是存储对象的【容器】
---| Collection 集合的总【接口】,规定了很多方法,要求所有【遵从】该接口的类,全部实现。
------|List 接口 如果【遵从】了List接口,要求实现所有List中的方法。,具有List集合的特征:
有序(添加顺序),可重复
------|Set 接口 如果【遵从】了Set接口,要求实现所有Set中的方法。,具有Set集合的特征:
无序(添加顺序),不可重复
从Collection开始学习,学习完Collection里面的方法,基本上List和Set就是在基础之上做一个
添加操作
[背过]
增
add(Object o);//添加一个元素 任意类型
addAll(Collection c); //添加另一个集合
删
clear();//清空整个集合
remove(Object o);//删除该集合中指定的元素
removeAll(Collection c);//删除两个集合中的交集
retainAll(Collection c);//保留两个集合中交集
查
size();//获取当前集合的有效元素个数。
toArray();//把当前集合中所有的元素转换成Object类型的数组返回
public class Demo2 {
public static void main(String[] args) {
//Collection是一个接口,而接口是没有自己的类对象的,但是可以指向【遵从】改接口的类对象。(多态)
//借助于最常用集合ArrayList来完成。
Collection c = new ArrayList();
//添加方法 add(object o)
c.add("测试");
c.add("天气好热");
c.add("明天气温0-8");
System.out.println(c);
//添加方法 addAll(Collection c)
Collection c2 = new ArrayList();
c2.add("测试1");
c2.add("卡布奇诺");
c2.add("天气好热");
//将C2添加到C中
c.addAll(c2);
System.out.println(c2);
System.out.println(c);
//clear() 清空集合中所有元素
//c2.clear();
//System.out.println(c2);
//remove(Object o)
//c.remove("测试");
//System.out.println(c);
//removeAll(Collcetion c)
//c.remove(c2);
//System.err.println(c);
//retainAll(Collection c)
c.retainAll(c2);
System.out.println(c);
System.out.println(c.size());
System.out.println(Arrays.toString(c.toArray()));
}
}
结果:
[测试, 天气好热, 明天气温0-8]
[测试1, 卡布奇诺, 天气好热]
[测试, 天气好热, 明天气温0-8, 测试1, 卡布奇诺, 天气好热]
[天气好热, 测试1, 卡布奇诺, 天气好热]
4
[天气好热, 测试1, 卡布奇诺, 天气好热]
【背过】
判断方法:
isEmpty();//是否为空
contains(Object o);//是否包含当前元素
containsAll(Collection c);//是否包含指定集合里面的所有元素
equals(Collection c); // 判断是否想相等
public class Demo3 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("akm");
c.add("kar98k");
c.add("aug");
c.add("m164");
c.add("ump9");
Collection c2 = new ArrayList();
c2.add("akm");
c2.add("kar98k");
c2.add("aug");
c2.add("m164");
c2.add("ump9");
//equals方法,比较这两个集合之间里面的元素是否完全相同
//放入的位置也会要求
System.out.println(c.equals(c2));
//isEmpty方法
c2.clear();
//c2.add("p92");
//System.out.println(c2.isEmpty());
//contains(object o)
System.out.println(c.contains("aug"));
System.out.println(c.contains("p92"));
//containsAll(Collection c);判断传入的集合是否是当前集合的子集合。
System.out.println(c.containsAll(c2));
}
}
结果:
true
true
false
true
高级版本的参数合法性处理方式
try-catch使用的注意事项
1.在没有捕获异常的情况下,程序中一旦发生了异常,程序就会在发生异常的地方停下来,不会继续执行后面的代码。
2.一旦异常被Try-catch结构捕获,那么java虚拟机就会认为当前代码中不存在异常,可以继续运作。
3.在try-catch语句块里面,如果出现了多种异常,这里可以加上多个catch语句块,对不同的异常做区别对待。
4.在try-catch语句块中,如果存在大范围的异常,通常会放到整个catch语句块最后一个,如果放到前面
可能会导致之后的catch捕获无效。放到最后的这样的异常处理模块,是当前整个代码的异常的最终处理方案。
eg:到医院看病,看病,发烧按照感冒发烧处理,不能到了医院就做手术。
public class Demo3 {
public static void main(String[] args) {
test(1,0,null);
}
public static void test(int num1, int num2,int [] arr){
int ret = 0;
try {
ret = num1 / num2;
arr[0] = 5;
}catch(ArithmeticException e) {//算术异常
e.printStackTrace();
}catch(NullPointerException e) {//指针异常
e.printStackTrace();
}catch(Exception e) {//放到最后的所有异常的最终处理方法
e.printStackTrace();
}
System.out.println("这条代码会允许吗??");
}
}
结果:
java.lang.ArithmeticException: / by zero
at com.bitware.exception.Demo3.test(Demo3.java:27)
at com.bitware.exception.Demo3.main(Demo3.java:20)
这条代码会允许吗??
java异常处理 抛出异常。
使用关键字 throw 和 throws
throw是用来在方法中用来抛出异常的关键字
格式:throw new 异常类型();
一旦在代码中有抛出异常,要求在方法声明之后添加throws,表示当前抛出的异常有哪些?
方法(参数) throws 异常类型。
使用抛出异常的注意事项:
1.如果在代码中存在throw new 异常类型();该语句,那么这条语句之后的代码是不会执行的。
2.如果代码中存在多种异常需要抛出,不能把异常写到同一个代码块中,否则只能处理一个异常,
剩下的异常都会变成unreachable code.
3.不同的异常分情况抛出,需要使用if-else if结构,在不同的if块中,抛出不同的异常。
4.如果代码中出现了多种异常,需要在函数之后声明,不同的声明用逗号隔开即可。
捕获异常和抛出异常:
捕获在哪里都可以,但是抛出异常一旦涉及到用户层面的,一定不能抛出,必须捕获。
public class Demo4 {
public static void main(String[] args)
throws NullPointerException,ArithmeticException{
//如果调用一个存在抛出异常的方法,通常有两种处理方式,
//第一种处理当前异常。
/* try {
testThrow(null, 1, 2);
}catch(NullPointerException e) {
e.printStackTrace();
}catch(ArithmeticException e) {
e.printStackTrace();
}
*/
//第二种方式:继续往外抛
testThrow(null, 1, 2);
}
/**
*
* @param arr
* @exception NullPointerException
*/
public static void testThrow(int[] arr,int num1, int num2) throws NullPointerException,ArithmeticException {
//参数合法性判断
if(null == arr || arr.length == 0) {
//之前的处理方案,打印错误,停止函数。
//System.out.println("");
//return;
throw new NullPointerException("测试一下throw");//戛然而止 跳出去让外面处理
//System.out.println(""); unreachable code.
}else if (0 == num2) {
throw new ArithmeticException();
}
int ret = num1 / num2;
arr[1] = 0;
}
}
结果:
Exception in thread "main" java.lang.NullPointerException: 测试一下throw
at com.bitware.exception.Demo4.testThrow(Demo4.java:56)
at com.bitware.exception.Demo4.main(Demo4.java:41)
自定义异常类
class 自定义异常类名 extends Exception {
public 自定义异常类名(String message) {
super(message);
}
}
class NoGirlFriendException extends Exception {
//String message 是当前异常的详细信息,用来传递给Exception的构造方法,保存改异常信息
public NoGirlFriendException(String message) {
super(message);
}
}
public class Demo5 {
public static void main(String[] args) throws NoGirlFriendException {
//第一种try catch
try {
buyOneFreeOne(false);
} catch (NoGirlFriendException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//第二种 声明后throws.
buyOneFreeOne(true);
}
//要在函数方法声明的末尾添加该异常,用 throws关键字。
public static void buyOneFreeOne(boolean isLonely) throws NoGirlFriendException {
if(isLonely) {
//直接创建自定义异常的匿名类对象,通过throw关键字抛出
throw new NoGirlFriendException("不用了谢谢,没有女票");
}
System.out.println("买一送一来一份。");
}
}
结果:
买一送一来一份。
Exception in thread "main" com.bitware.exception.NoGirlFriendException: 不用了谢谢,没有女票
at com.bitware.exception.Demo5.buyOneFreeOne(Demo5.java:40)
at com.bitware.exception.Demo5.main(Demo5.java:34)