从零开始的java学习Day10----------基础篇(Java中的单列集合)

Collection集合

Collection集合是所有单列集合的父接口,他其中定义了一些通用方法,这些方法可用于操作所有单列集合
因为他是一个接口,所以他只能通过他的子类来创建对象(多态)
格式:(这里拿子类ArrayList举例)
Collection<> co =new ArrayList<>()
如果<>内没有限制类型,则默认Object
数据结构介绍:集合数据结构

常用方法:

- public boolean add(E e):       把给定的对象添加到当前集合中 。
- public boolean addAll(Collection<? extends E> c):  把指定集合全部添加到当前集合中。
- public void clear() :           清空集合中所有的元素。
- public boolean remove(E e):     把给定的对象在当前集合中删除。
- public boolean contains(E e):   判断当前集合中是否包含给定的对象。
- public boolean isEmpty():       判断当前集合是否为空。
- public int size():              返回集合中元素的个数。
- public Object[] toArray():      把集合中的元素,存储到数组中。

Iterator迭代器

在程序开发中,我们经常需要遍历Collection集合中的所有元素。针对这种需求,JDK专门提供了一个接口Iterator。主要用来迭代访问集合中的元素,因此Iterator对象也被称为迭代器

迭代:取元素前,先判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来,一直把集合中所有元素全部取出。

  • Iterator是一个接口,Collection类中有一个创建该接口的方法,所以Collection集合类的子类都继承了这个方法,每个集合都可以通过iterator方法来创建一个Iterator类型的迭代器。
    格式:
Collection<String> c =new ArrayList<>();         //通过子类创建了一个Collecttion对象c
Iterator<String>it=c.iterator();                //通过c调用方法创建了一个迭代器,赋值给it

next

next方法,可以返回迭代器内,指针指向的下一个元素,返回一次,指针后移一位
格式:(这里的it是我们创建的迭代器名):

it.next();          //返回一个元素,指针后移一位,如果已经无元素可以迭代,执行此方法会报错

hasNext

hasNext方法,可以判断迭代器内是否还有元素可以迭代,如果有,返回true
格式:

it.hasNext();       //如果迭代器内还可以迭代元素,返回true,否则false

增强for循环

增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作(每次循环,都是将值取出来,赋值给新建的对象再使用)。
格式:

for(集合数组类型 对象名:Collection集合){
}               //每次循环,都会将集中中的一个元素赋值给前面的对象,直到迭代结束。
例:(设c是一个Collection集合(包括子类),集合内的数据类型为String)
for(String str:c){
System.out.println(str);}          //会遍历输出c集合里面的所有元素

List集合

List是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合
List集合是一个有序集合,有索引,继承自Collection接口。
ArrayList集合就是该接口的子类,该类中的方法都是来自List中定义的

List接口的常用方法

public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上(插入,后面的顺移索引)。
public E get(int index):返回集合中指定位置的元素。
public E remove(int index): 移除列表中指定索引位置的元素, 返回的是被移除的元素。如果想删除指定Integer数据,为了不冲突,可以使用new Integer(n)来删除指定数字
public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
ListIterator<E> listIterator():返回此集合的列表迭代器(可以使用此迭代器增加或删除元素(add,remove),不会出现并发错误)

List的子类

ArrayList集合

数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。

LinkedList集合

链表结构(双向链表,每个节点有两个指针,分别指向前面和后面元素)。方便元素添加、删除的集合。(队列的实现类)
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方法我们作为了解即可:

- public void addFirst(E e):将指定元素插入此列表的开头。
- public void addLast(E e):将指定元素添加到此列表的结尾。
- public E getFirst():返回此列表的第一个元素。
- public E getLast():返回此列表的最后一个元素。
- public E removeFirst():移除并返回此列表的第一个元素。
- public E removeLast():移除并返回此列表的最后一个元素。
- public E pop():从此列表所表示的堆栈处弹出一个元素。(相当于删除此列表第一个元素)
- public void push(E e):将元素推入此列表所表示的堆栈。(相当从索引0处添加一个元素)
- public boolean isEmpty():如果列表不包含元素,则返回true。
LinkedList是List的子类,List中的方法LinkedList都是可以使用

Set接口

Set接口同样继承自Collection接口,他与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。Set集合有多个子类,这里只讲HashSet和LinkedHashSet两个集合(Set集合也可以使用迭代器和增强for循环)
特点:
HashSet:元素不可重复,无序,
LinkedHashSet:元素不可重复,有序

HashSet

哈希表结构(数组+链表+(1.8以后)红黑树)
HashSet集合存储元素不可重复,无序
注:在JDK1.8之前,哈希表底层是采用数组+链表的形式实现,到了1.8时,链表长度超过8时,就会采用红黑树模式存储数据

存储原理如下:
  • 1.元素存入时,调用元素的hashCode()方法(Object类的,所有元素都有),计算元素的哈希值
  • 2.判断该哈希值对应的位置上是否有相同哈希值的元素(可以理解成HashSet集合里有多个空间(数组形式),每个空间都以哈希值为编号,存入相同哈希值的,就以链表形式挂到同一数组空间上,链表长度超过8,就将链表转为红黑树模式)
  • 3.如果该位置上没有相同哈希值的元素,就直接存储
  • 4.如果该位置上有相同的哈希值的元素,说明产生了哈希冲突
  • 5.如果产生了哈希冲突,就有调用equals方法,去和该位置上的所有元素进行比较,如果比较完毕之后,没有一个返回true就存入该元素,如果其中有一个返回true,就不存储
关于存储对象

我们比较2个对象的时候,往往认为2个对象的所有属性的值是一模一样就认为2个对象是相同的,但是实际存储同一个类的相同对象,如果不重写Hashcode方法,两个对象的哈希值肯定不会相同,但是只重写了Hashcode方法,没有重写equals方法,就会默认比较两个对象的地址值,这时,两个对象的地址值肯定是不同的,所以我们要存储自定义的类型的元素的时候,记得要重写hashCode()方法和equals()方法

LinkedHashSet

链表+哈希表结构(链表保证有序,哈希表保证唯一)
LinkedHahSet和Hashet不同的是,他的存储是有序的,以链表和哈希表组合的一个数据存储结构,取的时候,和存的时候顺序是一致的,存储原理和Hashset一样。

TreeSet

二叉树结构
TreeSet集合存取无序,元素唯一,没有索引,但是存入后元素有序,(会对元素进行排序)(通过空参构造方法创建出来的TreeSet集合会对元素进行默认的排序)(通过有参构造方法,可以传入自定义的Comparator 实现类对象来自定义规则排序)
注意:如果排序规则的元素相同(即返回0),则不会存入该元素

默认规则:

如果TreeSet集合中的元素想要进行默认规则排序,那么该元素所属的类必须实现Comparable接口中的compareTo()方法,在compareTo()方法指定排序规则
TreeSet存储自定义类型的元素:
必须实现Comparable接口,实现compareTo方法(默认会返回0,必须重写,0的话只会存储一个数据)
compareTo方法
格式:

compareTo(E o)      //E代表你存储数据的类型,o代表你依次去比较的的对象

存储原理:存储元素时,系统会默认从根节点,依次调用compareTo去比较,把元素传到o位置,如果返回值是0代表相同,不存储,如果返回值是1,则存入节点的右边,如果返回值是负数,存入节点的左边。(这里如果节点的两边还有其他节点,会继续比较,从左往右,参考数据结构二叉树)
规律:前减后(参数o) 升序
后(参数o )减前 降序
TreeSet取出元素的时候,会按照二叉树的原理,从左往右依次取出。

根据自定义规则排序:

我们在编写程序中,往往对同一种对象,会有不同需求要进行不同规则排序,如果使用默认方法,就只能按照一种规则(修改类的CompareTo方法)排序,所以在Java中,TreeSet还有一种按照自己定义规则的排序方式
在定义SreeSet集合对象的时候,使用有参构造方法,传入Comparator接口的实现对象,重写里面的Compare()方法(可以使用匿名内部类)。存储原理和规律和默认规则里的使用compareTo方法是一样的。
例:

public class CollectionsDemo3 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("cba");
        list.add("aba");
        list.add("sba");
        list.add("nba");
        //排序方法  按照第一个单词的降序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.charAt(0) - o1.charAt(0);
            }
        });
        System.out.println(list);
    }
}

里面的o1代表将要存入的元素,o2代表依次会被比较的元素
规律:前(参数o1)减后(参数o2) 升序
后(参数o2)减前(参数o1) 降序

Collections

Collections是一个集合工具类,用来对集合进行操作,部分方法如下

public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。(可以添加多个元素,T...是可变参数)
public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。(规则参考Treeset集合)
public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
Comparable和Comparator两个接口的区别
  • Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

  • Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值