javaSE高级部分学习笔记

异常1、什么是异常?java提供异常处理机制有什么用?以下程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常java语言是很完善的语言,提供了异常的处理方式,以下程序执行过程中出现了不正常情况,java把该异常信息打印输出到控制台,供程序员参考。程序员看到异常信息之后,可以对程序进行修改,让程序更加健壮。什么是异常:程序执行过程中的不正常情况异常的作用:增强程序的健壮性java中异常以类和对象的形式存在。2、异常的承继结构图2.1、ObjectObject下有Throwabl
摘要由CSDN通过智能技术生成

异常

1、什么是异常?java提供异常处理机制有什么用?
以下程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常
java语言是很完善的语言,提供了异常的处理方式,以下程序执行过程中出现了不正常情况,
java把该异常信息打印输出到控制台,供程序员参考。程序员看到异常信息之后,可以对程序进行修改,让程序更加健壮。

什么是异常:程序执行过程中的不正常情况
异常的作用:增强程序的健壮性
java中异常以类和对象的形式存在。

2、异常的承继结构图
2.1、Object
Object下有Throwable(可抛出的)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下有两个分支:
Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)。
RuntimeException:运行时异常(在编写程序阶段程序员可以预先处理,也可以不管,都行。)
在这里插入图片描述

2.2、编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
编译时异常因为什么而得名?
因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。
所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。
因为异常的发生就是new异常对象。

2.3、编译时异常和运行时异常的区别?

	编译时异常一般发生的概率比较高。
		举个例子:
			你看到外面下雨了,倾盆大雨的。
			你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。
			而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。
			“拿一把伞”就是对“生病异常”发生之前的一种处理方式。

			对于一些发生概率较高的异常,需要在运行之前对其进行预处理。

	运行时异常一般发生的概率比较低。
		举个例子:
			小明走在大街上,可能会被天上的飞机轮子砸到。
			被飞机轮子砸到也算一种异常。
			但是这种异常发生概率较低。
			在出门之前你没必要提前对这种发生概率较低的异常进行预处理。
			如果你预处理这种异常,你将活的很累。
	
	假设你在出门之前,你把能够发生的异常都预先处理,你这个人会更加
	的安全,但是你这个人活的很累。
	
	假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常,
	所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?
		首先,如果这样的话,程序肯定是绝对的安全的。
		但是程序员编写程序太累,代码到处都是处理异常
		的代码。

2.4、编译时异常还有其他名字:
受检异常:CheckedException
受控异常

2.5、运行时异常还有其它名字:
未受检异常:UnCheckedException
非受控异常

2.6、再次强调:所有异常都是发生在运行阶段的。

3、Java语言中对异常的处理包括两种方式:

	第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。
		谁调用我,我就抛给谁。抛给上一级。

	第二种方式:使用try..catch语句进行异常的捕捉。
		这件事发生了,谁也不知道,因为我给抓住了。

	举个例子:
		我是某集团的一个销售员,因为我的失误,导致公司损失了1000元,
		“损失1000元”这可以看做是一个异常发生了。我有两种处理方式,
		第一种方式:我把这件事告诉我的领导【异常上抛】
		第二种方式:我自己掏腰包把这个钱补上。【异常的捕捉】
		
		张三 --> 李四 ---> 王五 --> CEO
	
	思考:
		异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要
		对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。

	注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行。

4、Java中怎么自定义异常呢?

第一步:编写一个类继承Exception或者RuntimeException
第二步:提供两个构造方法,一个无参数的,一个带有String参数的。

面试题:(1)throw和throws的区别?

位置不同:

  1. throws 用在函数上,后面跟的是异常类,可以跟多个;而 throw 用在函数内,后面跟的是异常对象。
    功能不同:
  2. throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。
  3. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。
  4. 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

2)final finally finalize有什么区别?

final关键字
final修饰的类无法继承
final修饰的方法无法覆盖
final修饰的变量不能重新赋值。

finally关键字
和try一起联合使用
finally语句块中的代码是必须执行的。

finalize 标识符
是一个Object类中的方法名。
这个方法是由垃圾回收器GC负责调用的。

集合

一、集合概述
1.1、什么是集合?有什么用?
数组其实就是个集合。集合实际上就是一个容器。可以来容纳其他类型的数据。

集合为什么说在开发中使用较多?
集合是一个容器,是一个载体,可以一次容纳多个对象。在实际开发中,假设连接数据库,数据库当中有10条记录,那么假设把这10条记录查询出来,在java程序中会将10条数据封装成10个java对象,然后将10个java对象放到某一个集合当中,将集合传到前端,然后遍历集合,将一个数据一个数据展现出来。

1.2、集合不能直接存储基本数据类型,另外集合也不能直接存储java对象,集合当中存储的都是java对象的内存地址。(或者说集合中存储的都是引用。)
list.add(100); // 自动装箱Integer
注意:
集合在java中本身是一个容器,是一个对象。
集合中任何时候存储的都是“引用”。

1.3、在java中每一个不同的集合,底层会对应不同的数据结构。往不同的集合中存储元素,等于将数据放到了不同的数据结构当中。什么是数据结构?数据存储的结构就是数据结构。不同的数据结构,数据存储方式不同。例如:
数组、二叉树、链表、哈希表。。。
以上这些都是常见的数据结构。

你往集合c1中放数据,可能是放到数组上了。
你玩集合c2中放数据,可能是放到二叉树上了。
。。。
你使用不同的集合等同于使用了不同的数据结构。

1.4、集合在java JDK中哪个包下?
java.util.*;
所有的集合类和集合接口都在java.util包下。

1.5、为了能掌握集合这块的内容,最好能将集合的继承结构图背会!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.6、在java中集合分为两大类:
一类是单个方式存储元素:
单个方式存储元素,这一类集合中超级父接口:java.util.Collection;

一类是以键值对的方式存储元素
以键值对的方式存储元素,这一类集合中超级父接口:java.util.Map;

二、Collection接口

1、关于java.util.Collection接口中常用的方法。
(1)Collection中能存放什么元素?
没有使用"泛型"之间,Collection中可以存储Object的所有子类型。
使用了"泛型"之后,Collection中只能存储某个具体的类型。
集合后期我们会学习"泛型"语法。目前先不用管。Collection中什么都能存,
只要是Object的子类型就行。(集合中不能直接存储基本数据类型,也不能存
java对象,只能存java对象的内存地址。)

(2)Collection中常用方法
boolean add(Object e) 想集合中添加元素
int size() 获取集合中元素的个数
void clear() 清空集合
boolean contains(Object o) 判断当前集合中是否包含元素o,包含返回true,不包含返回false
boolean remove(Object o) 删除集合中的某个元素
boolean isEmpty() 判断该集合中元素的个数是否为0
Object[] toArray() 调用这个方法可以把集合转换成数组。【作为了解,使用不多。】

2、深入Collection集合的contains方法:
boolean contains(Object o)
判断集合中是否包含某个对象o
如果包含返回true,如果不包含返回false。

contains是用来判断集合中是否包含某个元素的方法,
那么它在底层是怎么判断集合中是否包含某个元素的呢?
调用了equals方法进行比对。
equals方法返回true,就表示包含这个元素。
在这里插入图片描述

3、关于集合元素的remove
重点:当集合的结构发生改变时,迭代器必须重新获取,如果还是用以前老的迭代器,会出现异常:java.util.ConcurrentModificationException

重点:在迭代集合元素的过程中,不能调用集合对象的remove方法,删除元素:
c.remove(o); 迭代过程中不能这样。
会出现:java.util.ConcurrentModificationException

重点:在迭代元素的过程中,一定要使用迭代器Iterator的remove方法,删除元素,不要使用集合自带的remove方法删除元素。

加粗样式三、List接口

1、List接口中的常用方法。
List是Collection接口的子接口。所以List接口中有一些特有的方法。
void add(int index, Object element)
Object set(int index, Object element)
Object get(int index)
int indexOf(Object o)
int lastIndexOf(Object o)
Object remove(int index)

2、迭代器迭代元素的过程中不能使用集合对象的remove方法删除元素,
要使用迭代器Iterator的remove方法来删除元素,防止出现异常:
ConcurrentModificationException

3、ArrayList

ArrayList集合初始化容量10
扩容为原容量1.5倍。
底层是数组。

数组优点和缺点要能够说出来!
另外要注意:ArrayList集合末尾增删元素效率还是可以的。

(1)默认初始化容量10
(2)集合底层是一个Object[]数组。
(3)构造方法:
new ArrayList();
new ArrayList(20);
(4)ArrayList集合的扩容:
原容量的1.5倍。
ArrayList集合底层是数组,怎么优化?
尽可能少的扩容。因为数组扩容效率比较低,建议在使用ArrayList集合
的时候预估计元素的个数,给定一个初始化容量。
(5)数组优点:
检索效率比较高。(每个元素占用空间大小相同,内存地址是连续的,知道首元素内存地址,
然后知道下标,通过数学表达式计算出元素的内存地址,所以检索效率最高。)
(6)数组缺点:
随机增删元素效率比较低。
另外数组无法存储大数据量。(很难找到一块非常巨大的连续的内存空间。)
(7)向数组末尾添加元素,效率很高,不受影响。
(8)面试官经常问的一个问题?
这么多的集合中,你用哪个集合最多?
答:ArrayList集合。
因为往数组末尾添加元素,效率不受影响。
另外,我们检索/查找某个元素的操作比较多。
(9)ArrayList集合是非线程安全的。(不是线程安全的集合。)

4、LinkedList
第一:单向链表和双向链表数据结构要理解。
第二:链表数据结构的优点和缺点要能够说出来。
在这里插入图片描述
在这里插入图片描述

链表的优点:
由于链表上的元素在空间存储上内存地址不连续。
所以随机增删元素的时候不会有大量元素位移,因此随机增删效率较高。
在以后的开发中,如果遇到随机增删集合中元素的业务比较多时,建议
使用LinkedList。

链表的缺点:
不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头
节点开始遍历,直到找到为止。所以LinkedList集合检索/查找的效率
较低。

ArrayList:把检索发挥到极致。(末尾添加元素效率还是很高的。)
LinkedList:把随机增删发挥到极致。
加元素都是往末尾添加,所以ArrayList用的比LinkedList多。

5、Vector
Vector初始化容量是10.
扩容为原容量的2倍。
底层是数组。
Vector底层是线程安全的。

怎么得到一个线程安全的List:
Collections.synchronizedList(list);

6、JDK5.0新特性:泛型
第一:集合使用泛型来减少向下转型的操作。
第二:怎么使用泛型?
第三:怎么自定义泛型?

7、JDK5.0新特性:
foreach
语法:
for (元素类型 变量名 : 数组或集合) {
System.out.println(变量名);
}

对数组怎么遍历?
for(int i : arr) {
System.out.println(i);
}
对集合怎么遍历?
for(String s : list) {
System.out.println(s);
}

(1)泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的。(运行阶段泛型没用!)
(2)使用了泛型好处是什么?
		第一:集合中存储的元素类型统一了。
		第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”!
(3)泛型的缺点是什么?
		导致集合中存储的元素缺乏多样性!
		大多数业务中,集合中元素的类型还是统一的。所以这种泛型特性被大家所认可。

8、JDK8新特性:钻石表达式
List list = new ArrayList<>();
类型自动推断!

四、Map

1、掌握Map接口中常用方法。

V put(K key, V value) 向Map集合中添加键值对
V get(Object key) 通过key获取value
void clear() 清空Map集合
boolean containsKey(Object key) 判断Map中是否包含某个key
boolean containsValue(Object value) 判断Map中是否包含某个value
boolean isEmpty() 判断Map集合中元素个数是否为0
V remove(Object key) 通过key删除键值对
int size() 获取Map集合中键值对的个数。
Collection values() 获取Map集合中所有的value,返回一个 Collection

2、遍历Map集合的两种方式都要精通。
第一种:获取所有key,遍历每个key,通过key获取value。

// 第一种方式:获取所有的key,通过遍历key,来遍历value
	Map<Integer, String> map = new HashMap<>();	
	map.put(1, "zhangsan");
	map.put(2, "lisi");
	map.put(3, "wangwu");
	map.put(4, "zhaoliu")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值