3

Java笔记(6)

 2 years ago
source link: https://segmentfault.com/a/1190000040429850
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

异常和集合

1.异常概述

异常:就是程序出现了不正常的情况
异常体系:
Throwable分为Error和Exception
Exception分为RuntimeException和非RuntimeException
Error:严重问题,需要处理
Exception:称为异常类,它表示程序本身可以处理的问题
●RuntimeException: 在编译期是不检查的,出现问题后,需要我们回来修改代码
●非RuntimeException:编译期就必须处理的,否则程序不能通过编译,就更不能正常运行了

2. JVM的默认处理方案

如果程序出现了问题,我们没有做任何处理,最終JVM会做默认的处理
●把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
●程序停止执行

3.异常处理之try..catch...

●格式:
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;}
执行流程:
程序从try的代码开始执行
出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系統
当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理
执行完毕之后,程序还可以继续往下执行。

4. Throwable的成员方法

方法名说明public String getMessage0返回此throwable的详细消息字符串public String toString0返回此可抛出的简短描述public void printStackTrace0把异常的错误信息输出在控制台

5.编译时异常和运行时异常的区别

Java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常
所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常
编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译。
运行时异常:无需显示处理,也可以和编译时异常一样处理。

6.异常处理之throws

虽然我们通过try..catch…可以对异常进行处理,但是并不是所有的情况我们都有权限进行异常的处理
也就是说,有些时候可能出现的异常是我们处理不了的,这个时候怎么办呢?
针对这种情况,Java 提供了throws的处理方案
格式:
throws 异常类名;
注意:这个格式是跟在方法的括号后面的
编译时异常必须要进行处理,两种处理方案: try…catch ...或者throws,如果采用throws这种方案,将来谁调用谁处理。
运行时异常可以不处理,出现问题后,要我们来修改代码。

7. throws和throw的区别

throwsthrow●用在方法声明后面,跟的是异常类名●用在方法体内,跟的是异常对象名●表示抛出异常,由该方法的调用者来处理●表示抛出异常,由方法体内的语句处理●表示出现异常的一种可能性,并不一定会发生这些异常●执行throw 一定抛出了某种异常

8.自定义异常

格式:
public class 异常类名 extends Exception {
无参构造
带参构造
}
范例:

public class ScoreException extends Exception {
        public ScoreException() {}
        public ScoreException (String message) {
              super (message) ;
        }
}

二.Collection集合

1.集合体系结构

集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变。
集合可以分为Collection(单列)和Map(双列)。
Collection可以分为List(可重复)和Set(不可重复)。

2.Collection集合的概述和使用

Collection集合概述:
●是单例集合的顶层接口, 它表示一组对象, 这些对象也称为Collection的元素
●JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List) 实现
创建Collection集合的对象:
●多态的方式
●具体的实现类ArrayList

3. Collection集合常用方法

方法名说明boolean add(E e)添加元素boolean remove(Object o)从集合中移除指定的元素void clear()清空集合中的元素boolean contains(Object o)判断集合中是否存在指定的元素boolean isEmpty()判断集合是否为空int size()集合的长度,也就是集合中元素的个数

4.Collection集合的遍历

Iterator:迭代器,集合的专用遍历方式
●Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合的iterator()方法得到
●迭代器是通过集合的iterator()方法得到的, 所以我们说它是依赖于集合而存在的
Iterator中的常用方法:
●E next():返回迭代中的下一个元素
●boolean hasNext(): 如果迭代具有更多元素,则返回true

三.List集合

1. List集合概述和特点

List集合概述:
●有序集合(也称为序列), 用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素。
●与Set集合不同,列表通常允许重复的元素
List集合特点:
有序:存储和取出的元素顺序一致
可重复:存储的元素可以重复

2.List集合特有方法

方法名说明void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)删除指定索引处的元素,返回被删除的元素E set(int index,E element)修改指定索引处的元素,返回被修改的元素E get(int index)返回指定索引处的元素

3.并发修改异常

并发修改异常:
●ConcurrentModificationException
产生原因:
●迭代器遍历的过程中,通过集合对象修改了集合中的元素,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
解决方案:
●用for循环遍历,然后用集合对象做对应的操作即可

4. Listlterator

Listlterator:列表迭代器:
●通过List集合的listlterator()方法得到, 所以说它是List集合特有的迭代器
●用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置。
Listlterator中的常用方法:
●E next(): 返回迭代中的下一个元素
●boolean hasNext():如果迭代具有更多元素,则返回true
●E previous(): 返回列表中的上一个元素
●boolean hasPrevious(): 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
●void add(E e):将指定的元素插入列表

5.增强for循环

增强for:简化数组和Collection集合的遍历
●实现Iterable接口的类允许其对象成为增强型 for语句的目标
●它是JDK5之 后出现的,其内部原理是一个Iterator迭代器
增强for的格式
●格式: .
for(元素数据类型变量名:数组或者Collection集合) {
//在此处使用变量即可,该变量就是元素
}
●范例: .

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

输出:12345

6.List集合子类特点

List集合常用子类: ArrayList, LinkedList
●ArrayList: 底层数据结构是数组,查询快,增删慢
●LinkedList: 底层数据结构是链表,查询慢,增删快

7.LinkedList集合的特有功能

方法名说明public void addFirst(E e)在该列表开头插入指定的元素public void addLast(E e)将指定的元素追加到此列表的末尾public E getFirst()返回此列表中的第一个元素public E getLast()返回此列表中的最后一个元素public E removeFirst()从此列表中删除并返回第一个元素public E removeLast()从此列表中删除并返回最后一个元素

四.Set集合

1.Set集合特点

不包含重复元素的集合
没有带索引的方法,所以不能使用普通for循环遍历。

2.哈希值

哈希值: 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
Object类中有一个方法可以获取对象的哈希值
●public int hashCode():返回对象的哈希值
对象的哈希值特点
●同一个对象多次调用hashCode()方法返回的哈希值是相同的
●默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可实现让不同对象的哈希值相同。

3. HashSet集合概述和特点

概述:
该类实现set接口,由哈希表(实际为HashMap实例)支持。对集合的迭代顺序不作任何保证;特别是,它不能保证订单在一段时间内保持不变。 这个类允
许null元素。
HashSet集合特点:
●底层数据结构是哈希表
●对集合的迭代顺序不作任何保证, 也就是说不保证存储和取出的元素顺序一致
●没有带索引的方法, 所以不能使用普通for循环遍历
●由于是Set集合, 所以是不包含重复元素的集合

4.LinkedHashSet集合概述和特点

LinkedHashSet集合特点
●哈希表和链表实现的Set接口,具有可预测的迭代次序
●由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
●由哈希表保证元素唯一, 也就是说没有重复的元素

5. TreeSet集合概述和特点

TreeSet集合特点:
●元素有序, 这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
TreeSet():根据其元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序
没有带索引的方法,所以不能使用普通for循环遍历
由于是Set集合,所以不包含重复元素的集合

6.自然排序Comparable的使用

●存储学生对象并遍历,创建TreeSet集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论:
●用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
●自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(To)方法
●重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

7.比较器排序Comparator的使用

存储学生对象并遍历,创建TreeSet集合使用带参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论:
●用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
●比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(To1,To2)方法
●重写方法时,-定要注意排序规则必须按照要求的主要条件和次要条件来写

1.泛型的概述和好处

泛型:是DK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型
它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
一提到参数, 最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型
这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
泛型定义格式:
●<类型>:指定-种类型的格式。这里的类型可以看成是形参
●<类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参
●将来具体调用时候给定的类型可以看成是实参, 并且实参的类型只能是引用数据类型
泛型的好处:
●把运行时期的问题提前到了编译期间
●避免了强制类型转换

2.泛型类、泛型方法与泛型接口

泛型类的定义格式:
●格式: 修饰符class类名 <类型> { }
范例: public class Generic <T> { }
此处T可以随便写为任意标识,常见的如T、E、 K、V等形式的参数常用于表示泛型
泛型方法的定义格式:
●格式:修饰符<类型>返回值类型 方法名(类型 变量名) { }
●范例: public <T> void show(T t) { }
泛型接口的定义格式:
格式:修饰符 interface 接口名 <类型>{ }
范例:public interface Generic <T> { }

3.类型通配符

为了表示各种泛型List的父类,可以使用类型通配符
●类型通配符: < ?>
●List <?>:表示元素类型未知的List,它的元素可以匹配任何的类型
●这种带通配符的L ist仅表示它是各种泛型List的父类,并不能把元素添到其中
如果说我们不希望List <?>任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限
●类型通配符上限: <? extends 类型>
●List<? extends Number>:它表示的类型是Number或者其子类型
除了可以指定类型通配符的上限,我们也可以指定类型通配符的下限
●类型通配符 下限: <?super 类型>
●List<? super Number>:它表示的类型是Number或者其父类型

4.可变参数

可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了
●格式:修饰符 返回值类型 方法名(数据类型... 变量名){ }
范例: public static int sum(int… a){ }
可变参数注意事项:
这里的变量其实是一个数组
如果一个方法有多个参数, 包含可变参数,可变参数要放在最后

5.可变参数的使用

Arrays工具类中有一个静态方法:
●publicstatic <T> List<T> asList(T... a):返回由指定数组支持的固定大小的列表
●返回的集合不能做增删操作, 可以做修改操作
List接口中有一个静态方法:
●public static <E> List<E> of(E... elements): 返回包含任意数量元素的不可变列表
●返回的集合不能做增删改操作
Set接口中有一个静态方法:
●public static <E> Set<E> of(E... elements) :返回一个包含任意数量元素的不可变集合
●在给元素的时候,不能给重复的元素
●返回的集合不能做增删操作,没有修改的方法

六.Map集合

1.Map集合概述和使用

Map集合概述
●Interface Map<K,V> K:键的类型; V:值的类型
●将键映射到值的对象; 不能包含重复的键;每个键可以映射到最多一个值
●举例: 学生的学号和姓名
itheima001 林青霞
itheima002 张曼玉
itheima003 王祖贤
创建Map集合的对象:
多态的方式
具体的实现类HashMap

2. Map集合的基本功能

方法名说明V put(K key,V value)添加元素V remove(Object key)根据键删除键值对元素void clear()移除所有的键值对元素boolean containsKey(Object key)判断集合是否包含指定的键boolean containsValue(Object value)判断集合是否包含指定的值boolean isEmpty()判断集合是否为空int size()集合的长度,也就是集合中键值对的个数

3. Map集合的获取功能

方法名说明V get(Object key)根据键获取值Set<K> keySet()获取所有键的集合Collection<V> values()获取所有值的集合Set<Map.Entry<K,V> > entrySet()获取所有键值对对象的集合

4.Map集合的遍历

我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
遍历思路:
●获取所有结婚证的集合
●遍历结婚证的集合,得到每一个结婚证
●根据结婚证获取丈夫和妻子
转换为Map集合中的操作:
●获取所有键值对对象的集合
Set<Map.Entry<K,V> > entrySet():获取所有键值对对象的集合
●遍历键值对对象的集合, 得到每一个键值对对象
用增强for实现,得到每一个Map.Entry
●根据键值对对象获取键和值
用getKey()得到键
用getValue()得到值


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK