Java中的集合类
集合概述
- Java中集合类是用来存放对象的
- 集合相当于一个容器,里面包容着一组对象 —— 容器类
- 其中的每个对象作为集合的一个元素出现
- Java API提供的集合类位于java.util包内
Java中数组与集合的比较
- 数组也是容器,它是定长的,访问较快,但是数组不会自动扩充
- 数组可以包含基本数据类型或引用类型的对象,而集合中只能包含引用类型的对象
Java中集合框架层次结构
Collection接口
一组称为元素的对象
一个Collection中可以放不同类型的数据,是Set接口和List接口的父类
- 是否有特定的顺序以及是否允许重复,取决于它的实现
- Set - 无序的集合;不允许重复
HashSet - List - 有序的集合;允许重复
ArrayList
LinkedList
- Set - 无序的集合;不允许重复
Collection接口常用方法
方法 | 含义 |
---|---|
boolean add(Object) | 集合中加入一个对象,成功时返回true |
boolean addAll(Collection) | 集合中加入另外一个集合对象 |
int size() | 集合内容纳的元素数量 |
boolean isEmpty() | 集合是否为空 |
boolean contains(Object) | 集合内是否含有参数对象 |
Iterator iterator() | 产生一个迭代器 |
boolean remove(Object) | 从集合中删除对象 |
void clear() | 清空集合 |
Set接口
- Set接口——Collection的子接口
- 用来包含一组无序无重复的对象
无序 — 是指元素存入顺序和集合内存储的顺序不同;
无重复 — 两个对象e1和e2,如果e1.equals(e2)返回true,则认为e1和e2重复,在set中只保留一个。
- 用来包含一组无序无重复的对象
- Set接口的实现类
- HashSet — HashSet的特性在于其内部对象的散列存取,即采用哈希技术
- TreeSet — TreeSet存入的顺序跟存储的顺序不同,但是存储是按照排序存储的
使用foreach方式遍历Set集合
List接口
-
Collection的子接口——用来包含一组 有序有重复 的对象
-
List中的元素都对应一个整数型的序号,记载其在容器中的位置,可以根据索引取出容器中的元素
-
List有两种主要的集合实现类:
ArrayList
LinkedList -
两个实现类的区别:
- ArrayList
ArrayList是线性顺序存储的,是一种线性表
它的特性和数组很接近,数组大小是不变的,而ArrayList的大小是可以动态改变的 - LinkedList
是数据结构中链表的java实现
相对于List来说,LinkedList最主要的功能方面的增强是可以在List的头部和尾部添加、删除、取得元素,直接提供了这些方法的实现。所以它可以非常方便的实现我们数据结构中的常见的Stack(栈)、queue(队列)等
- ArrayList
实现类的初始化
ArrayList的构造方法
LinkedList类的构造方法
ArrayList和LinkedList
- LinkedList增加方法
方法 | 含义 |
---|---|
void addFirst(Object o) | 将给定元素插入此列表的开头 |
void addLast(Object o) | 将给定元素追加到此列表的结尾 |
Object getFirst() | 返回此列表的第一个元素 |
Object getLast() | 返回此列表的最后一个元素 |
Object removeFirst() | |
Object removeLast() | 移除并返回此列表的最后一个元素 |
- List接口的实现类
- ArrayList与LinkedList的比较
- 存储结构
- ArrayList是线性顺序存储
- LinkedList对象间彼此串连起来的一个链表
- 操作性能
- ArrayList适合随机查询的场合
- LinkedList元素的插入和删除操作性高
- 从功能上,LinkedList要多一些
- 存储结构
- ArrayList与LinkedList的比较
Iterator接口方法
- Iterator常用方法
方法 | 含义 |
---|---|
Object next() | 返回游标右边的元素并将游标移动到下一个位置 |
boolean hasNext() | 判断游标右边是否有元素 |
void remove() | 删除游标左边的元素,在执行完next之后,该操作只能执行一次 |
- Iterator实现过程
Collections类
Collections类是公用工具类 ,它提供了一些static方法操作集合类 。
- Collections类中的方法
方法 | 含义 |
---|---|
Object max(collection c) | 返回集合中的最大元素,需要考虑比较接口的实现 |
Object min(Collection c) | 返回集合中的最小元素 |
void reverse(Collection c) | 把集合中的元素顺序反转 |
int binarySearch(List list,Object key) | 对排序后的集合list进行查询元素操作 |
void sort(List list) | 对一种List做排序 |
Map接口
Map接口
-
Map内存储的是 键/值对 这样以成对的对象组(可以把一组对象当成一个元素),通过“键”对象来查询“值”对象
-
Map是不同于Collection的另外一种集合接口
-
Map中,key值是唯一的(不能重复),而key对象是与value对象关联在一起的
-
Map接口有两个实现:
HashMap — key/value对 是按照Hash算法存储的
TreeMap — key/value对是排序 (按key排序)存储的
Map接口常用方法
方法 | 含义 |
---|---|
Object put(Object key,Object value) | 将指定的值与此映射中的指定键相关联 |
void putAll(Map t) | 将映射t中所有映射关系复制到此映射中 |
Object get(Object key) | 返回此映射中映射到指定键的值 |
Object remove(Object key) | 若存在此键的映射关系,将其从映射中移除 |
boolean containsKey(Object key) | 若此映射包含指定键的映射关系,返回 true |
boolean containsValue(Object value) | 若此映射为指定值映射一个或多个键,返回 true |
int size() | 返回此映射中的键-值映射对数 |
void clear() | 从此映射中移除所有映射关系 |
boolean isEmpty() | 若此映射未包含键-值映射关系,返回 true |
集合类的选择
- Set内存放的元素不允许重复,List存放的元素有一定的顺序。
- Map的应用主要在利用键/值对进行快速查询。
- ArrayList和LinkedList的区别在于随机查询性能上ArrayList要好,但LinkedList的中间元素的插入与删除性能好 。
集合中的异常
异常类型 | 说明 |
---|---|
ClassCastException | 从集合中取得元素对象在进行类型转换的时候类型不匹配 |
IndexOutOfBoundsException | 集合中元素引用的索引值超出界限(<0或>size()) |
泛型的使用
- 集合在使用上的问题
- 集合中的add( )方法接受的是一个Object对象的参数 ,在获取集合中的对象时,必须进行造型(强制类型转换)操作。
- 造型操作可能出现问题,一般在程序运行时才能发生,发现问题比较困难。
- 集合中泛型的使用
- 在对象放入集合前,为其作个限制
- 在获取集合中的对象时,不用进行造型的操作
- 当有不同类型的对象添加到集合中的时候,编译时就能检查出错误
集合中泛型的使用
泛型经常被称为参数化类型,它能够像方法一样接受不同类型的参数。
定义方式
E是变量类型
练习
1、编写一个程序,创建一个 HashMap对象,存储通讯录信息 其中联系人为key,电话号码为Value。通过控制台输入联系人名字,输出其电话。
package com.tech.javase.ch10.练习;
// 面向对象的思维方式
// 定义了ContractWay联系方式
public class ContractWay {
// 属性
private String mobile; // 手机号
private String phone; // 座机号
private String qq; // qq号
private String mail; // mail
// 构造方法
public ContractWay(String mobile, String phone, String qq, String mail) {
// super();
this.mobile = mobile;
this.phone = phone;
this.qq = qq;
this.mail = mail;
}
public ContractWay() {
// super();
}
// set get
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
//其他方法
public void print() {
System.out.println("手机号:" + mobile);
System.out.println("座机号:" + phone);
System.out.println("qq号:" + qq);
System.out.println("mail:" + mail);
}
}
package com.tech.javase.ch10.练习;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 通讯录实现 {
public static void main(String[] args) {
// 1.创建出通讯录
Map<String, ContractWay> book;
book = new HashMap<>();
// 实际项目中 集合中存放的数据类型
// 基本都是我们自定义的类
// 数据必须new
// 2.调用put方法,存入信息
book.put("小明", new ContractWay("15541491234", "8635", "5036", "5036@qq.com"));
book.put("大明", new ContractWay("18840812345", "8678", "7021", "234@163.com"));
book.put("二明", new ContractWay("1571231111", "8678", "7784", "784@sina.com"));
Scanner sc = new Scanner(System.in);
System.out.println("请输入联系人名字");
String name = sc.next();
if ( book.containsKey(name) ) {
ContractWay w = book.get(name);
// w.print();
System.out.println("手机号是" + w.getMobile());
} else {
System.out.println("你好,查无此人");
}
}
}