集合
文章目录
集合概述
-
数组:存放一组相同数据类型的数据结构
- 数组的特点:
- 数组一旦创建,其长度不能改变
- 一个数组只能存放一种数据类型的数据
- 数组的特点:
-
集合:是一种存放多种数据类型的数据结构
- 集合的特点:
- 集合的长度是可变的
- 对存放数据的数据类型无限制
- 集合的特点:
定义
- 在Java中,使用一些类来描述集合,这样的类我们称之为集合类,集合类的对象就是一个集合
- 集合类 obj = new 集合类;
学习任务
- 了解Java中的集合类及其继承关系
- 创建集合类的对象(创建集合)
- 向集合中添加元素
- 获取集合中的元素(获取单个元素)
- 遍历集合(一次取出集合中的所有元素)
集合大的分类
-
Collection(单值集合)(接口):是所有单值集合的父接口
- List(接口):集合中的元素是有序可重复的
- ArrayList
- LinkedList
- Vector
- Set(接口):集合中的元素是无序不可重复的
- HashSet
- TreeSet
单值集合:ArrayList、LinkedList、Vector
- List(接口):集合中的元素是有序可重复的
-
Map(键值对集合)(接口):是所有键值对集合的父接口
- AbstractMap(抽象类)
- HashMap
- Hashtable
- Properties
键值对集合:HashMap、Hashtable、Properties
- AbstractMap(抽象类)
集合中的各种区别
-
Collection 和Collections 的区别(接口/帮助类)
- Collection 是一个接口,是所有单值集合的父接口
- Collections 是一个帮助类,这个类中提供了很多对集合进行各种操作的静态方法
-
List 接口 和 Set 接口的区别(有序可重复/无序不可重复)
- List接口和Set接口都是Collection接口的子接口
- List中的元素是有序可重复的
- Set中的元素是无序不可重复的
-
ArrayList 和 LinkedList的区别(数组/链表)
-
ArrayList 和 LinkedList都是List 接口的实现类,其元素都是有序可重复的
-
ArrayList 中的元素是基于数组的实现
- 查询元素:顺序查找,速度快
- 添加元素:尾部添加,速度较快
- 插入元素:会涉及到内存中元素的依次移动,速度较慢
-
LinkedList中的元素是基于链表的实现
- 查询元素:需要根据前一个元素获取到后一个元素的地址依次查找,速度相对较慢
- 添加元素:尾部添加,但是有地址的操作,速度相对较慢
- 插入元素:无须依次移动元素,速度较快
链表特点:不必事先估计存储空间,可随机访问任一元素,所需空间和线性表的长度成正比
-
-
ArrayList 和 Vector 的区别(线程非安全,速度快/线程安全)
- ArrayList 和 Vector 都是基于数组的存储;Vector 实现了同步是线程安全的(多线程中用),而ArrayList 是线程非安全的,但是ArrayList 的存储效率较高。
-
HashSet 和 TreeSet的区别(Hash码散列存储/树形存储)
- 两者都是Set接口的实现类,其元素都是无序不可重复的;区别在于元素存储方式不同,HashSet是按照hash码散列存储,TreeSet树形存储
-
HashMap 和 Hashtable 的区别(null,线程)
-
两者都是Map 接口的实现类,都表示键值对集合。
-
HashMap 中允许一个null键和多个null值,但Hashtable中不允许使用null作为key或者value;
-
HashMap 未实现同步,是线程非安全的;Hashtable实现了同步,是线程安全的
Propreties键、值都为String类型
-
键值对
key value null "aaa"
"bbb"
3 1 null “a” null
-
Collection的常用方法及迭代器
collection接口常用方法
-
创建集合
ArrayList list = new ArrayList();
-
boolean add(E e):将指定的元素添加到集合中
list.add("abc"); list.add("wahaha"); list.add(3); list.add(true);
-
int size():获取当前集合中存放元素的个数
int len = list.size(); System.out.println("len-->" + len);
-
boolean addALL(Collection c):将参数指定的集合(list)中的所有元素全部添加到当前集合(b)
b.addAll(list);
-
void clear():清空当前集合中的所有元素
list.clear();
-
boolean contains(Object o):检查当前集合中是否包含参数指定的元素
boolean flag1 = list.contains("wahaha");
-
boolean containsAll (Collection<?> c):检查当前集合中是否包含参数指定的集合中的元素
boolean flag2 = b.containsAll(list);
-
boolean isEmpty():判断当前集合是否为null
boolean flag3 = list.isEmpty();
-
boolean remove(Object o):从当前集合中移除参数指定的元素
boolean flag4 = list.remove("wahaha");
-
boolean removeALL(Collection<?> c):从集合b中移除集合(list)中的所有元素
boolean flag5 = b.removeAll(list);
-
Object [] toArray():将当前集合的元素全部取出,存放到一个Object类型的数组中
Object [] obj = list.toArray(); for(Object o : obj){ System.out.println(o); }
List接口常用用法
- List集合,因为其中元素的存储是有序的,所有我们可以用索引来标注每个元素,List集合中索引的范围【0~list.size()-1】
-
void add(int index, E element):将第二个参数指定的元素插入到list集合中索引为第一个参数的位置
list.add(3, "e");
-
E get(int index):获取当前集合中指定索引处的元素
Object o1 = list.get(2);
-
E remove(int index):移除指定索引处的元素
Object o2 = list.remove(3);
-
boolean remove(Object o) :移除集合里的指定元素
集合里面存放的为封装类型,普通类型要转为封装类型
boolean flag1 = list.remove( new Integer(3) );
-
int indexOf(Object o):元素第一次出现的索引
int n = list.indexOf("a");
-
int lastIndexOf(Object o):元素最后一次出现的索引
int m = list.lastIndexOf("a");
-
遍历集合
Object [] obj = list.toArray(); for(Object o : obj){ System.out.println(o); } for(int i = 0; i < list.size(); i++){ Object obj2 = list.get(i); System.out