首页 > 代码库 > Java集合基础

Java集合基础

Java集合框架的由来

java1.2之前,java没有完整的集合框架。它只有一些简单的可以扩展的容器类,比如VictorStackHashtable

为什么需要容器类:容器(集合类)可以存储多个数据。

数组的弊端:

1.长度是不可变的,一旦数组初始化之后,长度是固定的

2.N个地方需要存储多个数据,都得专门去编写数组的操作方法。

什么是集合框架

尽管这些容器类非常好用,但是却不能集中和统一管理。集合框架是为表示和操作集合而规定的统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。

为什么需要集合(集合框架的类和接口都放在java.util包中)

1.提供功能的复用

2.让程序员专注业务开发,而不是数据结构和算法

常用的集合:

集合中存储的对象,称之为集合的元素。

Set:集合中的对象不按特定的方式排序,不允许元素重复

List:集合中的对象按照索引位置排序,允许重复

Map:集合中的每一个元素都包含一堆keyvalue对象,不允许key对象重复,值是可以重复

 

 

 

链表结构

1.单向链表:只能从头遍历到尾巴 或者只能从尾巴遍历到头

2.双向链表:既可以从头到尾也可以从尾遍历到头

通过引用关系来表示上一个节点和下一个节点的关系

 

 

 

 

二.集合的迭代操作

1.for循环

2.For-each

3.Iterrator步骤    

a.调用iterator() 方法   b.调用hasNext()方法    c.调用next()方法

 

三.Set接口

1.Set接口存储一组唯一的、无序的对象

2.不会记录元素的添加先后顺序

3.HashSetSet接口常用的实现类

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与之对应,则称为从AB的映射。

映射关系(两个集合)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 IntegerDouble类型

 

什么是泛型:将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定

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集合基础