异常与集合框架

异常与集合框架

异常

​ 定义:在程序运行过程中出现的错误

异常分类

​ 编辑错误/语法错误:指不能够运行,在编译阶段就报错

​ 运行错误:能够正常编译,但是运行时报错

​ 逻辑错误:与预期的不一样,能够正常编译,也能够正常运行

Throwtable
Error(错误)Exception(异常)
AWTEeeorInputMismatchException:输入类型不匹配异
ThreadDeatlthNullPointException
ArrayIndexOutOfBoundsException
StringIndexOutOfBoundsException
FileNotFoundException文件找到异常
NumberFormatExcetpion:转换异常

​ 3.处理手段

​ <1>try…catch…finally的形式:

try监控代码,监控可能发生错误的代码
1.如果代码里面没有发生异常,则整个try执行完毕,不进入catch
2.如果try里面有异常,则try里面后面的代码不会执行,会进入相对应的catch里面
捕获catch里面指定类的异常
1.语法:catch (类名 对象名),类名 catch(Exception e)
2. catch可以一次性出现多个(要求:子类必须出现在父类的前面,catch 后面的类型不能出现相同的) (结果:只会执行一个,第一次匹配的执行)
finally不管有没有异常 ,finally 一定会被执行
除非:1.如果遇到了 System.eixt(1);不会执行finally 2. finally里面的代码也出现异常了 3.程序死亡 4.cpu终止
注意:try 必须和catch 或者 finally 成双出现

​ <2> throws…throw

throwthrow
说明抛出异常声明异常
位置方法里面方法名,小括号里面
语法throw异常对象名throws类名
方法如果抛出异常,一定要处理请求外援
使用try或者throws如果没有处理,则编译报错

重写:

父类抛出异常  >=   子类抛出异常
父类返回值    >=   子类
父类访问修饰  <=   子类

示例:

public class TestLog1 {

	private static Logger logger =Logger.getLogger(TestLog1.class);
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入被除数:");
		try {
			int num1 = in.nextInt();
			System.out.println("请输入除数:");
			int num2 = in.nextInt();
			System.out.println(String.format("%d/%d=%d",num1,num2,num1/num2 ));
		} catch (InputMismatchException e) {
			logger.debug("两个数字必须是整数!",e);
		}catch(ArithmeticException e) {
			logger.debug("除数不能为0!",e);
		}catch(Exception e) {
			logger.debug(e.getMessage());
			e.printStackTrace();
			System.exit(1);
		}finally {
			System.out.println("感谢使用本次程序");
		}
	}

日志

​ 1.使用log4j,一般导人Jar包

​ 2.定义配置文件,:log4j.properties(固定文件名+固定位置)

​ 3.使用Logger

​ 4.配置文件

​ 设置输出的级别,目的地,目的地可以有多个,目的地名字

​ 目的地分两种:

​ <1>控制台 ConsoleAppender

​ #区分控制台的颜色 log4j.appender.目的地名称.Target=System.err/System.out

​ # 日志的布局 log4j.appender.目的地名称.layout=org.apache.log4j.SimpleLayout

​ <2>log文件

​ log4j.appender.目的地名称.File=文件名

​ 格式:

		SimpleLayout  ---简单格式
	    HTMLLayout ---html格式
		PatternLayout ---自定义

​ 5.日志记录
d e b u g − − − 调 试 ​ i n f o − − − 信 息 w a r n − − − 警 告 e r r o r − − 错 误 f a t a l − − 严 重 警 告 debug---调试 ​info---信息 warn---警告 error--错误 fatal--严重警告 debuginfowarnerrorfatal
示例:

###\u8BBE\u7F6E\u8F93\u51FA\u57FA\u672C###
log4j.rootLogge=info,stdout.logfile
###\u8F93\u5165\u81F3\u63A7\u5236\u53F0###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.AimpleLayout
###\u8F93\u51FA\u5230\u6587\u4EF6\u4E2D###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}
%l %F %p %m%n

集合框架

定义:
集合框架是为表示和操作集合而规定的一种统一的标准体系结构,集合框架都包含三大块内容对外的接口,接口的实现和对集合运算的算法.

接口:表示集合的抽象数据类型,如Collection,List,set,map,Iterator

List

定义:

List接口继承Collection接口,存储一组不唯一(允许重复)有序(以元素插入的次序来放置元素,不会重写排列)的对象

常用方法说明
boolean add(Object o)在类表末尾顺序添加元素,其实索引位置从0开始
void add(int index,Object o)在指定的索引位置添加元素,原索引位置及其后面的元素一次后移 注意:新添加元素的索引位置必须介于0和列表中的元素个数
int size()返回列表中的元素个数
Object get(int index)返回指定索引位置处的元素
boolean contains(Object o )判断列表中是否存在指定元素
boolean remove(Object o )从列表中删除元素
Object remove(int index )从列表中删除指定位置元素,起始索引位置从0开始

<1>ArrayList:

  1. 添加数据: add()方法

  2. 取下标 :get(index i)

  3. 区别C#

  4. C#Java
    获取长度count()方法Size()方法
    删除指定项删除指定下标:RemoveAt
    删除指定值:Remove
    删除值跟删除下标:都是用remove方法,通过参数类型区分

示例:

public static void main(String[] args) {
		// 1.创建4个狗狗对象
		Dog ououDog=new Dog("欧欧","雪纳瑞");
		Dog yayaDog=new Dog("亚亚","拉布拉多");
		Dog meimeiDog=new Dog("美美","雪纳瑞");
		Dog feifeiDog=new Dog("菲菲","拉布拉多");
		
		//2.创建ArrayList集合对象并把4个狗狗对象放入其中
		List dogs=new ArrayList();
		dogs.add(ououDog);
		dogs.add(yayaDog);
		dogs.add(meimeiDog);
		dogs.add(2,feifeiDog);//添加feifeiDog导指定位置
		//3.输出集合中狗狗的数量
		System.out.println("共计有:"+dogs.size()+"条狗狗.");
		//4.遍历集合显示各条狗狗的信息
		System.out.println("分别是:");
		for (int i = 0; i < dogs.size(); i++) {
			Dog dog=(Dog) dogs.get(i);
			System.out.println(dog.getName()+"\t"+dog.getType());
		}
	}

<2>LinkedList:

​ 1.特点:LinkedList采用了链接式存储规则

​ 2.适用于集合数据的频繁修改,不适用于频繁的读写遍历集合

​ 3.使用:

			 LinkedList list = new LinkedList(); 
			 LinkedList<String> listString = new LinkedList<String>;

​ 4.添加:

​ 在List的基础上增加了

addFirst() -->添加到首位
addLast() -->添加到末位

​ 5.取下标

​ 在List的基础上增加了

getFirst()-->取第一个值
getLast()-->取最后一个值

​ 6.遍历

//for循环
for(int i = 0 ; i < list.size();i++) {
      //代码块
}list.get(i)
    
//foreach循环				
 for(int num : list){
      syso(num)
 }

//Iterator遍历
Iterator it = list.iterator();
while(it.hasNext()){
    syso(it.next());
} 

<3>Vector:

​ 类似于ArrayList,唯一的区别就是:

Vector是线程安全的,ArrayList是线程不安全的

Set

定义:接口继承Collection,存储一组唯一(不允许重复),无序的对象

<1>HashSet

​ 1.特点:存储方式类似于数组,插入数据没有任何顺序

​ 2.取值:add()方法

​ 3.获得长度:Size()方法

​ 4.示例

//Set<Integer> hashSet = new HashSet<Integer>();
		//不能通过下标取值,因为是无序
		HashSet<Integer> hashSet = new HashSet<Integer>();
		
		hashSet.clear(); //清空
		hashSet.isEmpty(); //判断是否为空
		hashSet.iterator(); //转换为Iterator
		hashSet.size(); //得到长度
		hashSet.toArray();//转换为数组
		
		
		hashSet.add(10);
		hashSet.add(10); //写了一个判断,如果值已经存在了,是不会添加
		hashSet.add(2); 
		hashSet.add(1); 
		hashSet.add(100);

<2>TreeSet

​ 1.特点:有序,默认升序,实现SortedSet接口

​ 2.取值:add()方法

​ 3.获得长度:Size()方法

​ 4.示例

System.out.println("Set:");
		Set<Integer> set = new TreeSet<Integer>();
		//LSP原则:当父类引用指向子类的时候,不能调用子类独有的方法
		set.add(1);
		set.add(120);
		set.add(20);
		set.add(20);
		set.add(12);
		set.add(2);
		set.add(0);
		Iterator<Integer> it1 = set.iterator();
		while(it1.hasNext()) {
			System.out.println(it1.next());
		}
		
		System.out.println("TreeSet:");
		TreeSet<Integer> tset = new TreeSet<Integer>();
		tset.add(1);
		tset.add(120);
		tset.add(20);
		tset.add(20);
		tset.add(12);
		tset.add(2);
		tset.add(0);
		Iterator<Integer> it = tset.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		//tree:树

迭代器Iterator
所有集合接口何磊都没有提供相应的遍历方法,而是把遍历交给迭代器Iterator完成。Iterator为集合而生,专门实现集合的遍历,他隐藏可各种集合实现类的内部细节,提供了遍历集合的同意编程接口。

实现步骤:

1.Collection 接口的Iterator()方法返回一个Iterator,然后通过Iterator接口的两个方法即可方便的实现遍历。

2.Boolean hasNext();判断是否存在另一个可访问的元素
3.Object next();返回要访问的下一个元素

Map

定义:

接口存储一组成对的键-值对象,提供key到Value的映射,Map中的Key不要求有序,不允许重复。value同样不要求有序。但允许重复

常用方法说明
Object get(Object key)根据键返回相关联的值,若不存在指定的键,则返回null
Object remove(Object key)删除指定的键映射的“键-值对”
int size()返回元素个数
Set keySet()返回建的集合
Collection values()返回值的集合<
boolean containsKey(Object key)若存在指定的键映射的“键-值对”则返回true
boolean isEmpty()
若不存在键-值对映射关系,则返回true

<1>HasMap

​ 1.特点:线程不安全

​ 2.添加.put()方法

​ 3.获取长度.Size()方法

​ 4.示例

Map map = new HashMap();
		Map<String, String> map1 = new HashMap<String, String>(); 
		HashMap<String, String> map2 = new HashMap<String, String>();
		//存
		map2.put("key", "value");
		//map2.put("key", "value1");
		//取
		System.out.println("取值:" + map2.get("key"));
		//得到长度
		System.out.println("长度:" + map2.size());
		//遍历
		//怎么拿到所有的key
		Set<String> setkey = map2.keySet();
		//怎么拿到所有的value
		Collection<String> valuesList = map2.values();
		//Set和List的父类--》Collection
		//List有get方法--》get是List新增的方法,并不是重写父类的方法
		//Set没有get方法
		//List<String> valuesList = map2.values();
		Collection<String> valueSet = map2.values();

<2>.Hastable

​ 1.特点:线程安全

​ 2.添加.put()方法

​ 3.获取长度.Size()方法

​ 4.示例

HashMap<Integer, String> map = new HashMap<Integer, String>();
		
		map.put(1, "a");
		map.put(1, "b"); //能有重复的key,直接覆盖之前的
		map.put(null, "b");  //java中,key可以是null 
		
		for (String valu : map.values()) {
			System.out.println(valu);
		}
		for(Integer key : map.keySet()) {
			System.out.println("key : " +  key + ", value: " + map.get(key));
		}
		/*
		for(int key : map.keySet()) {
			System.out.println("key : " +  key + ", value: " + map.get(key));
		}*/

<3>ConcurrentMap

​ 1.特点:线程安全,线程安全的性能上比Hashtable 更好

​ 2.基本方法与Hashtable里面的方法一致

​ 3.示例

private static void methodConcurrentHashMap() {
		ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
		
		map.put("1" , "a");
		map.put("1" , "a");
		
		map.get("1");
	}

<4>TreeMaP

1.特点:线程不安全,对key进行排序,不能以null作为key

2.基本方法与Hashtable里面的方法一致

3.示例

TreeMap<String, String> treeMap= new TreeMap<String, String>();

		treeMap.put("1",  "a");
		treeMap.put("1",  "b");//添加重复键,覆盖以前key对应的value
		treeMap.put("3",  "b");
		treeMap.put("0",  "c");
		treeMap.put("9",  "d");
		treeMap.put("7",  "e");
		treeMap.put(null,  "c");  //不能以null作为key
		
		for (String	key : treeMap.keySet()) {
			System.out.println("key:" + key + ", value:" + treeMap.get(key));	
		}  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值