Collection 集合

Collection :单列集合,每个元素(数据)只包含一个值。
集合中存储的是元素对象的地址

Collection集合特点

List系列集合添加的元素是有序、可重复、有索引

                      ArrayList、LinekdList :有序、可重复、有索引

Set系列集合添加的元素是无序、不重复、无索引

HashSet: 无序、不重复、无索引;
LinkedHashSet: 有序 、不重复、无索引。
TreeSet: 按照大小默认升序排序、 不重复、无索引。

Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的 

Collection的常见方法

public boolean add(E e)

把给定的对象添加到当前集合中

public void clear()

清空集合中所有的元素

public boolean remove(E e)

把给定的对象在当前集合中删除

public boolean contains(Object obj)

判断当前集合中是否包含给定的对象

public boolean isEmpty()

判断当前集合是否为空

public int size()

返回集合中元素的个数。

public Object[] toArray()

把集合中的元素,存储到数组中

 遍历:

使用迭代器遍历集合, 但用迭代器自己的删除方法删除数据即可。
如果能用 for 循环遍历时: 可以倒着遍历并删除 或者从前往后遍历,但删除元素后做 i -- 操作

迭代器

迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator 

Collection集合获取迭代器的方法

Iterator<E> iterator()

返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素

Iterator迭代器中的常用方法 

boolean hasNext()

询问当前位置是否有元素存在,存在返回true ,不存在返回false

E next()

获取当前位置的元素,并同时将迭代器对象指向下一个元素处。

例子:

Iterator<String> it = lists.iterator();
while(it.hasNext()){
    String ele = it.next();
    System.
out.println(ele);
}

 lIterator<E> iterator():得到迭代器对象,默认指向当前集合的索引0

通过迭代器获取集合的元素,如果取元素越界会出现什么异常?

       会出现NoSuchElementException异常。

增强for循环

增强 for 可以用来遍历集合或者数组。
增强 for 遍历集合,本质就是迭代器遍历集合的简化写法。

修改增强for中的变量值不会影响到集合中的元素。即下列例子中的s

for (元素的数据类型 变量名 : 数组或者集合) {

                   //在此处使用变量即可,该变量就是元素

}

 例子:

Collection<String> c = new ArrayList<>();
...

for(String s : c) {
   
System.out.println(s);
}

Lambda表达式遍历集合   (forEach)遍历

default void forEach(Consumer<? super T> action)

结合lambda遍历集合

Collection<String> lists = new ArrayList<>();
...

lists.forEach(new Consumer<String>() {
   
@Override
   
public void accept(String s) {
       
System.out.println(s);
    }
});

lists.forEach(s -> {
           
System.out.println(s);
    });
//  lists.forEach(s -> System.out.println(s));

 

 列子:

Collection<String> c = new ArrayList<>();
c.add("赵敏");
c.add("小昭");
c.add("素素");
c.add("灭绝");

//调用forEach方法
//由于参数是一个Consumer接口,所以可以传递匿名内部类
c.forEach(new Consumer<String>{
    @Override
    public void accept(String s){
        System.out.println(s);
    }
});


//也可以使用lambda表达式对匿名内部类进行简化
c.forEach(s->System.out.println(s)); //[赵敏, 小昭, 素素, 灭绝]

List系列集合特点:   有序,可重复,有索引

ArrayList:有序,可重复,有索引。
LinkedList :有序,可重复,有索引。

 

 List集合的特有方法

     lList集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了。

void add(int index,E element)

在此集合中的指定位置插入指定的元素

E remove(int index)

删除指定索引处的元素,返回被删除的元素

E set(int index,E element)

修改指定索引处的元素,返回被修改的元素

E get(int index)

返回指定索引处的元素

List集合支持的遍历方式

for 循环(因为 List 集合有索引)
迭代器
增强 for 循环
Lambda 表达式
基于 数组 实现的。
Arraylist集合的特点
 

查询速度快注意:是根据索引查询数据快):查询数据通过地址值和索引定位,查询任意数据耗时相同

删除效率低:可能需要把后面很多的数据进行前移。

添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。

LinkedList集合的底层原理 

基于双链表实现的

链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。

链表的特点1:查询慢,无论查询哪个数据都要从头开始找。

链表的特点2:链表增删相对快

但对首尾元素进行增删改查的速度是极快的

public void addFirst​(E e)

在该列表开头插入指定的元素

public void addLast​(E e)

将指定的元素追加到此列表的末尾

public E getFirst​()

返回此列表中的第一个元素

public E getLast​()

返回此列表中的最后一个元素

public E removeFirst​()

从此列表中删除并返回第一个元素

public E removeLast​()

从此列表中删除并返回最后一个元素

LinkedList的应用场景之一:可以用来设计队列

                 队列的特点:先进先出,后进后出

数据进入栈模型的过程称为:/进栈(push)

数据离开栈模型的过程称为:/出栈(pop)

set--集合

Set系列集合特点:无序:添加数据的顺序和获取出的数据顺序不一致;  不重复无索引;

HashSet : 无序、不重复、无索引。
LinkedHashSet 有序 、不重复、无索引。
TreeSet 排序 、不重复、无索引。

注意:

Set要用到的常用方法,基本上就是Collection提供的!!

自己几乎没有额外新增一些常用功能!

Set集合的常见实现类有哪几个?各自有啥特点?

HashSet 无序、不重复、无索引。
LinkedHashSet 有序 、不重复、无索引。
TreeSet 可排序 、不重复、无索引。

TreeSet

特点:不重复、无索引、 可排序(默认升序排序 ,按照元素的大小,由小到大排序)
底层是基于红黑树实现的排序。

 注意:

对于数值类型:Integer , Double,默认按照数值本身的大小进行升序排序。

对于字符串类型:默认按照首字符的编号升序排序。

对于自定义类型如Student对象,TreeSet默认是无法直接排序的。

自定义排序规则

TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。

方式一

让自定义的类(如学生类) 实现 Comparable 接口, 重写里面的 compareTo 方法 来指定比较规则。

方式二

通过调用 TreeSet 集合有参数构造器,可以设置 Comparator 对象(比较器对象,用于指定比较规则。
格式

       public TreeSet(Comparator<? super E> comparator)

两种方式中,关于返回值的规则:

如果认为第一个元素 第二个元素 返回正整数即可。
如果认为第一个元素 < 第二个元素返回负整数即可。
如果认为第一个元素 = 第二个元素返回 0 即可,此时 Treeset 集合只会保留一个元素,认为两者重复。

注意:如果类本身有实现Comparable接口,TreeSet集合同时也自带比较器,默认使用集合自带的比较器排序。 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值