JAVA SE自学 基础篇 (十二)集合类基础知识 什么是集合 List接口 Iterable接口和Iterator接口 泛型 ( Generic Type ) Map接口 Set接口

目标

  • 了解java集合框架
  • 熟练使用ArrayList, LinkedList, HashSet, HashMap
  • 尽可能了解这些集合类型的底层实现尤其是ArrayList和HashMap

什么是集合

  • 集合 ( Collection ), 是一种容器, 装对象的.
  • java集合框架在java.util包中.

集合关系图
colection接口是对一个线性表的抽象,不要求元素的唯一性和有序性。
List接口要求元素有序性(能通过下标访问),但不要求唯一性。
Set接口要求元素是唯一的,但不要求有序性
Map接口是对键值对(Key Value Pair)的抽象,要求Key具有唯一性。
Colection类是对集合进行各种操作的工具类/算法类

List接口

通用方法

  • add (E) //添加元素到末尾
  • add(int index,E obj)//插入新元素
  • set(int index)//替换新元素
  • remove(int index)// 移除指定元素
  • contains(object)//判断集合是否包含了指定对象,内部用了equls来比较两个对象
  • clear()//清空元素
  • get)(intindex)//通过下标获取元素
  • size()//通过下标获取元素个数
  • subList(int beginIndex,int endList)//提取一段,返回list

List接口有2个典型实现类:

  • getFirst()
  • getLast()
  • addFirst()
  • addLast()
  • removeFirst()
  • removeLast()

Iterable接口和Iterator接口

Iterable表示可迭代的/可遍历的
Iterator表示迭代器, 它负责迭代的过程
Iterable接口中定义了iterator()方法, 作用是返回迭代器对象.
Iterator接口定义了hasNext()方法和next()方法, 前者用于判断集合中是否还有下一 个元素, 后者返回下一个元素.

Collection接口继承了Iterable接口, 所以只要是这个家族的集合, 都可以用 Iterator进行遍历.
只不过, Iterator有很多不同的实现.

泛型 ( Generic Type )

泛型, 广泛的数据类型, 它能像参数一样传递给类, 接口, 方法.
典型例子:

	// what is E? 使用时传入 
	public interface List<E> extends Collection<E> { 
   		void add(E e); 
    	E get(int index); 
    }  
    public class ArrayList<E> implements List<E> { 
    
    } 
List<Dog> dogs = new ArrayList<Dog>(); // 使用时, 确定了E的类型为Dog 
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
dogs.add(Dog dog) // 这里就必须传入Dog类型的实参 
Dog dog = dogs.get(0) // 这里的返回值必然是Dog类型

泛型还可以用于方法:

public static <A> A hello(A obj){}

泛型集合带来了哪些好处?
- 类型安全
- 获取集合中的对象时,不需要向下转型

扩展: ArrayList中使用Object[]存储对象, 它也没有规定具体类型. 请研究"泛型擦 除".

Map接口

  • Map表示地图, 键值对(K-V)
  • 一个K必然映射到一个确定的V
  • K唯一!

Map的典型实现是HashMap和TreeMap.

Java 1.8 以前, HashMap的底层是数组 + 链表
Java 1.8 以后, HashMap的底层除了数组 + 链表, 还加入了红黑树 ( 二叉树的一种, 平衡二 叉树 )

Map的通用方法:

  • put(K, V) // 添加键值对到map中, 如果K已存在, 覆盖其Value
  • get(K) // 通过K获取V
  • remove(K) // 通过K移除键值对
  • containsKey(K) // 判断map中是否包含这个K
  • keySet() // 返回键集, Set类型的集合
  • values() // 返回值集, Collection类型的集合
注意: 如果重写了一个类的equals(), 请务必重写hashCode(), 以避免对象存储在 HashMap中产生不一致性! 要满足这样的原则: 
1. 如果两个对象hashCode()不同, 那这一定是两个不同的对象, (equals = false) 
2. 如果两个对象hashCode()相同, 这并不意味着equals=true  
3. 如果两个对象equals为true, 那么hashCode()一定相等!

Set接口

Set如何保证元素唯一性 ? 使用Map, 把元素E当成Map的Key

典型实现有HashSet, TreeSet

经验: 以Tree开头的, 都是有序二叉树结构, 但这不意味着它有逻辑上的下标!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值