Java高级应用
集合框架、泛型
什么是集合框架?
一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
什么Iterator?
答:Iterator是迭代器,他是用于访问数组的方法,可用于迭代 ArrayList 和 HashSet 等集合。
怎么使用Iteration?
//遍历每一个元素
List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(42);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
//移除元素
List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(42);
list.add(8);
list.add(12);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
if(iterator.next()>20) {
iterator.remove();
}
}
System.out.println(list);
什么是ListIterator?
答:它是Iterator的子类,也是迭代器。
怎么使用ListIterator?
List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(42);
list.add(8);
list.add(12);
ListIterator<Integer> listIterator = list.listIterator();
//添加元素
listIterator.add(56);
System.out.println(list);
//后向遍历
ListIterator<Integer> afterAdd = list.listIterator();
while(afterAdd.hasNext()) {
System.out.println(afterAdd.next());
}
//前向遍历
while(afterAdd.hasPrevious()) {
System.out.println(afterAdd.previous());
}
ListIterator和Iterator的区别
答:
-
iterator()方法在set和list接口中都有定义,但是ListIterator()仅存在于list接口中(或实现类中);
-
ListIterator有add()方法,可以向List中添加对象,而Iterator不能
-
ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
什么是Collection?
答:最基本的集合接口。
什么是Map?
答:Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复覆盖),但允许值重复。
怎么使用Map?
Map map1 = new HashMap();
Map map2 = new TreeMap();
Map map3 = new LinkedHashMap();
Map map4 = new Hashtable();
Map map5 = new WeakHashMap();
Map map6 = new IdentityHashMap();
-
什么是HashMap?
答:基于哈希表实现的map。
-
什么是TreeMap?
答:基于红黑树实想的Map。
-
什么LinkedHashMap?
答:基于双向循环链表和哈希表实现的map。
-
什么是Hashtable?
答:基于哈希表实现的map。
-
什么是WeakHashMap?
答:基于java弱引用实现的HashMap。
-
什么是IdentityHashMap?
答:基于哈希表实现的map。
-
有什么区别?
HashMap | TreeMap | LinkedHashMap | Hashtable | WeakHashMap | IdentityHashMap | |
---|---|---|---|---|---|---|
是否有序 | 否 | 是 | 是 | 否 | 否 | 否 |
是否允许key为空值 | 是 | 否 | 是 | 否 | 是 | 是 |
是否线程安全 | 否 | 否 | 否 | 是 | 否 | 否 |
继承 | AbstractMap抽象类 | SortedMap接口 | HashMap类 | AbstractMap抽象类 | AbstractMap抽象类 | AbstractMap抽象类 |
特点 | 适用于在Map中插入、删除和定位元素 | 适用于按自然顺序或自定义顺序遍历键 | 比 HashMap 多维护了一个双向链表、插入数据比HashMap好 | key没有其他引用那么此map会自动丢弃此值 | 比较key值的时候使用==比较。 |
什么是List?
答:List是一个有序的集合,List允许存储项的值为空,也允许存储相等值的存储项。
怎么使用List?
List list1 = new ArrayList();
List list2 = new LinkedList();
List list3 = new Vector();
List list4 = new Stack();
-
什么是ArrayList?
答:数组列表
-
什么是LinkedList?
答:链表
-
什么是Vector?
答:矢量
-
什么是Stack?
答:堆栈
-
有什么区别
ArrayList LinkedList Vector Stack 是否线程安全 否 否 是 是 继承 AbstractList抽象类 AbstractSequentialList抽象类 AbstractList抽象类 Vector类 特性 便于数组的访问 便于数组的插入和删除 先进后出,后进先出
什么是Set?
答:Set和List一样,也继承于Collection,是集合的一种。和List不同的是,Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值。
怎么使用Set?
Set set1 = new HashSet();
Set set2 = new TreeSet();
Set set3 = new LinkedHashSet();
-
什么是HashSet?
答:基于哈希表实现的Set。
-
什么是TreeSet?
答:基于红黑树实现的Set。
-
什么是LinkedHashSet?
答:基于双向链表和哈希表实现的Set
-
有什么区别?
HashSet TreeSet LinkedHashSet 是否允许key为空值 是 否 是 是否有序 否 是 继承 Set接口 SortSet接口 HashSet类 是否线程安全 否 否 否 特性 便于访问数据 实现自动排序的类型,便于访问key值 便于插入和删除数据
List、Set、Map的区别?
答:
- List中的元素,有序、可重复、可为空;
- Set中的元素,无序、不重复、只有一个空元素;
- Map中的元素,无序、键不重,值可重、可一个空键、多可空值;
数组和集合的区别?
答:
- 数组的存放的类型(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。
- 数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小。
什么是泛型?
答:泛指的类型,当数据类型不确定,可以使用泛型方法的方式,达到简化代码、提高代码重用性的目的。
怎么使用泛型?
//泛型类
public class Gen<T>{
}
//泛型接口
public interface List<T> extends Collection<T>{
}
//泛型方法
public<T> void f(T x){
}
异常处理与XML解析
什么是异常?
答:异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
怎么对异常进行处理?
-
积极的处理
答:通过try{}catch{}处理。
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型3 异常的变量名3){ // 程序代码 }
-
消极的处理
答:通过throw/throws关键字处理。
public void test() throws Exception{ throw new Exception(); }
finally关键字
答:无论是否发生异常,finally 代码块中的代码总会被执行。
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}finally{
// 程序代码
}
DOM4J解析XML
什么是xml?
答:可扩展的标记语言。用于存储数据和描述数据,不同的平台可以同过xml文件建立起联系
怎么使DOM4J解析xml?
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<animals>
<animal name="dog">
<name>柯基</name>
<color>棕色</color>
</animal>
<animal name="cat">
<name>波斯猫</name>
<color>白色</color>
</animal>
</animals>
//1.创建Reader对象
SAXReader reader = new SAXReader();
//2.加载xml
Document document = reader.read(new File("src/com/linx/Animal.xml"));
//3.获取根节点
Element rootElement = document.getRootElement();
Iterator iterator = rootElement.elementIterator();
while (iterator.hasNext()){
Element element = (Element) iterator.next();
List<Attribute> attributes = element.attributes();
System.out.println("======获取属性值======");
for (Attribute attribute : attributes) {
System.out.println(attribute.getValue());
}
System.out.println("======遍历子节点======");
Iterator iterator1 = element.elementIterator();
while (iterator1.hasNext()){
Element elementChild = (Element) iterator1.next();
System.out.println("节点名:"+elementChild.getName()+"---节点值:"+elementChild.getStringValue());
}
}