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具体化了数组元素的类型。但是没有具体化列表的元素类型。
很难去
Java泛型和集合之泛型介绍的更多相关文章
- Java基础之集合与泛型
话不多说,直接上图 1.Collection集合小结 注意: 凡是使用哈希表保存对象的容器,保存的对象在容器中都是唯一的,唯一性是通过被保存对象的hashCode和equals方法共同确定: 凡是使用 ...
- Java泛型和集合之泛型VS模板
Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号 是因为他 ...
- java基础(7)集合与泛型
第一部分:Collection集合 1 collection集合概述 集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map. C ...
- JAVA基础之集合、Iterator迭代器、泛型及增强for循环
个人理解: 对于集合,首先要明确的是最顶层的接口是Collection接口类,其包含一些基本的方法以便子类调用,不过在定义的时候最好定义好数据类型,以免遍历时还得必须进行向上转型:特别注意的是其没有关 ...
- java基础(18):集合、Iterator迭代器、增强for循环、泛型
1. 集合 1.1 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数 ...
- Java 集合和泛型
一.集合(Collections) Java使用集合来组织和管理对象. 1.Java的集合类 集合类主要负责保存.盛装和管理对象,因此集合类也被称为容器类. 集合类分为Set.List.Map和Que ...
- Java集合之泛型的使用
Java集合之泛型的使用 泛型提供了一种轻便灵活的数据操作,数据的安全性相对提高. 泛型提供了对列表元素的约束条件,比如ArrayList有序链表,可存储任意类型的元素. 此处构建一个ArrayLis ...
- Java中泛型在集合框架中的应用
泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...
- Java基础知识强化之集合框架笔记30:集合之泛型的引入
1. 泛型的引入: (1)首先我们看看下面这一段代码,如下: package cn.itcast_01; import java.util.ArrayList; import java.util.It ...
随机推荐
- 具体解释首页被K后SEOer必做的三大排除方法!
近段时间.有非常多朋友向新辰抱怨说出大问题了,为神马site不到首页了,并且收录变成了0?唉,新辰不得不非常同情的告诉你:你的首页真的被K了!好了.作为一个职业SEOer.面对被K宛如已经看破红尘般没 ...
- hdu 5072 Coprime(同色三角形+容斥)
pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜 ...
- RSA JS 加密解密DEMO
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script&g ...
- 架构设计之设计模式 (一) 适配器(Adapter)---提高复用性
简介 简介是为了描述一下该模式是干嘛用的,为了让不了解该模式的人看了之后也有一些新的认识. 本文章分为两部分,第一部分主要介绍适配器模式:第二部分介绍该模式与相近模式的异同. 下午一直在讨论设计模式, ...
- [置顶] 纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!
前两天写的文章<纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!>受到很多网友的喜爱,今天特别推出姊妹篇<纯手工打造漂亮的瀑 ...
- HDU 2647 Reward(图论-拓扑排序)
Reward Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is comin ...
- 使用linux服务logrotate文件tomcat日志文件
使用notepad++编辑本地文件 tomcat: /usr/tomcat/logs/catalina.out { copytruncate daily dateext nocompress miss ...
- NYNU_省赛选拔题(3)
题目描述 二叉树,若其与自己的镜像完全相同,就称其为镜像树. 是一棵镜像树:而 不是镜像树.现给你一棵二叉树,请你判断其是不是镜像树. 输入 第一行是一个整数数T,表示测试数据有多少组每组数据第一行是 ...
- FMDB与GCD
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 因为FMD ...
- Hadoop之环境搭建
初学Hadoop之环境搭建 阅读目录 1.安装CentOS7 2.安装JDK1.7.0 3.安装Hadoop2.6.0 4.SSH无密码登陆 本文仅作为学习笔记,供大家初学Hadoop时学习参考. ...