Java基础<十二>-----集合


Java基础<十二>-----集合

1. 集合类的由来:

对象用于封装特有数据,对象多了需要存储;如果对象的个数不确定,就使用集合容器进行存储。

集合特点:

1). 用于存储对象的容器。

2). 集合的长度是可变的。

3). 集合中不可以存储基本数据类型值。

集合容器因为内部的数据结构不同,有多种具体容器。不断的向上抽取,就形成了集合框架。

注:数组和集合类同是容器,有何不同?

数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。

数组中可以存储基本数据类型,集合只能存储对象。

集合框架的构成及分类:


2. Collection接口

框架的顶层Collection接口:

Collection的常见方法:

1)、添加:

boolean add(Objectobj);

booleanaddAll(Collection coll);

2)、删除:

booleanremove(Object obj);

booleanremoveAll(Collection coll);

void clear();

3)、判断:

booleancontains(Object obj);

booleancontainsAll(Collection coll);

boolean isEmpty();判断集合中是否有元素。

4)、获取:

int size();

Iteratoriterator();

取出元素的方式:迭代器。

该对象必须依赖于具体容器,因为每一个容器的数据结构都不同,所以该迭代器对象是在容器中进行内部实现的,也就是iterator方法在每个容器中的实现方式是不同的。

对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是

iterator方法。

Iterator接口就是对所有的Collection容器进行元素取出的公共接口。

5)、其他:

booleanretainAll(Collection coll);取交集

Object toArray();将集合转成数组

示例:


运行结果:


3. List、Set

Collection

|--List:有序(存入和取出的顺序一致),元素都有索引(角标),允许重复元素。

|--Set:元素不能重复,无序。

List:特有的常见方法。

有一个共性特点就是都可以操作角标。

1)、添加

voidadd(index,element);

voidaddAll(index,collection);

2)、删除

Objectremove(index);

3)、修改

Objectset(index,element);

4)、获取:

Object get(index);

intindexOf(object);

intlastIndexOf(object);

ListsubList(from,to);

List集合可以完成对元素的增删改查。

示例:


运行结果:


示例:


运行结果:


示例:


运行结果:


在迭代器过程中,不要使用集合操作元素,容易出现异常:

java.util.ConcurrentModificationException。可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。

示例:


运行结果:


4. Vector、ArrayList、LinkedList

List:

|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢。

|--ArrayList:内部是数组数据结构,是不同步的,替代了Vector。替代了Vector,查询的速度快。

|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

LinkedList方法:

addFirst();

addLast();

jdk1.6版本后新方法:

offerFirst();与addFirst方法没有区别。

offerLast();与addLast方法没有区别。

getFirst();//获取但不移除,如果链表为空,抛出NoSuchElementException。

getLast();

jdk1.6版本后新方法:

peekFirst();//获取但不移除,如果链表为空,返回null。

peekLast();

removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementException。

removeLast();

jdk1.6版本后新方法:

pollFirst();//获取并移除,如果链表为空,返回null;

pollLast();

示例:


运行结果:


示例:


运行结果:


请使用LinkedList来模拟一个堆栈或者队列数据结构。

堆栈:先进后出 First In Last Out FILO

队列:先进先出 First In First Out FIFO

我们应该描述这样一个容器,给使用者提供一个容器对象完成这两种结构中的一种

代码:


运行结果:


示例:


运行结果:


5. Set:元素不可以重复,是无序。

Set接口中的方法和Collection一致。

|--HashSet:内部数据结构是哈希表,是不同步的。

|--TreeSet:可以对Set集合中的元素进行排序,是不同步的

示例:


运行结果:


哈希表确定元素是否相同

1). 判断的是两个元素的哈希值是否相同。

如果相同,再判断两个对象的内容是否相同。

2). 判断哈希值相同,其实判断的是对象的HashCode方法。判断内容相同,用的是equals方法。

注:如果哈希值不同,不需要判断equals。往HashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人,视为相同元素

示例:



运行结果:


定义功能去除ArrayList中的重复元素

示例:


运行结果:


无序变有序,使用LinkHashSet

示例:


运行结果:


TreeSet判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存

示例:



运行结果:


TreeSet对元素进行排序的方式一: 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法。

如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?

可以使用TreeSet集合第二种排序方式:

让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。

将该类对象作为参数传递给TreeSet集合的构造函数

示例:


运行结果:


注:如果自定义类实现了Comparable接口,并且TreeSet的构造函数中也传入了比较器,那么将以比较器的比较规则为准。

TreeSet集合的底层是二叉树进行排序的

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值