泛型,JDK5新特性,List集合子实现类,Map集合,Set/TreeSet集合,asList

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

时间: 2024-12-12 03:49:57

泛型,JDK5新特性,List集合子实现类,Map集合,Set/TreeSet集合,asList的相关文章

JDK5新特性之线程同步工具类(三)

一. Semaphore实现信号灯 Semaphore可以控制同时访问资源的线程个数, 例如: 实现一个文件允许的并发访问数. Semaphore实现的功能就类似厕所有5个坑, 加入有十个人要上厕所, 那么同时只能有5个人能够占用, 当5个人中的任何一个人离开后, 其中在等待的另外5个人中就有一个可以占用了. 另外等待的5个人中可以是随机获得优先机会, 也可以使按照先来后到的顺序获得机会, 这取决于构造Semaphore对象时传入的参数选项. /** * Semaphore:信号灯 */ pub

Java API —— JDK5新特性

JDK5新特性 自动拆装箱.泛型.增强for.静态导入.可变参数.枚举   1.增强for概述 1)简化数组和Collection集合的遍历 2)格式: for(元素数据类型 变量 : 数组或者Collection集合) { 使用变量即可,该变量就是元素 } 3)好处:简化遍历 4)注意事项:增强for的目标要判断是否为null 例子1: package jdk5; import java.util.ArrayList; import java.util.List; /** * Created

JDK5新特性之 可变参数的方法

可变参数的方法:不知道这个方法该定义多少个参数 注意: > 参数实际上是数组 > 必须写在参数列表最后一个 package cn.itcast.day24.varparam; import java.lang.reflect.Type; /** * * JDK5新特性之 可变参数 * 定义方法时,不知道该定义多少个参数 * * 格式: * 修饰符 方法返回值 方法名(数据类型 ... 变量名){} * * 注意: * 可变参数实际上是一个数组 * 可变参数必须写在方法的参数列表的最后 * */

java 基础加强(myeclipse,debug,junit,JDK5新特性,反射)

思维导图 1.myeclipse的安装和使用 *eclipse:是一个免费的开发工具 *myeclipse:是一个收费的插件,破解myeclipse, **安装目录的要求: 不能有中文和空格 **安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格 *破解myeclipse **运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 *myeclipse的使用 *创建一个工程 -类型 javaproject  web  project -选择依赖的jdk,可以使用my

JDK1.5的新特性:javabean、注解类、类加载器

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

JDK5新特性之泛型

泛型是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型. 泛型的格式: <数据类型> 注意:此处的数据类型这能是引用类型 好处: A:把运行时期的问题提前到了编译期间 B:避免了强制类型转换 C:优化了程序设计 import java.util.ArrayList;public class ArrayListDemo { public static void main(String[] args) { ArrayList array = new ArrayList();

JDK5新特性之线程同步集合(五)

一. 传统集合: 传统方式下的Collection在迭代集合时, 不同意对集合进行改动: public class CollectionModifyExceptionTest { public static void main(String[] args) { Collection<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.ad

JDK5新特性之同步集合(五)

一. 传统集合: 传统方式下的Collection在迭代集合时, 不允许对集合进行修改: public class CollectionModifyExceptionTest { public static void main(String[] args) { Collection<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.ad

JDK5新特性--forEach循环

1.增强for循环概述 简化数组和Collection集合的遍历 2.格式 for(元素数据类型 变量:数组或者Collection集合){     使用变量集合,该变量就是元素 } package cn; public class ForDemo { public static void main(String[] args) { int[] arr = {1,2,3,4,5}; for (int i = 0; i < arr.length; i++) { System.out.println