一、泛型(JDK5以后新特性)
1、概述:泛型直接规定集合的存储类型,将明确的集合类型的工作推迟到了创建对象或者调用方法的时候,属于一种参数化类型,可作参数传递。
2、优点
(1)将运行时期异常提前到了编译时期;
(2)优化了设计,解决了×××警告线问题;
(3)避免了强制类型转换, ,解决了向下类型转换出现的问题ClassCastException;
(4)泛型的引出可以提供程序的安全性。
3、泛型定义在类上
(1)格式:public class 类名<T>{……}
(2)实例:
实体类:
测试类:
4、泛型定义在方法上
(1)格式:public<T> 返回值类型 方法名<T t>{……}
(2)实例:
实体类:
测试类:
(3)注意:在方法上定义泛型时,若未指明类型,在主函数中可赋多种类型值。
5、泛型定义在接口上
(1)格式:
A、接口
Public Interface 接口名<T>{……}
B、子实现类:
情况一:泛型类型已确定
Public class 子实现类 implements 接口名<T>{……}
情况二:泛型类型不确定
Public class 子实现类<T> implements 接口名<T>{……}
(2)实例:
接口:
子实现类:
测试类:
6、泛型添加位置
(1)类/接口:定义类/接口时添加。
(2)集合:创建对象和获取迭代器时添加(创建集合对象,在泛型明确的情况下,前后必须保持一致)。
7、泛型通配符(高级)
(1)<?>:代表任意类型Object类型,或者任意Java类 。
(2)<? extends E>:向下限定,E的子类或者E本身。
(3)<? super E>:向上限定,E本身或者其父类。
(4)实例:
实体类:
测试类:
二、JDK5以后的新特性
1、可变参数
(1)当一个方法的参数个数不确定的时候,使用可变参数。
(2)格式:修饰符 返回值类型 方法名(数据类型...变量名){......}
(3)注意:a、变量名看作数组;b、数据类型…(数据类型后必须是三个“.”)。
(4)实例:
2、增强for循环(实际开发中常用)
(1)作用:替代迭代器,在遍历集合或者遍历数组时常用增强for循环。
(2)格式:for(数据类型 变量名 : 数组或者集合对象名){
输出变量
}
(3)弊端:如果集合的对象是null,再次对集合操作,会出现异常。
解决:对集合进行非空判断。
例如:遍历存储String类型数据的集合list:
if(list !=null) {
for(String s:list) {
System.out.println(s);
}
}
3、静态导入
(1)特点:
A、前提:导入的方法必须为静态。
B、导入到一个方法的级别。
(2)格式:import static 包名.类名.方法名;
(3)方式:
A、导包,调用方法时直接写方法名。
B、不导包,调用方法时直接加前缀。
三、ArrayList(List集合的子实现类)
1、概述:ArrayList是List接口中常用的子实现类。
2、底层:数组实现,查询快,增删慢。线程不安全,不同步,执行效率高。
3、遍历功能
(1)Iterator iterator()方式。
(2)size()和get(int index)结合,普通for循环。
(3)增强for循环(实际开发中常用)。
(4)ListIterator listIterator()方式。
四、Vector(List集合的子实现类)
1、底层:是一种可增长对象数组实现,查询快,增删慢,线程安全,同步,执行效率高。
2、特有功能
(1)public void addElement(Object obj)添加元素。
(2)public Enumeration elements()返回此向量的枚举,相当于public Iterator iterator()。
(3)boolean hasMoreElements()判断是否有可遍历的元素。
(4)Object nextElement()遍历下一个元素。
五、LinkedList(List集合的子实现类)
1、底层:链表实现,查询慢,增删快。线程不安全的,不同步,执行效率高。
2、特有功能
(1)添加功能
A、addFirst(Object e):将指定的元素插入到列表的开头
B、addLast(object e):将指定的元素添加到列表末尾
(2)获取功能
A、getFirst():获取列表第一个元素
B、getLast():获取列表第二个元素
(3)删除功能
A、public Object removeFirst()移除并返回此列表的第一个元素。
B、public Object removeLast()移除并返回此列表的最后一个元素。
3、实例:
六、Set集合
1、Set集合和List集合的区别
(1)Set集合:不允许元素重,且元素唯一,不能保证迭代的顺序恒久不变(底层哈希表和hascode),无序(存储和取出不一致),元素可以为null。
(2)List集合:允许元素重复,有序(存储和取出一致)。
2、Set集合创建对象(用子实现类HashSet):Set<数据类型> set = new HashSet<数据类型>();
3、Set集合元素唯一性和无序性原因
(1)唯一性:HashSet的add()方法底层依赖于双列集合HashMap,它依赖于两个方法,HashCode()方法和equals()方法。
(2)无序性:底层的哈希表和hashcode()方法。
4、自定义类中用Set集合
自定义类中用Set集合,无法保证元素唯一性。若要在自定义类中保证元素唯一性,需在自定义类中重写HashCode()方法和equals()方法。
七、LinkedHashSet集合
1、概述:具有可预知迭代顺序,元素唯一、有序,底层由链接列表与哈希表组成。
2、LinkedHashSet集合创建对象:
LinkedHashSet<数据类型> 对象名=new LinkedHashSet<数据类型>。
3、元素唯一有序原因
(1)保证元素唯一性:由哈希表决定(HashCode()方法和equals()方法)。
(2)保证元素有序性:由链表决定。
八、TreeSet集合
1、概述:TreeSet集合元素唯一,有序,默认情况下是通过自然顺序对集合中的元素排序。
2、TreeSet集合创建对象:TreeSet<数据类型> 对象名=new TreeSet<数据类型>();(默认)。
3、TreeSet集合添加元素存储方式
TreeSet集合依赖于TreeMap结构实现,红黑树结构(自平衡的二叉树结构)。
(1)将存储的第一个节点作为根节点;
(2)后面的每一个元素添加进来时,均与已存储的根节点作比较:
A、大于根节点,作为右孩子;
B、小于根节点,作为左孩子;
C、如果已经存在,忽略该元素,不存储。
上述方式保证了元素唯一有序。
4、取出元素:底层进行前序遍历或中序遍历或后序遍历。
5、TreeSet集合构造方法不同,使用的排序也不同
(1)无参构造:使用自然排序。自定义类需要实现Comparable接口,并需要在自定义类中重写该接口中的compareTo()方法。创建对象:TreeSet<类名> 对象名=new TreeSet<类名>();(默认情况)。
(2)有参构造:使用比较器排序。两种实现方式:
A、自定义类需要实现Comparator接口,并需要在自定义类中重写该接口中的compare()方法。创建对象:TreeSet<类名> 对象名=new TreeSet<类名>(new Comparator());
B、在主函数中用接口匿名内部类的方式实现,直接在主函数中实现Comparator接口,重写compare方法。创建对象:TreeSet<类名> 对象名=new TreeSet<类名>(new Comparator<类名>());
6、自定义类中用TreeSet集合实现自然排序:
自定义类需要实现Comparable接口,并在自定义类中重写该接口中的compareTo()方法,重写该方法时,需要在方法中写排序条件。
自定义类格式:
public class 类名 implements Comparable<类名> {
……
public 返回值类型 comparaTo(类名 对象名){
排序条件;
}
}
7、自定义类中用TreeSet集合实现比较器排序:
(1)自定义类需要实现Comparator接口,并需要在自定义类中重写该接口中的compare()方法。创建对象:TreeSet<类名> 对象名=new TreeSet<类名>(new MyComparator());
(2)在主函数中用接口匿名内部类的方式实现,直接在主函数中实现Comparator接口,重写compare方法。创建对象:TreeSet<类名> 对象名=new TreeSet<类名>(new Comparator<类名>());
九、Map集合
1、概述:键值的映射关系的一种集合(接口)。将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 Map<K,V>,在Map集合中,只针对键有效,与值无关。
2、Map接口的子实现类:HashMap,TreeMap。
3、Map集合和Collection的区别(面试题)?
(1)Map集合:一种键和值的映射关系(双列集合)。
(2)Collection集合::单列集合,只能存储一种类型的元素。
(3)间接关系:HashSet依赖于Map接口的子实现类HashMap,TreeSet依赖于Map接口的子实现类TreeMap。
4、Map集合创建对象:Map<键类型,值类型> 对象名=new HashMap<键类型,值类型>。
5、Map接口功能
(1)添加功能V put(K key,V value) :将指定的值和键关联起来。如果当前的键是一次存储,则返回值null,如果不是第一次存储,返回值是第一次对应的值,当前的值会把之前的键对应的值替换掉。
(2)获取功能
A、Set<Map.Entry<K,V>> entrySet()与和Map集合的遍历有关系,键值对对象。
B、Set<K> keySet()获取映射关系中所有的键的集合。
C、int size()返回此映射中的键-值映射关系数。
(3)删除功能
A、void clear()删除所有映射关系(暴力删除)。
B、Vremove(Object key)如果存在一个键的映射关系,将其从此映射中移除,返回的是该键对应的值。
(4)判断功能
A、boolean containsKey(Object key)判断此映射中是否包含指定键的映射关系,若包含则返回 true。
B、boolean containsValue(Object value)判断映射关系中是否包含指定的值,若包含则返回 true。
C、boolean isEmpty()判断映射关系是否为空。
(5)获取功能
A、Set<K> keySet()获取映射关系中所有的键的集合。
B、V get(Object key)通过键找值。
十、数组转换为固定大小的集合
1、方法:public static <T> List<T> asList(T... a) :将数组转换成固定大小的集合。
注意:用该将数组转换成固定大小的集合时,不能在该集合中添加元素,或者删除元素,否则会出现不支持该操作异常:java.lang.UnsupportedOperationException。
原文地址:http://blog.51cto.com/13678728/2114906