java集合框架支持三种类型,Java集合框架(一)
集合类存放于java.util包中,集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)
集合类型主要有3种:set(集)、list(列表)和map(映射)
通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器
Collection接口
Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素,Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)
Collecton接口常用的子接口有:List接口、Set接口
List接口常用的子类有:ArrayList类、LinkedList类
Set接口常用的子类有:HashSet类、LinkedHashSet类如
接口多态的调用
Collection collection = new ArrayList();
741560-20170330144456389-1484217347.png
注意
学习Java中三种长度表现形式
数组.length 属性,返回值int
字符串.length() 方法,返回值int
集合.size()方法, 返回值int
Iterator接口
迭代器概述
java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。 我们要取出这些集合中的元素,可通过一种通用的获取方式来完成
每种集合的底层的数据结构不同,例如ArrayList是数组,LinkedList底层是链表,但是无论使用那种集合,我们都会有判断是否有元素以及取出里面的元素的动作,那么Java为我们提供一个迭代器定义了统一的判断元素和取元素的方法
hasNext()如果有元素可以迭代,则返回true
next()返回迭代的下一个元素
Iterator接口,找实现类,Collection接口定义方法,ArrayList重写方法iterator()返回了Iterator接口的实现类的对象
public class Test {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("cuzz1");
collection.add("cuzz2");
collection.add("cuzz3");
collection.add("cuzz4");
// 迭代器,对集合ArrayList中的元素进行取出
// 调用集合iterator()方法取出,Iterator接口的实现类的对象
Iterator iterator = collection.iterator();
// 接口的实现类对象,调用方法hasNext()判断集合中是否有元素
boolean bool = iterator.hasNext();
// 接口的实现类的对象,调用方法next()取出集合中的元素
// String str = iterator.next();
// System.out.println(str);
// 迭代是反复的内容,使用循环实现
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
集合元素的转型
使用集合时,我们需要注意以下几点:
集合中储存都是对象的地址,那集合可以储存基本数据类型吗?
jdk1.5版本以后可以存储了,因为出现类基本类型包装类,可以自动装箱操作,这样集合中的元素就是基本数值的包装类对象
存储时提升了Object。取出时要使用元素的特有内容,必须向下转型
public class Test {
public static void main(String[] args) {
// Collection collection = new ArrayList();
// 不指定数据类型
Collection collection = new ArrayList();
collection.add("cuzz1");
collection.add("cuzz2");
collection.add("cuzz3");
collection.add("cuzz4");
Iterator iterator = collection.iterator();
while (iterator.hasNext()){
// 由于元素别放进集合后全部被提升为Object类型
// 当需要使用子类特有的方法时,需要向下转型
String str = (String) iterator.next();
System.out.println(str.length());
}
}
}
注意如果集合中放的是多个对象,这时进行向下转型会发生类型转换异常
增强for循环
JDK1.5新特性,增强for循环,JDK1.5版本后,出现新的接口 java.lang.Iterable
Collection开是继承Iterable,Iterable作用,实现增强for循环
格式:
for( 数据类型 变量名 : 数组或者集合 ){
}
泛型
泛型的引入
在前面学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。比如下面程序:
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc");
list.add("itcast");
list.add(5); // 由于集合没有做任何限定,任何类型都可以给其中存放
// 相当于:Object obj=new Integer(5);
Iterator it = list.iterator();
while(it.hasNext()){
// 需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
String str = (String) it.next(); // String str=(String)obj;
// 编译时期仅检查语法错误,String是Object的儿子可以向下转型
// 运行时期String str=(String)(new Integer(5))
// String与Integer没有父子关系所以转换失败
// 程序在运行时发生了问题java.lang.ClassCastException
System.out.println(str.length());
}
}
}
泛型的定义和使用
从JDK1.5开始,引入了参数化类型(Parameterized Type)的概念,改造了所有的Java集合,使之都实现泛型,允许程序在创建集合时就可以指定集合元素的类型,比如List就表名这是一个只能存放String类型的List
public class Test {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
list.add("cuzz1");
list.add("cuzz2");
// list.add(1); // 类型不符,直接报错
}
伪泛型
Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原始类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的Java语言来说,ArrayList与ArrayList就是同一个类。所以说泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型
泛型类
一个泛型类(generic class)就是具有一个或多个类型变量的类。定义一个泛型类十分简单,只需要在类名后面加上<>,再在里面加上类型参数:
例如,API中的ArrayList集合:
class ArrayList{
public boolean add(E e){ }
public E get(int index){ }
}
创建对象时,确定泛型的类型
ArrayList list = new ArrayList();
此时的变量E就代表String类型
class ArrayList{
public boolean add(String e){ }
public String get(int index){ }
}
泛型的方法
定义格式:修饰符 返回值类型 方法名(参数){ }
例如,API中的ArrayList集合中的方法:
public T[] toArray(T[] a){ } ,该方法,用来把集合元素存储到指定数据类型的数组中,返回已存储集合元素的数组
ArrayList list = new ArrayList();
String[] arr = new String[100];
String[] result = list.toArray(arr);
泛型的接口
与泛型类定义类似
public interface List {
abstract boolean add(E e);
}
实现类,先实现接口,不理会泛型
public class ArrayList implements List{
}
后期创建集合对象的时候指定数据类型,new ArrayList()
泛型的通配符
通配符 “?”
如果定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,“?”,如List>,“?”可以代表任意类型,“任意”也就是未知类型。
public class GenericTest {
public static void main(String[] args) {
ArrayList array = new ArrayList();
HashSet set = new HashSet();
array.add("123");
array.add("456");
set.add(789);
set.add(890);
printItems(array);
printItems(set);
}
public static void printItems(Collection> collection){
Iterator> iterator = collection.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
通配符上界
extends Employee>限制的是父类, 上限限定
酒店员工是厨师,服务员,经理三者的父类,所在只有这三个限定在其中
public static void iterator(ArrayList extends Employee> array){
Iterator extends Employee> it = array.iterator();
while(it.hasNext()){
// 获取出的next() 数据类型,是什么Employee
Employee e = it.next();
e.work();
}
}
通配符下界
super Employee> 限制的是子类, 下限限定
只能传递Employee的父类
java集合框架支持三种类型,Java集合框架(一)相关推荐
- Java接口方法的三种类型
Java接口方法的三种类型 接口中的方法分别有以下三种 普通方法:使用default修饰的接口方法,可以拥有方法体,实现类不需要重写,可以被实现类继承,该特性是Java8以后被提出: 静态方法:接口中 ...
- Asp.net支持三种类型的cache[转]
from:http://www.cnblogs.com/thomasnet/archive/2006/11/26/573104.html Asp.net支持三种类型的cache 想写一个技术快速概述, ...
- linux支持三种类型的硬件,linux
纪晓岚曾经说:"世间的道理与事情,都在古人的书中说尽,现在如再著述,仍然超不过古人的范围,又何必再多著述."于是他一生之中,从不著书,只是编书--整理前人的典籍,将中国文化作系统的 ...
- java定义数组的三种类型
三种定义数组的格式如下: int[] arr1=new int[10]; int[] arr2={1,2,3,6}; int[] arr3=new int[]{1,2,3,4,5,6,7,22}; 注 ...
- aop框架 php,xaop: 支持三种模式的AOP框架,弥补PHPer的不足,并且自带了文档的解析类库,可以一并使用,性能极好,欢迎 STAR 与 FORK。...
Xaop PHP高性能的AOP扩展 功能特色 基于对象的文档注解AOP模式 方法注入AOP模式 属性AOP模式 系统指令及其含义 xaop.method_prefix AOP文档注解需要排除的方法前缀 ...
- JAVA高并发的三种实现 Java高并发,如何解决,什么方式解决
提到锁,大家肯定想到的是sychronized关键字.是用它可以解决一切并发问题,但是,对于系统吞吐量要求更高的话,我们这提供几个小技巧.帮助大家减小锁颗粒度,提高并发能力. 初级技巧-乐观锁 乐观锁 ...
- GoAccess 支持三种类型的存储方式。请根据你的需要和系统环境进行选择
默认哈希表 内存哈希表可以提供较好的性能,缺点是数据集的大小受限于物理内存的大小.GoAccess 默认使用内存哈希表.如果你的内存可以装下你的数据集,那么这种模式的表现非常棒.此模式具有非常好的内存 ...
- java 数组类型定义_java定义数组的三种类型总结
三种定义数组的格式如下: int[] arr1=new int[10]; int[] arr2={1,2,3,6}; int[] arr3=new int[]{1,2,3,4,5,6,7,22}; 注 ...
- Java中对象的三种状态
转载自 Java中对象的三种状态 Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可 ...
最新文章
- Android中修改弹出dialog背景无色透明,弹出时有遮罩
- 华为什么时候开始升级鸿蒙,鸿蒙什么时候开放升级?华为又食言了,官方宣布延期到六月...
- 企业分布式微服务云SpringCloud SpringBoot mybatis (五)路由网关(zuul)
- 零基础如何快速上手高精度AI模型开发?
- 思科pix防火墙配置实例大全
- html 5个人博客代码模板,5套漂亮的个人博客html模板分享
- 联想拯救者Y7000 win10+ubuntu18.04双系统 nvidia1050ti驱动安装
- 全国计算机一级考试题库及答案(2018)
- 基于C51单片机的锂电池容量检测仪电压电流检测 原理图PCB程序设计
- 基于微信小程序的投票系统源码
- 高精度绝对角度传感器应用高速度角度监测
- RequestHead详解
- 语法高亮自定义颜色主题配置(Code::Blocks)
- 个人免签码支付源码+监控APP【野马资源网】
- 万豪集团将在苏州引入丽思卡尔顿和万豪行政公寓双品牌项目;美联航等成立合资企业开发新可持续航空燃料技术 | 美通企业日报...
- 缺页中断与页面置换算法
- Linux命令之chown
- python分类汇总_数据分析番外篇13_利用Python实现分类汇总
- 网页代码中link标签的用法
- 求y=sin(x)从0到2*pi,与x轴围成的面积
热门文章
- 数字延时脉冲发生器DG645 技术参数
- 【CTR】《Towards Universal Sequence Representation Learning for Recommender Systems》 (KDD‘22)
- 采用MP188XX隔离式栅极驱动器系列构建电源系统
- java 堆内存与JVM参数
- 网络流和棒球赛淘汰问题 公平分配模板 足球联赛 UVa1306 The K-League
- android资源加载失败,解决Android WebView拦截url,视频播放加载失败的问题
- RANSAC拟合直线
- 案例:中科润泽鞋业专用ERP(CRS-ERP)在东艺鞋业的成功实施(转)
- 一家公司的PHP实习生笔试题
- Latex 分式格式处理