Java 做项目能用到 List 的场景,这篇总结全了

Java中的List、Set和Map的各自特征及使用场景 Java中的集合分为单列集合Collection和双列集合Map。 先通过这张图看看Collection和Map的各自体系。 首先看单列集合Collection中的List及Set的各自特征。 List(有序,可重复)             ArrayList                 底层数据结构是数组,查询快,增删慢                 线程不安全,效率高       ... 阅读详情

List 代表有顺序的一组元素,顺序代表遍历元素时是有顺序的,先放进 List 的元素会先被遍历到,这点很像数组,但是跟数组很不一样的是 List 对大小没有限制。

List 是使用 Java 编写程序的时候,最高频使用的数据结构,今天这篇文章我们就来好好地把List主要的使用方法过一遍,在后半部分还会给出多个特遍有用的能提高我们开发效率的实践示例,整个文章的大纲如下:

List 接口

List 接口的全名叫 java.util.List,其中定义的方法如下图所示:

这就意味着,只要类实现了这些方法,那么它就是一个 List 接口的实现类。

Java List 中包含的元素可以根据它们在 Java List 内部出现的顺序进行插入、访问、迭代和删除。元素的顺序是这个数据结构被称为 List 的原因。 Java List 中的每个元素都有一个索引,列表中的第一个元素的索引为 0,第二个元素的索引为 1,以此类推。索引的意思是“距离列表开头有多少个元素”。

下面我们用数组作为底层存储的结构,自己实现一个List类。

package com.example.learncollection;

import java.util.*;

public class MyArrayList implements List {

    private Object[] elements;

    private int curr;
    // 先给数组分配16个长度
    public MyArrayList() {
        elements = new Object[16];
        curr = 0;
    }

    @Override
    public int size() {
        return curr;
    }

    @Override
    public boolean isEmpty() {
        return curr == 0;
    }

    @Override
    public boolean contains(Object o) {

        for (Object ele : elements) {
            if (Objects.equals(ele, o)) {
                return true;
            }
        }

        return false;
    }

    @Override
    public void clear() {
        curr = 0;
    }

    @Override
    public Object get(int index) {
        if (index > curr || index < 0) {
            throw new IndexOutOfBoundsException("out of bound " + curr + " for " + index);
        }
        return elements[index];
    }

    @Override
    public boolean add(Object o) {
        if (curr == elements.length - 1) {
            // 数组满了,扩容一倍,把数据拷贝到新数组里。
            Object[] temp = new Object[elements.length * 2];
            System.arraycopy(elements, 0, temp, 0, elements.length);
            elements = temp;
        }
        elements[curr] = o;
        curr++;
        return true;
    }

    @Override
    public Iterator iterator() {
        throw new UnsupportedOperationException();
    }

    @Override
    public Object[] toArray() {
        throw new UnsupportedOperationException();
    }

    ...... // 其他方法都抛出 UnsupportedOperationException 异常实现,这里省略。
}

复制代码

上面只实现了几个基础的方法,其他操作的方法都按抛出 UnsupportedOperationException 异常来实现,在例程里省略掉了。

package com.example.learncollection;

import java.util.List;

public class UseListAppMain {

    public static void main(String[] args) {
		List myList = new MyArrayList();
        for (int i = 0; i < 10; i++) {
            myList.add("str" + (i % 5));
        }
        
        System.out.println();
        System.out.println("输出" + myList.getClass() + "中的元素,共" + myList.size() + "个");
        
        for (List element : myList) {
            System.out.println(element);
        }
    }
}

复制代码

Java 提供的List实现类

上面解释 List 接口的时候,尝试自己写了一个实现类,能观察到需要实现的方法有很多,且 List 的动态扩容和查找实现的都很晦涩,也毫无性能可言。好在 Java 里给我们提供了很多完备的 List 实现类,我们直接用就行了,不必自己编写类实现 List 接口。

可以在 Java Collections API 中的以下 List 实现之间进行选择:

  • java.util.ArrayList java
  • util.LinkedList
  • java.util.Vector
  • java.util.Stack

在这些实现中,ArrayList 是最常用的。 java.util.concurrent 包中还有并发 List 的实现。这部分内容等到并发相关的章节再详细解释。

创建列表实例

可以通过实例化实现了List接口的类,创建一个列表实例。

List listA = new ArrayList();
List listB = new LinkedList();
List listC = new Vector();
List listD = new Stack();
复制代码

大多数情况下我们都会使用 ArrayList 类,但在某些情况下,使用其他实现之一可能更有意义。

默认情况下,可以往 List 中放入任何对象。但是从 Java 5 开始,使用 Java 泛型可以限制插入到列表中的对象类型。下面是一个例子:

List<MyObject> list = new ArrayList<ObjectType>();
复制代码

现在这个列表只允许插入 MyObject 类的实例,这样一来访问和迭代列表元素的时候就不需要再对其进行强制类型转换了。

List<MyObject> list = new ArrayList<MyObject>();

list.add(new MyObject("First MyObject"));

MyObject myObject = list.get(0);

for(MyObject obj : list){
   ......
}
复制代码

如果不使用泛型对列表元素类型进行限制,上面这个例子会变成

List list = new ArrayList();   // 没有泛型类型约束,列表元素默认是Object类型的

list.add(new MyObject("First MyObject"));

MyObject myObject = (MyObject) list.get(0);  // 使用列表元素时需要进行类型转换

for(Object obj : list){
    // 使用前进行类型转换
    MyObject theMyObject = (MyObject) anObject;

   ......
}
复制代码

如果没有在 List 变量声明上设置泛型类型,Java 编译器只知道 List 中存放的是 Object 实例。因此,在使用时需要将它们转换为对象所属的具体类(或接口)。

为 List 变量指定泛型类型,可以帮助避免将错误类型的对象插入到列表中,使我们从 List 中检索对象时无需再做类型转换。并且 它可以帮助代码的阅读者了解 List 应该包含什么类型的对象。除非有充分的理由不对 List 使用泛型约束,否则创建 List 实例时应始终使用泛型约束。

下面通过 ArrayList 我们详细介绍一下 Java List 的使用方法。

向列表中插入元素

使用 add() 方法将元素(对象)插入到 Java 列表中。

List<String> strList = new ArrayList<>();

strList.add("element 1");
strList.add("element 2");
strList.add("element 3");
复制代码

add 方法加元素插入到列表的尾部。注意,列表是允许 null 值插入的。

Object element = null;

List<Object> list = new ArrayList<>();

list.add(element);
复制代码

add 方法还支持向指定索引位置插入元素。

strList.add(0, "element 4");
复制代码

如果 List 的索引位置上已经包含元素,原有元素将在 List 的内部序列中进一步向下推,比如这个例子里在新元素插入到索引 0 之前,原来索引为 0 的元素将被挪到索引 1 的位置上。

把一个列表的全部元素插入到另外一个列表

可以将一个 List 中的所有元素添加到另一个 List 中,使用 List 的 addAll() 方法就能执行此操作。结果列表是两个列表的并集。

List<String> listSource = new ArrayList<>();

listSource.add("123");
listSource.add("456");

List<String> listDest   = new ArrayList<>();

listDest.addAll(listSource);
复制代码

addAll() 方法的类型参数是 Collection,因此可以传递 List 或 Set 作为参数。换句话说,可以使用 addAll() 将 List 或 Set 中的所有元素添加到 List 中。

从列表中读取一个元素

可以使用元素的索引从 Java 列表中获取元素。使用 get(int index) 方法执行此操作。以下是使用元素索引访问列表元素的示例:

List<String> listA = new ArrayList<>();

listA.add("element 0");
listA.add("element 1");
listA.add("element 2");

//access via index
String element0 = listA.get(0);
String element1 = listA.get(1);
String element3 = listA.get(2);
复制代码

从列表中查找一个元素

在 List 中查找一个元素,可以使用以下两个方法

  • indexOf
  • lastIndexOf

indexOf 方法返回给定元素在 List 中第一次出现的索引

List<String> list = new ArrayList<>();

String element1 = "element 1";
String element2 = "element 2";

list.add(element1);
list.add(element2);

int index1 = list.indexOf(element1);
int index2 = list.indexOf(element2);

System.out.println("index1 = " + index1);
System.out.println("index2 = " + index2);
复制代码

上面例程的返回结果是

index1 = 0
index2 = 1
复制代码

lastIndexOf 方法返回给定元素在 List 中最后一次出现的索引。

List<String> list = new ArrayList<>();

String element1 = "element 1";
String element2 = "element 2";

list.add(element1);
list.add(element2);
list.add(element1);

int lastIndex = list.lastIndexOf(element1);
System.out.println("lastIndex = " + lastIndex);
复制代码

上面例程的返回结果是

lastIndex = 2
复制代码

如果列表中不存在给定元素,这两个方法的返回结果都是 -1

检查列表中是否存在给定元素

使用 List contains() 方法检查 Java List 是否包含给定元素。

List<String> list = new ArrayList<>();

String element1 = "element 1";

list.add(element1);

boolean containsElement = list.contains("element 1");

System.out.println(containsElement); // 输出 true
复制代码

为了确定 List 是否包含给定元素,List 将在内部迭代其元素并将每个元素与 contains 参数指定的对象进行比较。比较使用元素的 equals 方法来检查元素是否等于参数。 由于可以向 List 添加空值,因此实际上可以检查 List 是否包含空值。以下是检查 List 是否包含空值的方法:

list.add(null);

containsElement = list.contains(null);

System.out.println(containsElement);
复制代码

显然,如果 contains() 的输入参数为 null,则 contains() 方法不会使用 equals() 方法来比较每个元素,而是使用 == 运算符。

从列表中移除一个元素

可以通过以下两种方法从 Java 列表中删除元素。

  • remove(Object element)
  • remove(int index)

remove(Object element) 从列表中的删除参数 element 指定的该元素(如果存在)。删除后列表中的所有后续元素会在列表中向上移动,索引减 1。

List<String> list = new ArrayList<>();

String element = "first element";
list.add(element);

list.remove(element);
复制代码

remove(int index) 方法删除给定索引处的元素。删除后,列表中的所有后续元素会在列表中向上移动,索引减 1。

List<String> list = new ArrayList<>();

list.add("element 0");
list.add("element 1");
list.add("element 2");

list.remove(0);
复制代码

从列表中移除所有元素

clear() 方法从列表中删除所有元素

List<String> list = new ArrayList<>();

list.add("object 1");
list.add("object 2");

list.clear();
复制代码

获得两个列表的交集

List 的 reatinAll 方法可以获取两个 List 的交集。

List<String> list      = new ArrayList<>();
List<String> otherList = new ArrayList<>();

String element1 = "element 1";
String element2 = "element 2";
String element3 = "element 3";
String element4 = "element 4";

list.add(element1);
list.add(element2);
list.add(element3);

otherList.add(element1);
otherList.add(element3);
otherList.add(element4);

list.retainAll(otherList);
复制代码

上面的例程执行完后,list 列表里将只会存在,list 和 otherList 两个列表中共有的元素。即执行完后 list 中只剩下 "element1","element3" 两个元素。

返回列表的大小

通过调用 size() 方法获取 List 中的元素数量。

List<String> list = new ArrayList<>();

list.add("object 1");
list.add("object 2");

int size = list.size(); // 长度为2
复制代码

获取列表子集

List 接口有一个名为 subList() 的方法,该方法可以使用原始 List 中的元素子集创建一个新 List。 subList() 方法接受 2 个参数:开始索引和结束索引。起始索引是原始列表中要包含在子列表中的第一个元素的索引。结束索引是子列表的最后一个索引,结束索引处的元素不包含在子列表中。

类似于 Java 字符串子字符串 substring 方法的工作方式 。

List<String> list = new ArrayList<>();

list.add("element 1");
list.add("element 2");
list.add("element 3");
list.add("element 4");

List<String> sublist = list.subList(1, 3);
复制代码

上面的例程把原始列表的 索引1 和 索引2 作为子集赋值给了 sublist 。

把列表转换为Set

可以通过创建一个新的 Set 并将 List 中的所有元素添加到其中,来将 List 转换为 Set。 转换为 Set 后将删除 List 中的所有重复项。

List<String> list = new ArrayList<>();

list.add("element 1");
list.add("element 2");
list.add("element 3");
list.add("element 3");

Set<String> set = new HashSet<>();
set.addAll(list);
复制代码

把列表转换为数组

可以使用 List 的 toArray() 方法将列表转换为数组。

List<String> list = new ArrayList<>();

list.add("element 1");
list.add("element 2");
list.add("element 3");
list.add("element 3");

Object[] objects = list.toArray();
复制代码

可以将 List 转换为特定类型的数组。

List<String> list = new ArrayList<>();

list.add("element 1");
list.add("element 2");
list.add("element 3");
list.add("element 3");

String[] objects1 = list.toArray(new String[0]);
复制代码

注意,即使我们将大小为 0 的 String 数组传递给 toArray() 方法,返回的数组也将包含 List 中的所有元素,它将具有与 List 相同数量的元素。

把数组转换成List

使用 java.util.Arrays 的 asList 方法可以将 Java 数组转换为 List。

String[] values = new String[]{ "one", "two", "three" };

List<String> list = (List<String>) Arrays.asList(values);
复制代码

排序列表

排序可排序对象的列表

如果 List 中包含的是实现了 Comparable 接口 (java.lang.Comparable) 的对象,这些对象可以相互比较。在这种情况下,可以像这样对 List 进行排序:

List<String> list = new ArrayList<>();

list.add("c");
list.add("b");
list.add("a");

Collections.sort(list);
复制代码

Java 的 String 类实现了 Comparable 接口,可以使用 Collections 接口的 sort() 方法按自然顺序对它们进行排序。

使用比较器(Comparator)对列表进行排序

如果 List 中的对象没有实现 Comparable 接口,或者如果想以不同于对象的 compare() 实现的顺序对对象进行排序,那么需要使用 Comparator 实现 (java.util.Comparator)。

public class Car{
    public String brand;
    public String numberPlate;
    public int noOfDoors;

    public Car(String brand, String numberPlate, int noOfDoors) {
        this.brand = brand;
        this.numberPlate = numberPlate;
        this.noOfDoors = noOfDoors;
    }
}
复制代码

这是对上述 Car 对象的 Java 列表进行排序的代码

List<Car> list = new ArrayList<>();

list.add(new Car("Volvo V40" , "XYZ 201845", 5));
list.add(new Car("Citroen C1", "ABC 164521", 4));
list.add(new Car("Dodge Ram" , "KLM 845990", 2));

Comparator<Car> carBrandComparator = new Comparator<Car>() {
    @Override
    public int compare(Car car1, Car car2) {
        return car1.brand.compareTo(car2.brand);
    }
};

Collections.sort(list, carBrandComparator);
复制代码

上面示例中的 Comparator 实现,仅比较 Car 对象的 brand 字段。我们可以创建另一个比较器实现来比较车牌号,甚至是汽车门的数量。

迭代列表

可以通过多种不同的方式迭代 Java 列表。最常见的三种方式是:

  • 使用迭代器
  • 使用for each 循环
  • 使用Java Stream API

使用迭代器

通过调用 List 接口的 iterator() 方法获得一个 Iterator。 一旦你获得了一个迭代器,你就可以继续调用它的 hasNext() 方法,直到它返回 false。

List<String> list = new ArrayList<>();

list.add("first");
list.add("second");
list.add("third");
    
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
    String obj = iterator.next();
}
复制代码

如你所见,调用 hasNext() 是在 while 循环内完成的。 在 while 循环中,调用 Iterator 接口的 next() 方法来获取 Iterator 指向的下一个元素。

使用for each循环

迭代 List 的第二种方法是使用 Java 5 中新增的 for each循环

List<String> list = new ArrayList<String>();

list.add("first");
list.add("second");
list.add("third");

for(String element : list) {
    System.out.println(element);
}
复制代码

当然,用普通的 for 循环也是能迭代 List。

List<String> list = new ArrayList<String>();

list.add("first");
list.add("second");
list.add("third");
    
for(int i=0; i < list.size(); i++) {
    String element = list.get(i);
}
复制代码

使用Java Sream API 迭代 List

必须首先从列表中获取 Stream。在 Java 中从 List 中获取 Stream 是通过调用 List 的 stream() 方法来完成的。

List<String> stringList = new ArrayList<String>();

stringList.add("abc");
stringList.add("def");

Stream<String> stream = stringList.stream();
复制代码

从列表中获取流后,可以通过调用其 forEach() 方法来迭代流。以下是使用 forEach() 方法迭代 List 元素的示例:

List<String> stringList = new ArrayList<String>();

stringList.add("one");
stringList.add("two");
stringList.add("three");

Stream<String> stream = stringList.stream();
stream.forEach( element -> { System.out.println(element); });
复制代码

调用 forEach() 方法将使 Stream 在内部迭代 Stream 的所有元素,并为 Stream 中的每个元素调用作为参数传递给 forEach() 方法的 Consumer。

对象List的常用操作

有两个对象集合 aList 和 bList。

List<A> aList = new ArrayList<>(Arrays.asList(
    new A("1", "张三"),
    new A("2", "李四"),
    new A("3", "王五")
));

List<A> bList = new ArrayList<>(Arrays.asList(
    new A("2", "李四"),
    new A("3", "王五"),
    new A("4", "赵六")
));
复制代码

Class A 的声明如下:

// 静态内部类
static class A {
    String id;
    String nickName;

    public A(String id, String nickName) {
        this.id = id;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "A{" +
            "id='" + id + '\'' +
            ", nickName='" + nickName + '\'' +
            '}';
    }

    public String getId() {
        return id;
    }

    public String getNickName() {
        return nickName;
    }
}
复制代码

求两个对象List的交集

根据集合对象里的ID,求两个集合的交集

// aList 与 bList 的交集 (在两个集合中都存在的元素)
List<A> intersections = aList
    .stream() //获取第一个集合的Stream1
    .filter(  //取出Stream1中符合条件的元素组成新的Stream2,lambda表达式1返回值为true时为符合条件
        a ->  //lambda表达式1,a为lambda表达式1的参数,是Stream1中的每个元素
        bList.stream() //获取第二个集合的Stream3
        .map(A::getId) //将第二个集合每个元素的id属性取出来,映射成新的一个Stream4
        .anyMatch( //返回值(boolean):Stream4中是否至少有一个元素使lambda表达式2返回值为true
            id -> //lambda表达式2,id为lambda表达式2的参数,是Stream4中的每个元素
            Objects.equals(a.getId(), id) //判断id的值是否相等
        )
    )
    .collect(Collectors.toList()); //将Stream2转换为List
System.out.println("----------bList 与 aList 的交集为:");
System.out.println(intersections);
复制代码

求两个对象List的差集

根据集合对象里的ID,求bList 与 aList的差集

// 求bList 与 aList的差集(在bList中不在aList中)
List<A> differences = bList.stream().filter(b -> aList.stream().map(A::getId).noneMatch(id -> Objects.equals(b.getId(), id))).collect(Collectors.toList());
System.out.println("----------bList 与 aList 的差集为:");
System.out.println(differences);
复制代码

高效版求差集

上面的执行效率不高,每个bList 的元素都要在noneMatch里判断在aList里有没有跟它ID重复的对象,相当于整个筛选是O(N²)的复杂度,所以可以先把 aList 转化成以id为 key 的 Map,这样noneMatch里的操作只需要判断一次key存不存在即可,整个筛选变成了O(N)的复杂度。

Map<String, A> aMap = aList.stream().collect(Collectors.toMap(A::getId, Function.identity())) ;
List<A> diffEffective = bList.stream().filter(b -> !aMap.containsKey(b.getId())).collect(Collectors.toList());
System.out.println("----高效版------bList 与 aList 的差集为:");
System.out.println(diffEffective);
复制代码

�同理,求两个 List 的交集也能这么优化。

迭代中删除List元素

如果直接在迭代的时候删除List 元素,程序会抛出--异常 ConcurrentModificationException,那么如果想在迭代的过程中把不满足条件的元素删除,有两种方式来实现。

第一种是让程序避免在迭代中删除元素,把要删除的元素暂存在一个新List里,然后使用removeAll进行删除,避免在迭代中修改List。

假设 List 的元素是下面 Book 类的对象

static class ISBN {
    private String ISBNCode;
    public ISBN(String isbn) {
        this.ISBNCode = isbn;
    }

    public String getCode() {
        return this.ISBNCode;
    }
}

static class Book {
    private ISBN isbn;
    public Book(ISBN isbn) {
        this.isbn = isbn;
    }

    public ISBN getISBN() {
        return this.isbn;
    }
}
复制代码

那么按照第一种方法,下面例子会在迭代后删除指定 List,其实跟使用Stream API 的 filter 操作优点像,不过 Stream 还没学,先看下面这个实现。

public static void useListRemoveAll() {
    List<Book> books = new ArrayList<>();
    books.add(new Book(new ISBN("0-201-63361-2")));
    books.add(new Book(new ISBN("0-201-63361-3")));
    books.add(new Book(new ISBN("0-201-63361-4")));

    ISBN isbn = new ISBN("0-201-63361-2");
    List<Book> found = new ArrayList<>();
    for(Book book : books){
        if(book.getISBN().getCode().equals(isbn.getCode())){
            found.add(book);
        }
    }
    books.removeAll(found);
    System.out.println(books);
}
复制代码

除此之外,在 Java 8及以上的版本,还可以使用 Collection 提供的 removeIf 方法,真正实现在迭代过程中删除元素。

public static void useListRemoveIf() {
    List<Book> books = new ArrayList<>();
    books.add(new Book(new ISBN("0-201-63361-2")));
    books.add(new Book(new ISBN("0-201-63361-3")));
    books.add(new Book(new ISBN("0-201-63361-4")));
    ISBN isbn = new ISBN("0-201-63361-2");

    books.removeIf(book -> book.getISBN().getCode().equals(isbn.getCode()));

    System.out.println(books);
}
复制代码

总结

本篇文章把Java List 的各种操作和实战应用给大家梳理了一下,List 是开发中使用非常高频的结果,操作又多,所以即使完全记不住也没事,多回来参考。 集合框架中还有两类数据结构 Set 和 Map 接下来会分两种介绍。

其实这些结构和 Stream 操作,Stream 和 Lambda 结合紧密经常一起使用,不过不要着急,后面会一一给大家梳理串联起来。


 

“List,Set,Map“在SpringBoot项目中的具体使用场景 在Spring Boot项目中,ListSet和Map这些集合类的使用场景非常广泛。 阅读详情

相关推荐

GIS分析-利用K-Means方法进行地震分析

通过“聚类”可以获得有关我们所拥有的数据的各种线索,这是数据挖掘技术之一。分析创建的组有助于决策过程。在这项研究中,我们将使用数据挖掘工具之一的K-Means方法研究安纳托利亚东部地区近100年发生的地震的空间分布,并试图获得有用的信息,以供未来的研究使用。我从局地震目录页面获得了研究所需的地震数据,并从获得了区域边界数据。

gis收藏家的博客 1570

Java List 核心应用通关指南

本篇文章把Java List 的各种操作和实战应用给大家梳理了一下,List 是开发中使用非常高频的结果,操作又多,所以即使完全记不住也没事,多回来参考。集合框架中还有两类数据结构 Set 和 Map 接下来会分两种介绍。其实这些结构和 Stream 操作,Stream 和 Lambda 结合紧密经常一起使用,不过不要着急,后面会一一给大家梳理串联起来。

Q54665642ljf的博客 594

OpenClaw安装方式那么多,但建议大家还是用云厂商吧

OpenCloud的安装方式多样,包括One-liner、npm、pnpm和Hackable等。One-liner提供高效的单行命令安装;npm和pnpm作为Node.js包管理工具,分别提供常规和高性能的安装选项;Hackable则支持定制化安装。不同系统(macOS、Windows)和终端(PowerShell、CMD)的操作步骤各有特点,用户需根据自身技术背景选择合适的安装方式。官方推荐使用闲置计算资源或云部署方案以获得更佳体验。

涛涛讲AI 1401

Java List示例与常见操作详解

Java中的List是一种有序的集合,允许存储重复元素。它是Java集合框架的一部分,提供了丰富的操作方法,使我们能够轻松地添加、删除、获取和修改元素。我们将使用List来存储一组整数,并进行一些常见的操作。

专注于深入研究多种编程语言,以实战为导向,逐步拓展开发技能,提升工程化编码和思维能力,展现无敌技术实力。 657

T-Box功能详解及应用

T - BOX,其全称为 Telematics Box,作为远程 / 车载通信模块,是一款集车身网络与无线通讯功能于一体的智能终端设备。它充当了多媒体车机与 TSP(汽车远程服务提供商)以及互联网之间的无线路由器角色,为用户创造了远程访问的可能。用户借助T - BOX能够对车辆配备的各个 ECU(电子控制单元)进行远程操控,包括远程启动或停止发动机开启或关闭空调天窗后备箱门车门,以及实现闪灯鸣笛等功能。

wgl110110的博客 5643

CS231n+assignment2(一)

cs231n作业二详解+代码

qq_56551150的博客 2411

java细知识点(深入理解和用例)

1、 List<String> list =null; //list通过不同的赋值,可以有三种状态 //状态1,list尚未实例化 list 就为 null; //这时候list是null //状态二 list实例化但元素数量为0, list = new ArrayList<>(); //这时候 list != null 但 list.isEmpty()为空 //可以使用list!=null && list.isEmpty() 为判断 //状态

qq_42199464的博客 1520

跨平台商品模型大解析:亚马逊 vs 阿里 vs 拼多多

本文深入探讨了亚马逊、阿里巴巴和拼多多三大电商平台的商品模型设计,分析了它们在变体关系、商品抽象层级和SKU定义等方面的异同。亚马逊模型以物流和变体为中心,强调全球仓配体系下的标准化管理;阿里模型采用多视角的弹性结构,适用于多类目、多品牌、多卖家环境;拼多多模型则结合平台标准化与商家个性化,适合短期促销和快速上新场景。文章还提供了实践建议,帮助自研电商平台或商品中台的开发者选择合适的商品结构,并强调了商品模型在电商系统中的核心作用。通过对比分析,本文旨在为读者提供商品建模的启发和参考。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

java 实例化list_java中List的用法和实例详解

List的用法List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型,所以List接口还提供了一些适合于自身的常用方法,如表1所示。表1 List接口定义的常用方法及功能从表1可以看出,List接口提供的适合于自身的常用方法均与索引有关,这是因为List集合为列表...

weixin_32737183的博客 2709

anaconda navigator 卡在loading application界面一直没有反应解决办法

在打开anaconda navigator 程序的时候,遇到了2个问题。第一个问题:打开的时候弹出提示:There is an instance of Anaconda Navigator already running.第二个问题:程序一直卡在loading application界面一直没有反应。以下是我的解决办法,有效果。

猿小白的博客 4386

代码接单:用 ComfyUI 搭建电商模特换装工作流(保姆级教程)

在闲鱼和小红书上,搜一下“AI 模特图”或者“服装换模特”,你会发现大量的接单需求。太贵:请个外模拍一套图,动辄几千块。太慢:寄样品、排期、拍摄、修图,半个月过去了。太卷:竞对都在上新,你还在等图。“给我一张你的衣服平铺图(或假人图),我 10 分钟给你生成真人上身图,一张只要 50 块。对于商家是省钱,对于你是纯利润。为什么不用 Midjourney?因为 MJ 抽卡不可控,无法保持衣服版型一致。只有 ComfyUI,才能做到精准控制,实现工业化量产。

BUG猿的博客 1783

List集合

与普通数组的区别就是它是没有固定大小的限制,可以。ArrayList类是一个看可以。ArrayList就是动态数组,提供了。

m0_74343360的博客 643

AF自动对焦 CDAF PDAF

前言 主流的AF: CDAF, PDAF, laser assist AF(这个只是辅助,在微距或者拍摄纹理不明显的场景下好用)。 1.cdaf原理 CDAF的大致原理就是检测图像锐度或者等价于锐度的参数,不断推动马达寻找最清晰点实现合焦或者对焦。如下图: 缺点:对焦准确,速度慢,由于camera帧率,cpu处理速度,马达反映时间问题不能实时对焦运动物体。 2.pdaf原理 计算相位差,将相位差转换为相位差和af code的关系....

camerall 1万+

Java 做项目能用到 Map 哪些功能?这篇总结全了

这篇文章给大家盘点了一下 Map 的整个体系中都有哪些实现类,并针以最常使用的 HashMap 为切入点,介绍了 Map 这种数据结构在开发中常会使用到的功能。这篇文章主要是让新手快速入门或者是让老手在开发中快速查询参考,对于 Map 底层的数据结构实现、怎么解决哈希碰撞、怎么扩容这些并没涉及,这块面试的时候还精彩被问到,在会使用 Map 的基础上,一定要再看看这方面的知识。

Huangjiazhen711的博客 483

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Java 基础篇】Java List 详解

List接口继承自Collection接口,并添加了一些针对有序列表的操作。它允许元素的重复,并提供了根据索引访问、添加、删除和替换元素的方法。在Java中,List接口有几个常见的实现类,每个实现类都具有不同的性能和用途。ArrayList:基于动态数组实现,支持随机访问和快速遍历,适用于读取和修改操作较多的场景。LinkedList:基于双向链表实现,支持高效的插入和删除操作,适用于频繁的插入和删除操作。Vector:与ArrayList类似,但是线程安全,适用于多线程环境。

繁依Fanyi的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java List基础篇

Java List基础篇

似霰的博客 1242

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java中的List和Set:数据结构与使用场景

Java的List和Set提供了灵活的集合操作,理解它们的特点和使用场景对于编写高效、可读性强的代码至关重要。选择正确的数据结构可以显著提高程序的性能和逻辑清晰度。

qiuqiule6的博客 2126

【Java 基础篇】Java List 使用指南:深入解析列表操作

在 Java 中,List是一个接口,它继承自Collection接口。List接口代表一个有序的元素序列,允许元素重复。这意味着你可以按照添加顺序存储一组元素,而且允许相同的元素多次出现。List接口提供了许多方法来操作列表中的元素,包括添加、删除、获取、搜索等。Java 的List接口是一个强大的工具,用于处理有序、可重复的元素集合。不同的List实现适用于不同的场景,你可以根据需求选择合适的实现类。了解List接口的基本方法、遍历方式以及常见的操作将有助于你更好地利用列表来解决问题。

繁依Fanyi的博客 8214

java基础——java集合list详解_java list,零基础入门到精通,收藏这篇就够了

List接口继承自Collection接口,提供了额外的功能来处理索引位置上的元素。与Set、Map不同,List允许包含重复的元素,并且可以通过索引来访问或修改特定位置的元素。List 作为 Java 集合框架中最基础、最常用的数据结构之一,贯穿于几乎所有的 Java 应用开发中。掌握 List 的核心接口、常用实现类(如 ArrayList、LinkedList、Vector)、遍历方式和去重技巧,不仅有助于写出更高效、清晰的代码,也能帮助我们在面对复杂业务逻辑时做出更合理的技术选型。

leah126的博客 1178

工作中需要用到的Java知识(集合篇)

工作中需要用到的Java知识(二) 上一篇我提到了基本数据类型,引用数据类型String,还有StringBuffer和StringBuilder的作用与区别,这些内容是我们在进行开发中经常会用到的内容,当我们了解了这些之后我们应该了解一下集合 其实在集合之前我们还有一些其他的内容,但是我这个可能是单纯的复习,不是系统的学习,所以一些内容就不说了,如果有大佬有更深的理解或更好的内容,请分享给我,谢谢啦。 1.集合类型 集合在工作中也经常会遇见,其实Java语言进行WEB后端开发的时候,全都是数据库内容的增删

虚心学习,和气编码 729

Java8的flatMap()到底该怎么用,什么业务场景下会用到

## 先概括 多个集合(List)合并成一个大集合处理 ##什么叫多个集合合并成一个大集合处理呢 别着急,我先弄一个例子,然后等下再给你们列举个使用场景. ## 代码示例 public class Test { public static void main(String args[]) { List<String> teamIndia = Arrays.asList("Virat", "Dhoni", "Jadeja"); List&l.

插着鸡毛的豆子的博客 3153

Java八股文——集合「List篇」

可以在遍历过程中修改元素的方式使用 Iterator 的 set() 方法。使用传统的 for 循环,通过索引的 set() 方法。使用 ListIterator 的 set() 方法,支持双向遍历。不能在遍历过程中直接修改元素的方式使用 for-each 循环,因为无法直接修改元素。使用 forEach 和 Lambda 表达式,因为它们不支持修改原始集合中的元素。

最短的捷径就是绕远路,绕远路才是我的最短捷径。 1325

java基础篇:list

ArrayList是List接口的一个实现类,基于动态数组结构。特点:查询速度快(O(1)),因为底层是数组,可通过索引直接访问。增删元素慢(O(n)),因为插入或删除时可能涉及元素移动。允许存储null值。LinkedList采用双向链表结构,不同于ArrayList,它更适合频繁插入和删除的场景。特点:插入和删除操作快(O(1)),不需要移动元素。查询速度慢(O(n)),因为必须从头或尾开始查找。可用作队列或双端队列(Deque)。Vector与ArrayList类似,也是基于动态数组。

x² 1017
上一篇: 【JAVA】探讨 Java 中 valueOf 和 parseInt 的区别
下一篇: ExecutorService、Callable、Future实现有返回结果的多线程原理解析
java小姜在线冲
博客等级 码龄4年 53粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值