Java泛型和集合之泛型介绍

  在声明一个接口和类的时候可以使用尖括号带有一个或者多个参数但是当你在声明属于一个接口或者类的变量的时候或者你在创建一个类实例的时候需要提供他们的具体类型。我们来看下下面这个例子

List<String>words = new ArrayList<String>();
words.add("Hello ");
words.add("world!");
String s = words.get(0)+words.get(1);
assert s.equals("Hello world!");

  

  在集合框架中,ArrayList<E>实现了接口List<E>,上面这个简单的代码声明了包含了多个字符串列表的变量words,并且创建了一个ArrayList实例,把两个字符串添加到这个列表中,然后把他们取出来。在Java以前的泛型中,相同的代码会这样写:

List words = new ArrayList();
words.add("Hello ");
words.add("world!");
String s = ((String)words.get(0))+((String)words.get(1))
assert s.equals("Hello world!");

  

  如果没有泛型,参数类型会被忽略掉。但是在元素从列表中取出的时候你必须,明确的使用强制类型转换。实际上,从上面两种源文件编译后的字节码文件时完全一样的。我们说这是泛型擦除。因为List<Integer>,List<String>, and List<List<String>>等等这些类型在运行时都是相同的类型List。我们将从第一个程序到第二个程序的处理过程称为泛型擦除。术语擦除是有一点不准确,因为程序擦除了参数类型但是增加了强制转换。

  泛型隐式的使用了相同的强制转换而显示的表示没有使用泛型。如果这个转换失败,那么使用泛型写的代码就很难去调试了。因为下面的前置条件说以为什么说泛型是可靠的:
通过泛型编译加入的隐式转换永远不会失败。

  这个条件有很重要的一点是:对于编译器来说,它没有已发布的未检查的警告的时候这个才有效。稍后我们将在一定程度上讨论什么导致已发布的未检查的警告还有就是怎么样最小化他们的影响。通过泛型擦除实现的泛型有很多好处。它使事情变得简单,在这样的泛型中不会添加任何根本上讲新的东西;它使事情变得的小巧,准确来讲它只会有一个List的实现,而不是针对每个类型有一个版本;它擦除了过程,因为在相同的库中我们可以用泛型或者非泛型的形式去访问调用。最后一点是很值得好好的阐述的,你不会碰到令你不快的问题在你使用两种不同版本的类库时:使用1.4或者以前的遗留的非泛型版本,和一个使用版本5和6的泛型版本。在字节码层面,不适用泛型的代码和使用泛型的代码是一样的。没有必要立刻转向全部转泛成型---你可以升级你的代码通过每次只更新一个包一个类一个方式去开始使用泛型。我们甚至可以解析出你为遗留大代码声明的泛型类型。

  通过泛型擦除还有另外一个影响就是数组类型和参数化的类型在使用上是不一样的。运行new String[size] 将分配一个数组并且另外在这个数组中存储String类型的组件。作为对比,运行new ArrayList<String>()分配了一个列表,但是不另外存储列表的元素类型在这个列表中。在术语中,我们说Java具体化了数组元素的类型。但是没有具体化列表的元素类型。

很难去

时间: 2024-11-29 11:27:58

Java泛型和集合之泛型介绍的相关文章

Java基础之集合与泛型

话不多说,直接上图 1.Collection集合小结 注意: 凡是使用哈希表保存对象的容器,保存的对象在容器中都是唯一的,唯一性是通过被保存对象的hashCode和equals方法共同确定: 凡是使用二叉树保存对象的容器,保存的对象在容器中都是唯一的,而且保存时就是有序的,有序性和唯一性依赖被保存对象实现Comparable接口,或传递给容器的比较器对象(实现了Comparator接口的对象): 2. Map集合总结 Map集合的特点: 1, Map集合中存储的是key-value的映射关系:

Head first java chapter 16 集合与泛型(数据结构)

Java笔记(8)-泛型与集合框架

泛型与集合框架 泛型 泛型类 泛型类声明对象 示例 泛型接口 示例 泛型的目的 链表 LinkedList E 泛型类 常用方法 遍历链表 示例 排序和查找 示例 洗牌和旋转 堆栈 示例 散列映射 HashMap KV 泛型类 常用方法 遍历散列映射 基于散列映射的查询 示例 树集 TreeSetE泛型类 节点的大小关系 TreeSet类常用方法 示例 树映射 泛型与集合框架 组织数据之结构及相关操作. 泛型 泛型(Generics)是在JDK1.5中推出的,其主要目的是可以建立具有类型安全的集

集合与泛型

集合类负责存储一系列的个体,其集合的长度可能是不变的或者可变的.相比于普通的数组结构,集合类的功能更加具体. 集合类分为普通(非泛型)集合和泛型集合.泛型集合类的命名空间为集合的一个子命名空间:System.Collections.Generic.非泛型的集合中,所有的成员都被当作为object类型,不同的成员可以拥有不同的数据类型.而泛型的集合所有的成员类型都是相同的. 非泛型集合 所有非泛型集合都实现接口ICollection. 所有非泛型集合中的成员都是object. 集合类的基础接口IC

java基础(18):集合、Iterator迭代器、增强for循环、泛型

1. 集合 1.1 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的.集合中存储的元素必须是引用类型数据 1.2 ArrayList集合存储元素 练习一:ArrayList集合存储5个int类型元素 public static void main(String[] args) { ArrayLi

Java中泛型在集合框架中的应用

泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通过代码也可以看出来,我们放入其他类型时,如字符串,编译器不会报错,但是运行程序时会抛出类型错误异常,这样给开发带来很多不方便,用泛型就解决了这个麻烦 泛型规定了某个集合只能存放特定类型的属性,当添加类型与规定不一致时,编译器会直接报错,可以清楚的看到错误 当我们从List中取出元素时直接取出即可,不

恶补java(十)---泛型与集合的再学习

其余的就不多说了,一切都在代码中 package com.gc.generic; /** * JDK5 之前集合对象使用问题: * 1.向集合添加任何类型对象 * 2.从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换 * 存在安全隐患 * * ***************************** * * JDK5中的泛型:允许程序员使用泛型技术限制集合的处理类型 * List<String> list=new ArrayList<String>(); * 从而

Java基础---泛型、集合框架工具类:collections和Arrays

第一讲     泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类型的数据,无法加入指定类型以外的数据. 3.泛型是提供给javac编译器使用的可以限定集合中的输入类型说明的集合时,会去掉“类型”信息,使程序运行效率不受影响,对参数化的泛型类型,getClass()方法的返回值和原始类型完全一样. 4.由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就

java.基础、集合、枚举、泛型、

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