一、泛型(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。