首页 > 代码库 > Java集合基础
Java集合基础
Java集合框架的由来
在java1.2之前,java没有完整的集合框架。它只有一些简单的可以扩展的容器类,比如Victor,Stack,Hashtable等
为什么需要容器类:容器(集合类)可以存储多个数据。
数组的弊端:
1.长度是不可变的,一旦数组初始化之后,长度是固定的
2.在N个地方需要存储多个数据,都得专门去编写数组的操作方法。
什么是集合框架
尽管这些容器类非常好用,但是却不能集中和统一管理。集合框架是为表示和操作集合而规定的统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
为什么需要集合(集合框架的类和接口都放在java.util包中)
1.提供功能的复用
2.让程序员专注业务开发,而不是数据结构和算法
常用的集合:
集合中存储的对象,称之为集合的元素。
Set:集合中的对象不按特定的方式排序,不允许元素重复
List:集合中的对象按照索引位置排序,允许重复
Map:集合中的每一个元素都包含一堆key和value对象,不允许key对象重复,值是可以重复
链表结构
1.单向链表:只能从头遍历到尾巴 或者只能从尾巴遍历到头
2.双向链表:既可以从头到尾也可以从尾遍历到头
通过引用关系来表示上一个节点和下一个节点的关系
二.集合的迭代操作
1.for循环
2.For-each
3.Iterrator步骤
a.调用iterator() 方法 b.调用hasNext()方法 c.调用next()方法
三.Set接口
1.Set接口存储一组唯一的、无序的对象
2.不会记录元素的添加先后顺序
3.HashSet是Set接口常用的实现类
HashSet如何判断两个对象是否相同
1.两个对象的equals比较相等,返回true,说明是相同对象
2.两个对象的hashCode方法返回值相等
比较过程:当往HashSet集合中添加新的对象的时候,先会判断该对象和集合对象中的hashCode值
1)不等:直接把该新的对象存储到hashCode指定的位置
2)相等:再继续判断新对象和集合对象中equals作比较
a) hashCode相同,equals相同true:则视为是同一个对象,则不保存在哈希表中
b) hashCode相同,equals不同false
Set接口如何判断加入对象时候已经存在?
采用对象的equals()方法比较两个对象时候相等
四.Map接口
映射的数学解释:
设A/B两个非空集合,如果存在一个法则f,使得A中的每个元素,按照法则f,在B中有唯一的确定的元素b与之对应,则称为从A到B的映射。
映射关系(两个集合):A集合和B集合>>>>A集合中的每一个元素都可以在B集合中找到唯一的一个字与之对应。
严格上来说,Map是集合不太恰当,应该是两个集合之间的映射关系,然而Map可以存储数据(每次存储都应该存储A集合中一个元素(Key),B集合中的一个元素(value)),我们习惯吧Map也称之为集合。
问题:建立国家英文简称和中文全民之间的键值映射
遍历Map集合:迭代器 增强for循环
常用方法: put(k,v) get(k) remove(k) size() keySet()--返回Set
五.泛型
为什么要使用泛型:
1.存储任意类型的数据在集合中,但是取出来的时候都是Object类型,此时就得强制类型转换
2.可以约束存储到集合中的元素必须是相同的数据类型(相同的数据类型才能作比较)
3.设计 一个 Point 类,来表示坐标位置,要求坐标位置支持String 、Integer、Double类型
什么是泛型:将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定
1.广泛通用的类型
2.代码模板中类型不确定,谁调用该代码,谁指明类型是什么
泛型类:直接在类/接口上定义的泛型
使用泛型:
保证前后类型相同
List<String> list=new ArrayList<String>() // 该集合只能存储String类型
因为前后类型相同,所以从java7开始,推出了泛型的菱形语法<>
List<String> list=new ArrayList<>();
泛型不存在继承关系:List<Object> list=new ArrayList<String>() >>>>>错误的语法
以后,使用集合都得用泛型来约束该集合中的元素类型。
泛型方法:在方法上声明泛型
情况1:泛型类中的泛型只适用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法
情况2:泛型类中的方法
一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须由参数设置进来的。如果没有参数来设置泛型的具体类型,此时的方法一般返回设计Object即可。
Java集合基础