List-有序集合

6 篇文章 0 订阅
订阅专栏
4 篇文章 0 订阅
订阅专栏
2 篇文章 0 订阅
订阅专栏

List本是豪门少爷。
在新婚前夜却发现未婚妻和兄弟Collection在喜床上翻滚。
她深夜买醉却撞上醉酒的List。
一夜痴缠List醒来后不见她的踪影。
只见床头压着一张纸:
今天是肯德基疯狂星期四吮指原味鸡+黄金脆皮鸡才九块九,我是真的不想错过!

目录

List

List集合概述和特点

List集合特有方法

并发修改异常

ListIterator

增强for循环

List集合子类特点

LinkedList集合的特有功能


List

List集合概述和特点

先到帮助文档中查看:

它在java.util包下,使用它需要导包。<E>是泛型,是List集合中的类型。往下看List是一个接口它继承自Collection接口,所以Collection接口中有的功能List都可以使用。

List被称为有序集合也被称为序列。

用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素(这句话带表List是有索引的)。

与Set集合不同,列表通常允许重复元素。

看完之后我们总结一下:

  1. 有序集合(也被称为序列),用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素。
  2. 与Set集合不同,列表通常允许重复的元素。

List集合特点:

  1. 有序:存储和取出的元素顺序一致。
  2. 可重复:存储的元素可以重复。

程序演示特点:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
    List集合特点:
        	有序:存储和取出的元素顺序一致。
        	可重复:存储的元素可以重复。

 */
public class ListDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        List<String> list = new ArrayList<String>();

        //添加元素
        list.add("hello");
        list.add("java");
        list.add("hello");

        //输出集合对象
//        System.out.println(list);//[hello, java]

        //遍历List结合,采用迭代器的方式遍历
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);//hello java hello
        }
    }
}

List集合特有方法

List方法Collection是没有的,但是它的子类ArrayList是有的。这几个方法在学习集合基础的时候已经使用过了,再来看一遍。

程序演示:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
    List集合特有方法:
        void add(int index, E element) 将指定元素插入此集合中的指定位置.
        E remove(int index) 删除此集合中指定位置的元素.
        E get(int index) 返回此集合中指定位置的元素.
        E set(int index,E element) 修改指定索引处的元素,返回被修改的元素.
 */
public class ListDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        List<String> list = new ArrayList<String>();

        //添加元素
        list.add("hello");
        list.add("java");
        list.add("hello");

        //void add(int index, E element) 将指定元素插入此集合中的指定位置.
        list.add(2,"is");
        list.add(3,"my");
        list.add(4,"favourite");
        System.out.println(list);//[hello, java, is, my, favourite, hello]
//        list.add(11, "List");//IndexOutOfBoundsException(索引越界异常)
        //上面这一句代码,因为集合中没有这么多个元素所以,使用这个索引是有问题的.try一下或者注释掉
        System.out.println("---------------");

        //E remove(int index) 删除此集合中指定位置的元素.
        System.out.println(list.remove(5));//返回hello,表示索引为5的hello元素被删除掉了
        System.out.println(list);
//        System.out.println(list.remove(13));//IndexOutOfBoundsException索引越界
        //上面一条输出语句报错,注释掉
        System.out.println("---------------");

        //E get(int index) 返回此集合中指定位置的元素.
        System.out.println(list.get(3));//my
//        System.out.println(list.get(11));//报错IndexOutOfBoundsException
        //List是有索引的,注意带索引操作的时候索引不要越界
        System.out.println("---------------");
        //E set(int index,E element) 修改指定索引处的元素,返回被修改的元素.
        System.out.println(list.set(1,"javaweb"));//java被修改为javaweb
        //验证
        System.out.println(list);//[hello, javaweb, is, my, favourite]
        System.out.println("---------------");
        //遍历集合
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }
        System.out.println("---------------");

        //不使用迭代器遍历List集合,此处size会返回最大索长度.
        for (int x = 0; x < list.size();x++){
            String s = list.get(x);
            System.out.println(s);
        }//这两种方式都是可以的.


    }
}

 

并发修改异常

先到程序中演示:

到帮助文档中查看这个异常类的详细信息:

这个异常继承自RunTimeException所以这个异常是一个运行时异常。

接着来看详细解释:

当不允许这样的修改时,检测到对象的并发修改的方法可能抛出此异常(这个就是我们说的并发修改异常)。

继续分析异常产生的原因:

问题出现在第二十五行代码,然后就因该是在这一行的next方法这里出现的问题,接着往上看,at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)这是java.util包下ArrayList这个集合里面的,Itr是一个内部类,它里面的next方法出现了问题,二next方法在里面又调用了这样一个方法:checkForComodification,最终就是在checkForComodification这里出现的问题,我们想把问题清楚的看到我们就得去看一下源码:

首先跟进List方法:

public interface List<E> extends Collection<E> {
        Iterator<E> iterator();
        boolean add(E e);
}

public abstract class AbstractList<E>{
    protected int modCount = 0;//这个变量是protected修饰的,所以它的两个子类都可以访问到
}

public class ArrayList<E> extends AbstractList<E>implements List<E>{
    /*10.get方法并没有做实际修改集合和预期修改集合的次数判断,他只是做了一个获取这个元素.
    虽然add方法会对实际修改集合的次数做++但是get方法不会做这个判断所以不会出现并发修改异常
    */
    public E get(int index) {
        Objects.checkIndex(index, size);
        return elementData(index);
    }

    public boolean add(E e) {//6.在add方法里面做了一个操作
        modCount++;//7.对实际修改集合的次数做了一个++,但是预期修改集合的次数没有做++
        add(e, elementData, size);
        return true;
    }
        //实现接口就得实现接口中的方法
        public Iterator<E> iterator() {
                return new Itr();
        }
        //然后new了一个Itr,吧Itr也拿过来,(吧用不上的删掉了)
private class Itr implements Iterator<E> {
        int expectedModCount = modCount;//1.一开始这两个值都是0
        /*
        modCount:实际修改集合的次数
        expectedModCount:预期修改集合的次数


        */
        @SuppressWarnings("unchecked")
        public E next() {//2.这里list调用list方法
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

        final void checkForComodification() {//3.每次调用next方法的时候
        /*
        8.然后到下一次调用checkForComodification()方法的时候,然后进入if判断,判定
        这两发变量的值是否一样,那肯定是不一样的,不一样的话就会抛出并发修改异常.
        */
            if (modCount != expectedModCount)//4.都会判定这了两个变量的值是否一致
                throw new ConcurrentModificationException();
                /*
                5.
                从正常来看这两个变量的值都是一致的,但是我们做了一个操作,一旦字符串s的值和world
                相等,就会通过list调用add方法.
                */
        }
    }
}
/*
9.
所以说并发修改异常的原因就是通过迭代器遍历的过程中,我通过集合去添加了元素,那么就造成了
我这个迭代器在获取元素的时候,里面在进行判断预期修改集合的次数和实际修改集合的次数不一致的清空
这样就造成了并发修改异常.
*/

 然后对代码进行修改:

/*
    需求:
        我有一个集合:List<String> list = new ArrayList<String>();
        里面有三个元素:list.add("hello"); list.add("world"); list.add("java");
        遍历集合,得到每一个元素,看看有没有"world"这个元素,如果由,我就添加一个"javaee"元素,请写代码实现

        ConcurrentModificationException:
        当不允许这样的修改时,检测到对象的并发修改的方法可能抛出此异常(这个就是我们说的并发修改异常)。
 */
public class ListDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("hello");
        list.add("world");
        list.add("java");

        //1.遍历集合
        Iterator<String> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            String next = iterator.next();
//            if (next.equals("world")) {
//                list.add("javaee");
//            }
//        }
        //3.看完源码后解决问题(不使用迭代器),使用for循环遍历
        for (int x =0;x < list.size();x++){
            if (list.get(x).equals("world")){
                list.add("javaee");
            }
        }
        System.out.println(list);
        /*
        使用next方法他会使用判断,我们使用get方法不会使用判断吗?
        跟进一下get方法
         */

        //2.输出集合
            System.out.println(list);//执行就报错:ConcurrentModificationException(并发修改异常)
    }
}

并发修改异常:

  1. ConcurrentModificationException

产生原因:

  1. 迭代器遍历过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改次数和实际修改次数的值不一致。

解决方案:

使用for循环遍历,然后用集合对象做对应的操作即可。

ListIterator

先到帮助文档中查看:

它在java.util包下,所以使用它是需要导包的。它是一个接口,继承自Iterator接口。所以ListIterator可以直接使用hasnext方法和next方法的。因为Iterator里面有这两个方法的定义。

前面用Iterator它只能从前面往后面遍历,ListIterator是可以从任意方向遍历列表的迭代器(可以从后往前遍历),这就是ListIterator和Iterator的区别。ListIterator还可以在迭代期间修改列表(也就是增删元素);并获取列表中迭代器的当前位置。

再往下看:

ListIterator:列表迭代器

  1. 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器。
  2. 允许程序员在任一方向上遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。

ListIterator中的常用方法:

  1. E next():返回迭代中的下一个元素。
  2. boolean hasNext():如果迭代具有更多元素,则返回true。
  3. E previous():返回列表中的上一个元素。
  4. boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true。
  5. void add(E e):将指定的元素插入列表

程序演示:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/*
    ListIterator:列表迭代器
        	通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器。
        	允许程序员在任一方向上遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。

    ListIterator中的常用方法:
        	E next():返回迭代中的下一个元素。
        	boolean hasNext():如果迭代具有更多元素,则返回true。
        	E previous():返回列表中的上一个元素。
        	boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true。
        	void add(E e):将指定的元素插入列表

 */
public class ListIteratorDemo {
    public static void main(String[] args) {
        //1.创建集合对象
        List<String> list = new ArrayList<String>();

        //2.添加元素
        list.add("hello");
        list.add("world");
        list.add("java");

        /*5.1注释掉3和4的代码
        //3.通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器。
        ListIterator<String> stringListIterator = list.listIterator();
        while(stringListIterator.hasNext()){
            String next = stringListIterator.next();
            System.out.println(next);//hello world java
        }
        System.out.println("--------------");

        //4.反向遍历
        while (stringListIterator.hasPrevious()){
            String previous = stringListIterator.previous();
            System.out.println(previous);// java world hello
        }
        */

        //5.注释掉3和4的代码,我们来重点演示add

        //6.获取列表迭代器
        ListIterator<String> stringListIterator = list.listIterator();
        //7.遍历集合,如果集合中存在元素world则往结合中添加 "javaee" 元素
        while(stringListIterator.hasNext()){
            String next = stringListIterator.next();
            if (next.equals("world")){
                stringListIterator.add("javaee");//这一次不是通过集合添加,而是通过列表迭代器调add方法来添加的
            }
        }
        /*
        8.研究完底层代码只之后了解了
        我们通过列表迭代器也可以实现往集合中添加元素,用的是列表迭代器的add方法,他不会产生并发修改异常,因为它的底层
        最终会把实际修改次数的值赋值给预期修改次数变量.
         */
        System.out.println(list);//[hello, world, javaee, java]
    }
}

底层源码分析:

public interface List<E> extends Collection<E> {
        Iterator<E> iterator();

        //1.这里应该会有这个方法
        ListIterator<E> listIterator();
}

public abstract class AbstractList<E>{
    protected int modCount = 0;//这个变量是protected修饰的,所以它的两个子类都可以访问到
}

public class ArrayList<E> extends AbstractList<E>implements List<E>{
    //2.同样在ArrayList里也应该有同样的方法
    public ListIterator<E> listIterator() {
        return new ListItr(0);//3.这里new了一个ListItr我们就要去找到它
        /*
        6.LIstIterator方法返回的是ListIterator,
        new的是ListItr,然后来看ListItr类
        */
    }



    private class Itr implements Iterator<E> {
    //5.这里Itr的实现被我省略掉了
    }

     //4.Iterator返回的是Iterator,new的是Itr.
    public Iterator<E> iterator() {
            return new Itr();
    }
}
    //7.继承自Itr实现了ListIterator接口
    /*
    8.所以说在我们代码中ListIterator<String> stringListIterator = list.listIterator();
    得到的其实是ListIterator实现类对象,也就是我们这个ListItr的对象,因为ListItr实现了ListIterator接口
    */
private class ListItr extends Itr implements ListIterator<E> {
    //9.其他方法删掉,就看一个方法就好了
    public void add(E e) {
        checkForComodification();

        try {
            int i = cursor;
            ArrayList.this.add(i, e);
            cursor = i + 1;
            lastRet = -1;
            expectedModCount = modCount;//10.主要看着一句,会把实际修改次数,赋值给预期修改次数
            //11.这样我们在调用next方法做判断的时候,这两个变量的值就是一致的,所以它就不会出现并发修改异常
        } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
        }
    }
}
}

增强for循环

我们先到帮助文档中再来查看一下Collection:

它继承自Iterable接口,接着来看Iterable接口:

所以Collection体系的集合都可以成为增强for语句的目标。

在Iterable里面有一个iterator方法,所以说增强for语句其底层就是包装一个迭代器。

概述:

增强for循环:简化数组和Collection集合的遍历

  1. 实现Iterable接口的类允许其对象称为增强型for语句的目标
  2. 它是JDK5之后出现的,其内部原理是一个Iterator迭代器。

增强for的格式:

  1. 格式:

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

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

}

格式:

int[] arr = {1,2,3,4,5};

for(int i : arr){

     System.out.println(i);

}

程序演示

import java.util.ArrayList;
import java.util.List;

/*
    增强for循环:简化数组和Collection集合的遍历
        	实现Iterable接口的类允许其对象称为增强型for语句的目标
        	它是JDK5之后出现的,其内部原理是一个Iterator迭代器。

    增强for的格式:
        for(元素数据类型 变量名:数组或者Collection集合){
            //在此处使用变量即可,该变量就是元素
        }

 */
public class ForDemo {
    public static void main(String[] args) {
        //定义一个int类型数组
        int[] arr = {1,2,3,4,5};
        for (int i : arr){
            System.out.println(i);//1 2 3 4 5
        }
        System.out.println("-----------------");

        String[] strArray = {"hello","world","java"};
        for (String str : strArray){
            System.out.println(str);//hello world java
        }
        System.out.println("-----------------");

        //定义集合
        List<String> list = new ArrayList<String>();
        list.add("hello");
        list.add("world");
        list.add("java");
        for (String str1 : list){
            System.out.println(str1);
        }
        System.out.println("-----------------");
        /*验证for增强循环内部是一个Iterator迭代器
        如果for增强循环是一个迭代器,那么就相当于迭代器
        遍历集合,然后判断里面有没有元素为world,如果有
        通过集合调用add方法,往集合内添加一个元素,这个时候
        就会抛出一个并发修改异常.如果这里抛出了并发修改异常,
        那就说明它的内部就是一个迭代器.
         */
        for (String s : list){
            if (s.equals("world")){
                list.add("javaee");
            }
            System.out.println(s);//ConcurrentModificationException
        }
    }
}

List集合子类特点

List集合常用子类:ArrayList,LinkedList。

先到帮助文档中查看ArrayList:

ArrayList实现了List接口,看下面描述,List接口可调整大小的数组实现,也就是说ArrayList集合底层数据结构是数组,数组的特点是查询快增删慢。

然后再来查看LinkedList:

LinkedList实现了List接口

它是链表实现了List接口,由此可见LinkedList的底层结构是链表,链表的结构是查询慢,增删快。

  1. ArrayList:底层数据结构是数组,查询快,增删慢。
  2. LinkedList:底层数据结构是链表,增删快,查询慢。

关于ArrayList它们的一些功能,不再学习,因为List有的它们都有;它们的用法和List是一模一样的,所以我们就不分别去学习它们的基本使用,但是我们以后在使用的时候要根据做查询还是做增删来选择集合。

我们来做一个ArrayList集合的案例:

需求:创建一个存储学生对象的集合,存储三个学生对象,实用程序实现在控制台遍历该集合。

思路:

  • 定义学生类
  • 创建集合
  • 创建学生对象
  • 将学生对象添加进集合
  • 使用三种方式遍历集合

程序演示:

import java.util.ArrayList;
import java.util.Iterator;

public class Student {
    String name;
    int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;

    }
}

/*
    需求:创建一个存储学生对象的集合,存储三个学生对象,实用程序实现在控制台遍历该集合。

    思路:
        ①	定义学生类
        ②	创建集合
        ③	创建学生对象
        ④	将学生对象添加进集合
        ⑤	使用三种方式遍历集合

 */
class ArrayListDemo {
    public static void main(String[] args) {
        //创建ArrayList集合
        ArrayList<Student> arrayList = new ArrayList<>();
        //创建学生对象
        Student s1 = new Student("林青霞", 26);
        Student s2 = new Student("张曼玉", 24);
        Student s3 = new Student("王祖贤", 31);
        //讲学生对象添加到集合中
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        //增强for循环
        for (Student student : arrayList) {
            System.out.println(student.getName() + "." + student.getAge());
        }
        System.out.println("----------");

        //普通for循环
        for (int x = 0; x < arrayList.size(); x++) {
            Student student = arrayList.get(x);
            System.out.println(student.getName() + "." + student.getAge());
        }
        System.out.println("----------");

        //迭代器遍历
        Iterator<Student> iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            Student student = iterator.next();
            System.out.println(student.getName() + "." + student.getAge());
        }
    }
}

LinkedList集合的特有功能

程序演示:

import java.util.LinkedList;

/*
    LinkedList集合的特有功能:
        void addFirst(E e) 在此列表的开头插入指定的元素。
        void addLast(E e) 将指定的元素追加到此列表的末尾。

        E getFirst() 返回此列表中的第一个元素。
        E getLast() 返回此列表中的最后一个元素。

        E removeFirst() 从此列表中删除并返回第一个元素。
        E removeLast() 从此列表中删除并返回最后一个元素。
 */
public class LInkedListDemo {
    public static void main(String[] args) {
        //1.创建LinkedList集合对象
        LinkedList<String> linkedList = new LinkedList<>();

        //2.添加元素
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");


        //3.void addFirst(E e) 在此列表的开头插入指定的元素。
        linkedList.addFirst("javaweb");
        System.out.println(linkedList);//[javaweb, hello, world, java]

        //4.E getLast() 返回此列表中的最后一个元素。
        linkedList.addLast("favourite");
        System.out.println(linkedList);//[javaweb, hello, world, java, favourite]

        //5.E getFirst() 返回此列表中的第一个元素。
        String first = linkedList.getFirst();
        System.out.println(first);//javaweb

        //6.E getLast() 返回此列表中的最后一个元素。
        String last = linkedList.getLast();
        System.out.println(last);
        System.out.println("---------------------");

        //7.E removeFirst() 从此列表中删除并返回第一个元素。
        String s = linkedList.removeFirst();
        System.out.println("删除了:"+ s);//删除了:javaweb
        System.out.println(linkedList);//[hello, world, java, favourite]
        System.out.println("---------------------");

        //8.E removeLast() 从此列表中删除并返回最后一个元素。
        String s1 = linkedList.removeLast();
        System.out.println("删除了:"+ s1);//删除了:favourite
        System.out.println(linkedList);//[hello, world, java]
    }
}

 --欢迎大家与我一起交流java知识

 

有序集合
10-22
在开发过程中免不了需要,存入集合中的数据,有一定的顺序,本文档讲述了这个过程
有序接口List集合
KIZIJJJ的博客
08-07 67
是Collection的一个子接口。
Java中超实用3种List排序方法
最新发布
2401_84003687的博客
04-29 514
1.使用 Comparable 排序按照本文设计的场景,我们需要创建一个包含了用户列表的 List 集合,并按用户的年龄从大到小进行排序,具体实现代码如下:// 创建并初始化 Listadd(new Person(1, 30, “北京”));add(new Person(2, 20, “西安”));add(new Person(3, 40, “上海”));}};// 使用 Comparable 自定的规则进行排序// 打印 list 集合});
java中list集合、set集合、map集合都分别是有序的还是无序的
m0_63615119的博客
12-13 3623
java中list集合、set集合、map集合都分别是有序的还是无序的
Java进阶—— 集合体系详解之List体系有序集合
热门推荐
最美不过,心中有梦,身旁有你!
09-23 1万+
引言面向对象语言对事物的体现必然是以对象的形式,Java工程师为了方便多多个对象的操作,就对对象进行存储,集合就是存储对象的一种方式,他们的底层都是基于不同的数据结构。当然集合和数组一样都是容器,数组也是可以存储对象的,但是数组长度一经初始化长度就是固定的,而集合长度是可变的,数组只能用于存储相同类型的对象,而集合可以存储不同类型的对象,数据多了用对象封装,对象多了用集合存。
数据结构与算法-(11)---有序表(OrderedList)
“路漫漫其修远兮,吾将上下求索。”
11-08 1255
上一次我们学习了无序表之链表和列表,知道了链表的特点是顺藤摸瓜结构,这次让我们来一起探索有序列表及其实现过程吧~
List(有序)集合以及五种遍历介绍
weixin_60677044的博客
03-29 1393
继 承 C olle c tio n 接 口 , 存 储 一 组 可 重 复 的 有 序 对 象元 素 顺 序 以 元 素 插 入 的 顺 序 放 置 元 素 , 不 重 新 排 序通 过 索 引 访 问 数 组 元 素 , 索 引 从 0 开 始。
java 有序list_java的集合框架
weixin_32344641的博客
01-22 2023
前言使用java编程语言的开发人员,在日常开发过程中经常会使用到java的一些集合类,不过这些集合类太多,很多人对它们的特点和使用场景不是特别的了解,通过此文给大家总结一下这方面的知识,方便大家面试或者是初学者理解。Java集合类主要由Collection和Map两个接口派生而出,另外还有遍历集合的工具Iterator迭代器:集合框架Connection接口ConnectionConnection...
arraylist有序还是无序_关于集合中元素的有序无序的易混淆点
weixin_39843151的博客
11-27 8467
最近在整理Java基础知识的面试题,看到了一个题目的答案不够准确,这里跟大家分享一下。一、面试题的小错误 对于TreeSet和TreeMap来说,元素应该是无序(指元素的存取)而不是有序的,而在表中它可能想表达的是可以排序,不够严谨,严格来讲元素的有序≠可以排序。元素的存取有序和排序本质上应该是两码事,不应该混为一听。二、元素的有序和无序 下面具体来讲讲,集合中元素的存取有序的问题。 众所周知,L...
Redis数据类型 - 有序集合(Sorted set)
qq_38515961的博客
10-04 6304
文章目录一、有序集合简介二、有序集合常用操作三、字典序相关操作 一、有序集合简介 Redis有序集合,顾名思义是一种可以使存放的元素有序集合,这种数据结构中的每一个元素都由一个成员和一个与成员相关联的分值组成,其中成员以字符串方式存储,而分值则以64位双精度浮点数格式存储。 与集合一样,有序集合中的每个元素都是不重复的。有序集合的分值除了可以是数字之外,还可以是字符串+“inf"或者”-inf",inf是infinite(无限)的缩写,因此这两个特殊的分值表示无穷大和无穷小。 当多个成员的分值相同时,R
List 一定有序,Set不一定无序
QEIDJDJ123456的博客
05-10 1万+
首先,我们要明确的一点是,在java中我们通常说的集合有序无序针对的是插入顺序,是指在插入元素时,插入的顺序是否保持,当遍历集合时它是否会按照插入顺序展示。像TreeSet和TreeMap这样的集合主要实现了自动排序,我们称之为排序,而根据前面的定义它不一定是有序的。 所以,在我们常见的集合类型中,有序的有ArrayList,LinkedList,LinkedHashSet,LinkedHashMap等,无序的有HashSet,HashMap,HashTable,TreeSet,TreeMap等,而同时T
Redis有序集合类型的常用命令小结
12-15
一、有序集合类型 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序而已。Redis中的有序集合类型,实际上是在集合...有序集合类型使用的散列表和跳跃表(Skip list)实现的,所以读取哪
JSP应用开发-Java集合类-List接口.pptx
10-29
List接口是Collection的子接口,用来包含一组有序有重复的对象,List有两种主要的集合实现类:ArrayList和LinkedList。ArrayList适合随机查询的场合,而LinkedList元素的插入和删除操作性高,两者在实际应用中都有其...
Java集合List-Set-Map的区别和联系.doc
06-25
List 是有序集合类,可以存储重复的元素,Set 是无序的集合类,不能存储重复的元素。Map 是一个键值对的集合类,它可以存储键值对的数据。 List 有三个实现类:ArrayList、LinkedList 和 Vector。ArrayList 是一...
List和Set集合基础详解
01-21
集合的家族(1)List集合—(有序,可重复)(2)Set集合—(无序,唯一) 一. 为什么要有集合集合是为了弥补数组的不足而存在。 集合相对于数组优势在于:a.集合的长度可以动态改变;b.集合中能够存放多种类型的数据。 ...
一眼看懂Java中的集合
05-13
此篇文章是学习Java中的集合时自己总结的笔记,主要记录了集合的底层原理、List、Set、Queue等集合的特点、集合的实现类的特点以及各个实现类底层是原理。
list有序集合答案
qq_41426326的博客
04-11 1430
private static List<Integer> sSorted = new LinkedList<>(); public static void addElement(int e) { int i; for (i = 0; i < sSorted.size(); ++i) { if (e <= sSorted.get...
List集合详解
zhudouodu的博客
07-28 2677
*List集合 ** List集合有序、不可重复。以元素的添加顺序作为集合的排列顺序,用下标索引集合中的元素。 List因为使用下标索引元素,所以元素可重复。Set使用元素本身来索引,所以元素不能重复。 List的继承关系: List继承了Collection的所有方法,也有自身的一些方法(下标操作): void add(int index,Object element) 在指定处插入一个元素 boolean addAll(int index,Collection c) 在指定处插入c的所...
java 有序的list_Java 中的 List —— 有序序列
weixin_39839018的博客
02-15 4995
List 在 java 中是个有序序列:一、容量ArrayList 中有一个容量概念,表示基础数组的大小(无参时默认为 10)。在需要的时候(比如 add操作)会自动增加其容量。LinkedList 没有这个概念。TreeMap 也有容量,默认是 16.二、改善的 search 方法LinkedList 与 ArrayList 都很低效。比如 Collection 的 contain 和 remo...
redis 有序集合
07-29
Redis有序集合是一种特殊类型的数据结构,它可以存储多个成员(元素)并为每个成员分配一个分数(score)。这些成员根据分数进行排序,并且可以通过分数范围或成员值进行查询和检索。 有序集合在Redis中的实现使用了一种称为跳跃表(skip list)的数据结构,它既可以快速地按照分数进行排序,又可以保持较高的插入和删除性能。 有序集合在很多场景下非常有用,例如: 1. 排行榜:可以将用户的得分作为有序集合的分数,根据分数对用户进行排名。 2. 带有优先级的任务队列:可以使用有序集合来存储任务,并按照优先级(分数)进行调度。 3. 范围查询:可以根据分数范围快速地获取一定范围内的成员。 4. 唯一性约束:有序集合中的成员是唯一的,可以用于去重。 你还有其他关于Redis有序集合的问题吗?

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 循环语句—do…while循环 40890
  • Debug的使用方法 25513
  • 运算符—逻辑运算符 12165
  • 循环语句—while循环 9634
  • List-有序集合 9379

分类专栏

  • 运算符 7篇
  • 数组 4篇
  • 集合 6篇
  • 练习题 10篇
  • 接口 2篇
  • 异常 1篇
  • 常用API 7篇
  • 常用方法 3篇
  • 字符串 4篇
  • 内部类 2篇
  • 方法 12篇
  • 面向对象 10篇
  • 修饰符 2篇
  • 分支语句 4篇
  • 循环语句 7篇
  • 数据输入 1篇
  • 基础语法 7篇

最新评论

  • 方法—方法重载

    玩弄3: 简单明了

  • 运算符—逻辑运算符

    2301_80168059: ||这个写错了吧

  • 2021.0.5版本SpringcCloud集成Nacos设置负载均衡,让其优先寻找自己同集群下的服务

    乄bluefox: 分组是为了环境隔离吗

  • 2021.0.5版本SpringcCloud集成Nacos设置负载均衡,让其优先寻找自己同集群下的服务

    乄bluefox: 博主,那个集群优先访问,如果加上分组,那感觉可以看成按分组了,还有什么解决方法吗

  • 运算符—逻辑运算符

    赫本的猫€: 短路与那里写错啦

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 2021.0.5版本SpringcCloud集成Nacos设置负载均衡,让其优先寻找自己同集群下的服务
  • List练习题
  • Collection-集合
2023年1篇
2022年73篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贰陆.256

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

两个鬼故事黑暗学徒白开水建筑材料公司起名银烛秋光冷画屏梦到杀人妯娌的三国时代设备公司名字起名大全神殿守护者如何给孩子起名什么玄幻小说好看中国名人八字免费起名字打分男孩的英文名字怎么起的用翊和什么字取名起名八字缺土起什么名字好最后的勇士易经起名网免费打分测名字弓电影倪姓女孩起名字声卡驱动器官方免费下载林姓男孩起名称大全工作室起什么名字好好女真族微信起名什么最好中央金融工作会议天书奇潭男孩名女孩起名在线天堂www在线......郑姓取名起名大全大全内衣店名字如何起店铺免费网站起名少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化