Java 集合基础

Collection/集合

Collection与Collections

  • Collection是所有集合类的根接口;
  • Collections是提供集合操作的工具类;

集合类和数组不同

  • 数组元素可以为基本数据类型值/对象引用;
  • 集合元素只能为对象引用;

Java的集合类由Collection接口和Map接口派生,

  • Set代表无序集合,
  • 无序不可重复;
  • List代表有序集合,有序可重复;
  • Map集合存储键值对;

在这里插入图片描述

toArray(T[] array)/集合转数组


1.<T> T[] toArray(T[] a);
集合转数组时,必须使collection的toArray(T[] array)方法,传入类型完全一样的数组,大小应为list.size();

在这里插入图片描述
直接使用toArray无参方法,返回值只能是Object[]类,进行类型强转会出现ClassCastException错误;


Iterator/迭代器

  1. public interface Iterable<E> { // Iterable泛型接口
  2. Iterator<E> iterator(); // 由继承接口的集合类负责实现,返回一个迭代器
  3. }

Iterator用于遍历/迭代访问集合中的元素,只能单向移动;
Iterator遍历方式一:

Iterator it = CollectionInstance.iterator(); // Iterator应与指定集合绑定
while(it.hasNext()) // 如果集合尚未迭代完毕,返回ture
{
   collectionElementType cet = (collectionElementType)it.next();   // next()方法返回集合下一个元素
   it.remove();   // remove()方法删除上一次调用next方法返回的集元素
}

Iterator遍历方式二:

// foreach循环遍历
for(CollectionType obj : Collection) {
   ...
}

Set/无序集合/集

Set集合中对象不可重复,因此当试图添加两个相同元素时,add()方法返回false/元素不可加入;
Set集合中对象必须重写hashCode()方法和equals()方法;


HashSet/散列集

按照Hash算法存储结合元素—>具有良好的存取/查找性能;

  • 添加元素时,调用hashCode()方法计算对象的hashCode值;
  • 根据hashCode值决定对象的存储位置—>元素存储顺序和添加顺序可能不一致(LinkedHashSet可保证);
  • HashSet判断元素相等的标准:equal()方法相等/hashCode()方法返回值相同;
  • Hash算法/哈希/散列:通过计算元素的hashCode值获取元素的存储位置—>价值在于存取/查找速度快
  • 与数组相比,HashSet索引不需要连续,可自由增加HashSet长度;

LinkedHashSet


HashSet的子类,LinkedHashSet也是根据元素的hashCode值决定其存储位置;
同时使用链表维护元素的添加次序—>性能略低于HashSet的性能;


TreeSet/树集

TreeSet实现SortSet接口,
TreeSet采用红黑树(red-black tree)存储集合元素,排序规则支持自然排序/定制排序;
TreeSet存储对象必须实现Comparable接口;


List/列表

Java中所有链表底层都是双向链接(doubly linked);
List额外提供listIterator()方法,该方法返回一个ListIterator对象,用于遍历List;
ListIterator的set(obj)方法用新元素obj覆盖next()/previous()返回的上一个元素,可以双向移动;

ListIteritor lit = listInstance.listIterator();
// 正向顺序迭代List
while(lit.hasNext())
{
   System.out.println(lit.next());
}
// 反向逆序迭代List
while(lit.hasPrevious())
{
   System.out.println(lit.previous());
}

ArrayList/数组列表

ArrayList底层有数组支持,通常作为默认首选;当程序频繁进行插入/删除操作时,选用LinkedLIst;如果元素数量固定,可选择真正数组/List/备选;
ArrayList/Vector辨析


—>ArrayList与Vector用法几乎相同,JDK1.0推出Vector/JDK2.0将Vector改为实现List接口;
—>Vector缺点较多,尽量避免使用;
—>Vector是线程安全的,但是Collections工具类可使得ArrayList线程安全;
—>Vector拥有子类Stack,性能较差,可用ArrayDeque替代;


LinkedList/链表实现/双端队列实现

  • LinkedList底层由双向链表实现,执行插入/删除操作时性能较好,避免使用get(index)遍历LinkedList(随机查找时均从头开始查找,性能低下);
  • 实现List接口。可根据索引随机访问集合元素(ArrayDeque不支持);
  • 实现Deque接口。可当作双向队列使用—>可实现"栈"/普通队列;

Queue/队列

Queue接口中定义的主要方法:

在这里插入图片描述

// 入队
boolean add(Object e):   入队/成功返回true/失败抛出IllegalStateException
boolean offer(Object e):入队/失败返回false/适用于固定容量的队列

// 获取队首
Object peek():          获取队首/不删除/队列为空返回null值
Object element():        获取队首/不删除/队列为空抛出异常

// 弹出队首
Object poll():          弹出队首/队列为空返回null值
Object remove():        弹出队首/队列为空抛出异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值