当前位置:   article > 正文

Java学习笔记(3.17)

Java学习笔记(3.17)

目录

一、异常

1、JVM的默认处理方案

2、异常处理

1使用try...catch方法

2、使用Throwable的成员方法

3、编译时异常与运行时异常区别

4、throws异常处理

5、自定义异常

6、throw和throws的区别

二、集合

1、集合类体系结构

2、collection集合

Collection集合常用方法

Collection集合的遍历

3、List集合

1、List集合特有方法

2、List并发修改异常

3、ListIterator

4、加强for循环

5、List集合子类特点

6、LinkedList集合特有功能

4、set集合

1、HashSet

1、哈希值

2、HashSet集合特点

2、LinkedHashSet

3、TreeSet

4、自然排序Comparable


一、异常

概述:程序出现了不正常的情况

Throwable是Java语言中所有的错误和异常的超类。

Error:严重问题,不需要处理。

Exception:称为异常类,它表示程序本身可以处理的问题

        • RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码

        • 非RuntimeException:编译期就必须处理的,否则程序不能通过编译,就更不能正常运行了

1、JVM的默认处理方案

1-把异常的名称,异常的原因以及异常的出现位置等信息输出在了控制台

2-程序停止运行

2、异常处理

自己解决的两个方法:

1使用try...catch方法

try...catch格式:

try{

        可能出现异常的代码;

}       catch(异常类名  变量名){

                异常的处理代码;

         }

  1. package myException;
  2. public class ExceptionDemo {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. System.out.println("开始");
  6. method();
  7. System.out.println("结束");
  8. }
  9. public static void method() {
  10. try {
  11. int arr[]= {1,2,3};
  12. System.out.println(arr[3]);
  13. }catch (ArrayIndexOutOfBoundsException e) {
  14. System.out.println("访问的数组不存在");
  15. e.printStackTrace();
  16. }
  17. }
  18. }

输出:

2、使用Throwable的成员方法

  1. package myException001;
  2. public class ExceptionDemo {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. System.out.println("开始");
  6. method();
  7. System.out.println("结束");
  8. }
  9. public static void method() {
  10. try {
  11. int arr[]= {1,2,3};
  12. System.out.println(arr[3]);
  13. }catch (ArrayIndexOutOfBoundsException e) {
  14. //System.out.println("访问的数组不存在");
  15. //e.printStackTrace();
  16. System.out.println(e.getMessage());
  17. //Index 3 out of bounds for length 3
  18. //输出错误原因
  19. System.out.println(e.toString());
  20. //java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
  21. //输出异常类名以及异常原因
  22. e.printStackTrace();
  23. /*
  24. java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
  25. at myException001.ExceptionDemo.method(ExceptionDemo.java:14)
  26. at myException001.ExceptionDemo.main(ExceptionDemo.java:8)
  27. */
  28. //输出异常类名,异常原因,异常代码的位置
  29. }
  30. }
  31. }

3、编译时异常与运行时异常区别

也成为受检异常和非受检异常

编译时异常----必须显式处理,否则程序就会发生错误,无法通过编译

运行时异常----无需显示处理,也可以和编译时异常一样处理。

  1. package myException002;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. public class ExceptionDemo {
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. method1();
  9. method2();
  10. }
  11. //运行时异常
  12. public static void method1() {
  13. try {
  14. int [] arr= {1,2,3};
  15. System.out.println(arr[3]);
  16. }catch(ArrayIndexOutOfBoundsException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. //编译异常--必须处理,否则无法通过编译
  21. public static void method2() {
  22. try {
  23. String s="2004-06-08";
  24. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  25. Date d=sdf.parse(s);
  26. System.out.println(d);
  27. }catch(ParseException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }

4、throws异常处理

格式:throws  异常类名;

*该格式跟在方法的括号后。

编译时异常必须、要进行处理,如果采用throws这种方案,谁调用谁处理。(可以用tr...catch处理)。

5、自定义异常

格式:

public  class  异常类名  extends  Exception{

        无参构造

        带参构造

}

如下:

  1. package myException003;
  2. public class ExceptionDemo extends Exception{
  3. public ExceptionDemo() {}
  4. public ExceptionDemo(String message) {
  5. super(message);
  6. }
  7. }

6、throw和throws的区别

throws

•用在方法声明后面,跟的是异常类名

•表示抛出异常,由该方法的调用者来处理

•表示出现异常的一种可能性,并不一定会发生这些异常

throw

•用在方法体内,跟的是异常对象名

• 表示抛出异常,由方法体内的语句处理

• 执行 throw 一定抛出了某种异常

二、集合

1、集合类体系结构

collection(单列):

可重复----List;--->ArrayList、LinkList....

不可重复----Set;---->HashSet、TreeSet....

Map(双列):

---->HashMap....

2、collection集合

概述:

是单例集合的顶层接口,它表示一组对象,这些对象也成为Collecttion的元素。

JDK不提供此接口的任何实现,它提供更具体的子接口(如Set和List)实现。

创建Collection集合的对象:

多态的方式。

具体的实现类ArrayList。

Collection集合常用方法

  1. package myCollection001;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. public class CollectionDemo02 {
  5. public static void main(String[] args) {
  6. Collection<String> c=new ArrayList<String>();
  7. System.out.println(c.add("hello"));
  8. System.out.println(c.add("world"));
  9. //boolean类型,永远返回true
  10. System.out.println(c.remove("world"));
  11. //boolean类型,有该元素将会删除,返回true;无该元素,返回false,不删除任何元素
  12. c.clear();
  13. //void返回类型
  14. System.out.println(c.contains("world"));
  15. //boolean类型,查询集合中是否有该元素
  16. System.out.println(c.isEmpty());
  17. System.out.println(c.size());
  18. }
  19. }
Collection集合的遍历

Iterator:迭代器,集合的专用遍历方式。

Iterator <E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到。

迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖于集合而存在的。

E next():返回迭代中的下一个元素。

boolean  hasNext():如果迭代具有更多的元素,返回true。

3、List集合

概述:

*有序集合,用户可以准确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素。并搜索列表中的元素。

*与Set集合不同,列表通常允许重复的元素。

特点:

*有序----存储和取出顺序一致。

*可重复----存储的元素可以重复。

1、List集合特有方法

  1. package myCollection002;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. public class ListDemo {
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. List<String> list=new ArrayList<String>();
  9. list.add("hello");
  10. list.add("world");
  11. list.add("java");
  12. list.add("world");
  13. System.out.println(list);
  14. //可重复
  15. Iterator<String> it= list.iterator();
  16. /* while (it.hasNext()) {
  17. String s=it.next();
  18. System.out.println(s);
  19. }
  20. */
  21. list.add(1,"java1");
  22. System.out.println(list);
  23. //指定位置添加元素
  24. System.out.println(list.remove(2));
  25. System.out.println(list);
  26. //删除指定位置的元素,返回删除的元素
  27. System.out.println(list.set(1,"java2"));
  28. //输出被修改的元素 修改指定位置的元素
  29. System.out.println(list);
  30. System.out.println(list.get(1));
  31. //获取指定位置元素
  32. }
  33. }
2、List并发修改异常

产生原因:迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致。

解决方法:用for循环遍历,然后用集合对象做对应操作即可。

3、ListIterator

列表迭代器----通过ListIterator()方法得到,是List集合特有的迭代器。用于程序员沿任意方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置。

常用方法:

E next();返回迭代中的下一个元素

boolean  hasNext();如果迭代具有更多元素,则返回true

E  previous();返回列表中的上一个元素

boolean hasPrevious();如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true

void  add(E e);将指定的元素插入列表

4、加强for循环

简化数组和Collection集合的遍历。

*增强Iterable接口的类允许其对象成为增强型for语句的目标。

*内部原理是一个Iterator迭代器。

增强for的格式

for  (元素数据类型  变量名:数组或Collection集合){

在此处使用变量即可,该变量就是元素。

}

  1. int []arr={1,2,3,4,5};
  2. for(int i:arr){
  3. System.out.println(i);
  4. }

选择:需要索引时使用普通for;单纯遍历的时候使用增强for。

5、List集合子类特点

常用子类:ArrayList、LinkedList

ArrayList:底层数据结构是数组,查询快,增删慢。

LinkedList:底层数据结构是链表,查询慢,增删快。

6、LinkedList集合特有功能

  1. package myCollection002;
  2. import java.util.LinkedList;
  3. public class CollectionDemo002 {
  4. public static void main(String[] args) {
  5. // TODO Auto-generated method stub
  6. LinkedList<String> ll=new LinkedList<String>();
  7. ll.add("hello");
  8. ll.add("world");
  9. ll.add("java");
  10. ll.addFirst("my");
  11. System.out.println(ll);
  12. //将元素添加到列表开头中
  13. ll.addLast("java01");
  14. System.out.println(ll);
  15. //将元素添加到列表结尾中
  16. System.out.println(ll.getFirst());
  17. //得到列表中第一个元素
  18. System.out.println(ll.getLast());
  19. //得到列表中最后一个元素
  20. System.out.println(ll.removeFirst());
  21. System.out.println(ll);
  22. //删除列表中第一个元素,并返回第一个元素
  23. System.out.println(ll.removeLast());
  24. System.out.println(ll);
  25. //删除列表中最后一个元素,并返回最后一个元素
  26. }
  27. }

4、set集合

特点:

不包含重复元素的集合。

没有带索引的方法,所以不能使用普通的for循环遍历。

1、HashSet

对集合的迭代顺序不做任何保证。

1、哈希值

JDK根据对象的地址或字符串或者数字算出来的int类型的数值。

Object类中有方法获取对象的哈希值----public  int  hashCode();

  1. package myCollection003;
  2. import java.net.MulticastSocket;
  3. public class HashSetDemo {
  4. public static void main(String[] args) {
  5. Person p1=new Person("小明",18);
  6. System.out.println(p1.hashCode());
  7. System.out.println(p1.hashCode());
  8. //同一个对象多次调用hashCode()返回值是相同的
  9. System.out.println("------------");
  10. Person p2=new Person("小明",18);
  11. System.out.println(p2.hashCode());
  12. //默认情况下,不同对象的哈希值是不相同的
  13. //通过方法重写可以实现不同对象的哈希值相同
  14. }
  15. }

特点:

默认情况下,不同对象的哈希值是不相同的

通过方法重写可以实现不同对象的哈希值相同

2、HashSet集合特点

*底层数据结构是哈希表。

*对集合的迭代顺序不做任何保证,也就是说不保证存储和取出的元素顺序一致。

*没有带索引的方法,所以不能使用普通for循环遍历。

*由于是Set集合,所以是不包含重复元素的集合。--->要保证元素唯一性,需要重写hashCode()和equals()。

2、LinkedHashSet

特点

*哈希表和链表实现的set接口,具有可预测的迭代次序。

*由链表保证元素有序,也就是说元素的存储和取出顺序是一致的。

*由哈希表保证元素唯一。

3、TreeSet

特点:

*元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的顺序进行排序,具体排序方式取决于构造方法-------TreeSet();根据其元素的自然排序进行排序。TreeSet(Comparator  comparator);根据指定的比较器进行排序。

*没有带索引的方法,所以不能使用普通for循环遍历。

*由于是Set集合,所以不包含重复元素。

4、自然排序Comparable

用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的。

自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法。

重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写。

  1. package myComparable001;
  2. public class Person implements Comparable<Person>{//实现该接口
  3. String name;
  4. int age;
  5. Person(String name,int age){
  6. this.age=age;
  7. this.name=name;
  8. }
  9. @Override
  10. public int compareTo(Person p) {
  11. //compareTo(T o)重写
  12. // TODO Auto-generated method stub
  13. int num1=this.age-p.age;
  14. //主条件
  15. int num2=num1==0?this.name.compareTo(p.name):num1;
  16. //次条件
  17. return num2;
  18. }
  19. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/306673
推荐阅读
相关标签
  

闽ICP备14008679号