day14、15 集合

Java中的集合类

集合概述

  • Java中集合类是用来存放对象的
  • 集合相当于一个容器,里面包容着一组对象 —— 容器类
  • 其中的每个对象作为集合的一个元素出现
  • Java API提供的集合类位于java.util包内

Java中数组与集合的比较

  • 数组也是容器,它是定长的,访问较快,但是数组不会自动扩充
  • 数组可以包含基本数据类型或引用类型的对象,而集合中只能包含引用类型的对象

Java中集合框架层次结构

在这里插入图片描述

Collection接口

一组称为元素的对象
一个Collection中可以放不同类型的数据,是Set接口和List接口的父类

  • 是否有特定的顺序以及是否允许重复,取决于它的实现
    • Set - 无序的集合;不允许重复
      HashSet
    • List - 有序的集合;允许重复
      ArrayList
      LinkedList
      在这里插入图片描述

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 变量名 = new ArrayList() ;
ArrayList 变量名 = new ArrayList(int capacity) ;

LinkedList类的构造方法

LinkedList 变量名 = new 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要多一些

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对象的参数 ,在获取集合中的对象时,必须进行造型(强制类型转换)操作。
    • 造型操作可能出现问题,一般在程序运行时才能发生,发现问题比较困难。
  • 集合中泛型的使用
    • 在对象放入集合前,为其作个限制
    • 在获取集合中的对象时,不用进行造型的操作
    • 当有不同类型的对象添加到集合中的时候,编译时就能检查出错误

集合中泛型的使用

泛型经常被称为参数化类型,它能够像方法一样接受不同类型的参数。
定义方式

ArrayList 变量名 ;

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("你好,查无此人");
		}	
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值