首页 > 技术文章 > javase 接口,异常,集合

beiluoL 2019-03-06 15:45 原文

接口,接口在java中不算一个类,本身用interface来修饰而不是class
修饰,接口和抽象类相比是纯抽象的

接口特征
1.接口中只能有抽象方法,并且默认public abstract修饰
2.接口中没有成员变量,所有声明在接口中的变量默认的修饰是static
final的(静态常量)
3.接口不能直接使用,无法new,没有构造方法,只能通过new实现类
来使用,多态的方式
4.java中类只能继承一个类,但是接口可以继承多个接口。实现类实现
接口除了当前接口,也要求把父接口的方法一并实现
5.类可以实现多个接口,用逗号分割,如果一个类同时要继承类和实现
接口extends一定要写在implements之前

为什么要用接口编程而不直接使用类
1.多态
2.解耦,减少依赖关系

面向对象七大原则
1.迪米特法则 减少与更多人之间通信
2.开闭原则 关闭修改,开放扩展
3.依赖倒置原则 减少耦合,由之前的需要一个对象主动去new 某个类
new RedBaby()变成了通知一个负责创建的地方,让负责的人去主动
创建对象并且交予给调用者,由主动创建变为被动,从而减少与需要使用
的类之间的依赖


异常:指程序的错误
java异常的分类
Throwable:所有异常的超类
两个子类
Error :程序本身发生严重的错误,不可靠自身恢复,必须
要解决
Exception
CheckExcpetion :检查性异常 这类异常通常需要声
声明捕获或者抛出异常
RuntimeException :运行异常 指在程序运行时发生,
不可预估的,但是出现了一定要处理,RuntimeException 类下的
所有子类都是运行异常


try try块用来把可能产生异常的代码写在try中
catch 当try中的代码块发生异常时,由catch捕获异常,一个try可以
跟随多个catch,对应着不同的异常的发生
finally 非必须,但是finally中的代码无论是否发生异常
一定会执行,除非System.exit
throws 声明抛出异常的类型,通常在可能发生异常的地方选择
捕获异常或者抛出异常,交给外面调用的地方进行处理,如果选择抛出
需要指定throws,写在方法的参数列表和花括号之间,后面跟上抛出的
异常的类型
throw 手动抛出一个异常,throw后面跟上一个异常类型的对象

集合
Collection 单列的集合

List接口 有序的,可重复的
ArrayList
1.底层是一个数组
2.有序的,可重复的
3.自动扩增空间,扩增比例40%-60%
4.初始空间为10
5.随机访问较快,用在查询上

使用ArrayList
List list = new ArrayList();
list.add(对象) 添加元素到集合中
list.get(下标) 根据下标获取元素,从0开始
list.remove(对象 or 下标) 删除集合中的某个元素
list.size() 得到集合的长度
list.isEmpty()

Vector
底层数组实现
线程安全(效率低)

LinkedList
1.有序,可重复的
2.底层是链表的结构
3.查询效率没有ArrayList高,但是集合的修改等操作更加方便
4.提供了首尾的操作
方法和ArrayList中的差不多一致,多了对于首尾的几个添删查的方法
例如addFirst addLast removeFirst removeLast...

Set接口
HashSet
1.无序,不可以重复
2.允许存储null
3.底层哈希表实现,根据这个来判断是否重复

set如何判断元素的重复
1.先拿要add的元素在set中比较其他元素的hashCode
存在相同:视为已存在该元素
继续比较两个对象的equals
true:两个对象完全相同
false:两个对象不相等,可以add
不存在:返回false,没有该元素,add成功

if(this.hashCode()==object.hashCode()){
if(this.equals(object)){
return true;
}
return false;
}else{
return false;
}

LinkedHashSet
底层数据结构是链表和哈希表
链表决定顺序
哈希表决定是否重复

TreeSet 有序
底层是红黑树
排序规则是自然排序
比较方法返回0决定是否重复

Iterator迭代器
用来遍历迭代List和Set集合
使用需要通过List和Set点.iterator()方法来得到要迭代的数据
迭代器通过hasNext() 来判断是否存在可迭代的下一条数据
如果有就指向要迭代的数据并且返回true,否则返回false
再通过next()方法得到当前迭代的一条数据

Collections类,用来做Collection接口中的类进行操作,
封装了一系列的静态方法,比如sort等

Map 键值对的存储
map的存储由两列,key和value
map的key一定是唯一的,value可以允许重复

HashMap
1.基于哈希表的实现,HashSet的底层就是他
2.key唯一,无序的,允许一个null
3.value可以重复,也允许为null,可以有多个null
4.线程不安全

map对象.put(key,value) 存储数据
map.get(key) 得到存在map中对应key的value
map.remove(key) 删除一个key,对应的value也会删除
map.keySet() 得到键的Set集合
map.values() 得到value的集合
map.entrySet() 得到key-value的集合

TreeMap
key有序,底层红黑树实现,和TreeSet一样

LinkedHashMap
基于哈希表和链表结构的Map
哈希表去重
链表排序

HashTable
key无序,唯一
hashTable不允许键为null,也不允许值为null
线程安全
哈希算法和hashMap不一样
扩容方式也不一样

 

推荐阅读