java——集合介绍【汇总】

news2024/11/17 0:02:20

一、集合的理解和好处

1.1、数组的不足

1、长度开始时必须指定,而且一旦指定,不能更改

2、保存的必须为同一类型的元素

3、使用数组进行增删,比较麻烦

1.2、集合

1、可以动态保存任意多个对象,使用比较方便!

2、提供了一系列方便的操作对象的方法:add、remove,set、 get等

3、使用集合添加,删除新元素的示意代码

二、集合框架体系

2.1、单列集合

Collection 接口有两个重要的子接口 List Set , 他们的实现子类都是单列集合

2.2、双列集合

Map 接口的实现子类 是双列集合,存放的 K-V

三、Collection 接口和常用方法

3.1、Collection接口实现类的特点

3.1.1、public interface Collection<E> extends iterable <E>

1、collection实现子类可以存放多个元素,每个元素可以是0bject

2、有些Collection的实现类,可以存放重复的元素(List),有些不可以(Set)

3、有些Collection的实现类,有些是有序的(List),有些不是有序(Set)

4、Collection接口没有直接的实现子类,是通过它的子接口Set 和 List来实现的

3.1.2、Collection 接口常用方法

方法说明
boolean add(E e)

添加单个元素

boolean remove(Object o)删除指定元素
boolean contains(Object o)查找元素是否存在
boolean addAll(Collection<? extends E> c)添加多个元素
boolean containsAll(Collection<?> c)查找多个元素是否都存在
boolean removeAll(Collection<?> c)删除多个元素
int size()获取元素个数
boolean isEmpty()判断是否为空
void clear()清空

3.2、Collection 接口遍历元素方式 1-使用 Iterator(迭代器)

3.2.1、基本介绍

Java.util

接口 Iterator<E>

所有已知子接口:

Listlterator(E>, XILEventReoder
所有已知实现类:
BeoContextSupport,BCStterotor,EventReaderDelezate,Scanner

1、terator对象称为迭代器,主要用于遍历 Collection 集合中的元素。

2、所有实现了Collection接口的集合类都有一个iterator(), 用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器。

3、Iterator的结构

4、Iterator 仅用于遍历集合,Iterator 本身并不存放对象。

3.2.2、迭代器的执行原理

terator iterator = coll.iterator0://得到一个集合的迭代器
while(iterator.hasNext()){
    //hasNext():判断是否还有下一个元素
    System.out.println(iterator.next();
    //next()作用:1.下移 2.将下移以后集合位置上的元素返回
}

3.2.3、Iterator接口方法

hasNext()
next()
remove()


注意:在调用iterator.next()方法之前必须要调用iterator.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NosuchElementException异常。

3.2.4、应用

Collection col = new ArrayList();
col.add(new Book("三国演义", "罗贯中", 10.1));
col.add(new Book("小李飞刀", "古龙", 5.1));
col.add(new Book("红楼梦", "曹雪芹", 34.6));
// System.out.println("col=" + col);

// 遍历col集合
// 1. 先得到 col 对应的迭代器
Iterator iterator = col.iterator();
// 2. 使用 while 循环遍历
while (iterator.hasNext()) {//判断是否还有数据
    //返回下一个元素,类型是 Object
    Object obj = iterator.next();
    System.out.println("obj=" + obj);
}
// idea快捷键,快速生成 while => itit
// 显示所有的快捷键的的快捷键 ctrl + j
// 3. 当退出 while 循环后 , 这时 iterator 迭代器,指向最后的元素
// iterator.next();//NoSuchElementException
// 4. 如果希望再次遍历,需要重置我们的迭代器
iterator = col.iterator();

3.3、Collection 接口遍历对象方式 2-for 循环增强

3.3.1、基本介绍

1、增强for循环可以替代iterator迭代器

2、特点:增强for就是简化版的iterator,本质一样。只能用于遍历集合和数组

3.3.2、基本语法

for(元素类型 元素名 : 集合名或数组名){
    访问元素
}

3.3.3、应用

Collection col = new ArrayList();
col.add(new Book("三国演义", "罗贯中", 10.1));
col.add(new Book("小李飞刀", "古龙", 5.1));
col.add(new Book("红楼梦", "曹雪芹", 34.6));
// System.out.println("col=" + col);

//1. 使用增强for, 在Collection集合
//2. 增强for, 底层仍然是迭代器
//3. 增强for可以理解成就是简化版本的 迭代器遍历
//4. ***快捷键方式 I
for (Object book : col) {
    System.out.println("book=" + book);
}

//增强for,也可以直接在数组使用
int[] nums = {1, 8, 10, 90};
for (int i : nums) {
    System.out.println("i=" + i);
}

四、List 接口

4.1、List 接口基本介绍

java.util 
接口 List<E>
所有超级接口: 
Collection<E>, Iterable<E> 
所有已知实现类: 
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

1、List接口是Collection接口的子接口
2、List 集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
3、List 集合中的每个元素都有其对应的顺序索引,即支持索引,索引是从 0 开始的
4、List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中对应的元素。

4.2、List 接口的常用方法

方法说明
void add(int index, Object ele)在 index 位置插入
boolean addAll(int index, Collection eles)从 index 位置开始将 eles 中的所有元素添加进来
Object get(int index)获取指定 index 位置的元素
int indexOf(Object obj)返回 obj 在集合中首次出现的位置
int lastIndexOf(Object obj)返回 obj 在当前集合中末次出现的位置
Object remove(int index)移除指定 index 位置的元素,并返回此元素
Object set(int index, Object ele)设置指定 index 位置的元素为 ele , 相当于替换
List subList(int fromIndex, int toIndex)返回从 fromIndex 到 toIndex 位置的子集合

4.3、 List 的三种遍历方式 [ArrayList, LinkedList,Vector]

//List 接口的实现子类 ArrayList  Vector LinkedList
List list = new ArrayList();
//List list = new Vector();
//List list = new LinkedList()

//add...

//1. 迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println(obj);
}
//2. 增强 for
for (Object o : list) {
System.out.println("o=" + o);
}
//3. 使用普通 for
for (int i = 0; i < list.size(); i++){
System.out.println("对象=" + list.get(i));

4.4、List 接口的实现子类—ArrayList

4.4.1、ArrayList 基本介绍

1、ArrayList 可以加入null,并且多个

2、ArrayList是由数组来实现数据存储的[后面老师解读源码]

3、ArrayList 基本等同于Vector,除了 ArrayList是线程不安全(执行效率高)看源码。在多线程情况下,不建议使用ArrayList

4.4.2、ArrayList底层结构

1、ArrayList中维护了一个Object类型的数组
transient Object[ ] elementData; //transient 短暂的 表示该属性不会被序列化
2、当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0 ,第一次添加则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5 倍;
3、如果使用的是指定大小的构造器,则初始扩容elementData容量为指定大小,如果需要再次扩容,则直接扩容为1.5倍;

4.5、List 接口的实现子类—Vector

4.5.1、Vector基本介绍

1、 Vector类的定义说明

public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

2、 Vectorl底层也是一个对象数组,protected Object[] elementData;

4.5.2、Vector底层结构

1、Vector 底层也是一个对象数组,protected Object[ ] elementData;

2、Vector 是线程同步的,即线程安全,Vector类的操作方法带有synchronized
在开发中,需要线程同步安全时,考虑使用Vector

4.6、List 接口的实现子类—LinkedList

4.6.1、LinkedList基本介绍

1、LinkedList底层实现了双向链表和双端队列特点

2、可以添加任意元素(元素可以重复),包括null

3、线程不安全,没有实现同步

4.6.2、LinkedList底层结构

1、 LinkedList底层维护了一个双向链表

2、LinkedList中维护了两个属性first和last分别指向首节点和尾节点

3、每个节点(Node对象),里面又维护了prev、next, item三个属性。其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表

4、所以LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。

4.7、ArrayList,LinkedList,Vector的比较

底层结构

版本

线程安全(同步)效率

扩容倍数

ArrayList

可变数组

jdk1.2

不安全

效率高

如果有参构造1.5倍

如果是无参

1.第一次10

2.从第二次开始按1.5扩容

Vector

可变数组

Object[]

jdk1.0

安全

增删效率较低

改查效率较高

如果是无参,默认10,满后,就按2倍扩容

如果指定大小,则每次直接按2倍扩容

LinkedList双向链表

不安全,

增删效率较高,

改查效率较低

五、Set接口

5.1、Set接口基本介绍

java.util 
接口 Set<E>
类型参数:
E - 此 set 所维护元素的类型
所有超级接口: 
Collection<E>, Iterable<E> 
所有已知子接口: 
NavigableSet<E>, SortedSet<E> 
所有已知实现类: 
AbstractSet, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet

1、无序(添加和取出的顺序不一致),没有索引。但是每次取出的顺序一致

2、 不允许重复元素,所以最多包含一个null

5.2、Set 接口的常用方法

和 List 接口一样, Set 接口也是 Collection 的子接口,因此,常用方法和 Collection 接口一样. 

5.3、Set 接口的遍历方法

同Collection的遍历方式一样,因为Set接口是Collection接口的子接口。

1、可以使用迭代器

2、增强for

3、不能使用索引的方式来获取。

//1. 以 Set 接口的实现类 HashSet 来讲解 Set 接口的方法
//2. set 接口的实现类的对象(Set 接口对象), 不能存放重复的元素, 可以添加一个 null
//3. set 接口对象存放数据是无序(即添加的顺序和取出的顺序不一致)
//4. 注意:取出的顺序的顺序虽然不是添加的顺序,但是他是固定
Set set = new HashSet();
set.add("john");
//方式 1: 使用迭代器
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
    Object obj = iterator.next();
    System.out.println("obj=" + obj);
}
//方式 2: 增强 for
for (Object o : set) {
    System.out.println("o=" + o);
}
//set 接口对象,不能通过索引来获取

5.4、Set 接口的实现子类—HashSet

5.4.1、HashSet基本介绍

1) HashSet实现了Set接口

2) HashSet实际上是HashMap

public HashSet() {
map = new HashMap();
}

3)可以存放null,但只能有一个空null

4) HashSet不保证元素是有序的,取决于hash后,在确定索引的结果(即,不保证元素顺序和取出顺序一致)

5)不能有重复元素/对象:在前面Set 接口使用已经讲过

5.4.2、HashSet 底层机制说明

分析HashSet底层是HashMap, HashMap底层是(数组+链表+红黑树)

1、模拟简单的数组+链表结构

1)先获取元素的呛希值(hashCode方法)

2)对哈希值进行运算,得出一个索引值,即为要存放在哈希表中的位置号

3)如果该位面上没有其他元素,则直接存放

4)如果该位置上已经有其他元素,则需要进行equals判断,如果相等,则不再添加。如果不相等,则以链表的方式添加。

2、分析HashSet的添加元素底层是如何实现(hash()+equals()

1)HashSet底层是HashMap

2)添加一个元素时。先得到hash值-会转成->索引值

3)找到存储数据表table,看这个索引位置是否已经存放的有元素

4)如果没有,直接加入

5)如果有,调用equals比较。如果相同,就放弃添加。如果不相同。则添加到最后

6)在Java8中,如果一条链表的元素个数到达 TREEIFY_THRESHQLD(默认是8),并且table的大小>=MIN_TREEIFY_ CAPACITY(默认64),就会进行树化(红黑树)

3、源码解读

......

4、分析HashSet的扩容和转成红黑树机制

1)HashSet层是HashMap,第一次添加时,table数组扩容到16,临界值(threshold)是16*加载因子(loadFactor)是0.75 = 12

2)如果table数组使用到了临界值12就会扩容到16*2=32,新的临界值就是32*0.75=24,依次类推

3)在Java8中,如果一条链表的元素个数到达TREEIFY THRESHOLD(默认是8),并且table的大小>=MIN TREEIFY CAPACITY(默认64),就会进行树化(红黑树),否则仍然采用数组扩容机制

5.5、Set 接口实现类-LinkedHashSet

1)LinkedHashSet是HashSet的子类

2)LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表

3) LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序(图),这使得元素看起来是以插入顺序保存的。

4) LinkedHashSet不允许添重复元素

5.6、Set 接口实现类-TreeSet

1、TreeSet的独特之处在于它的构造器可以传入比较器,所以TreeSet常用来排序,

2、TreeSet 底层是 TreeMap

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSet_ {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();//无参构造,默认排序
        //添加数据
        treeSet.add("Jack");
        treeSet.add("Tom");
        treeSet.add("Ayo");
        treeSet.add("Luck");
        System.out.println(treeSet);//默认排序:首字母ASCII由小到大
        //[Ayo, Jack, Luck, Tom]

        //如果我们想按字符串大小排序
        //使用TreeSet提供的一个构造器,传入一个比较器(匿名内部类)指定排序规则
        treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o2).compareTo((String)o1);//利用String类的compareTo方法,由大到小
                //如果是按照长度由大到小:return ((String)o1).length()-((String)o2).length();
            }//构造器把传入的比较器对象,赋给了TreeSet的底层的TreeMap的属性this.comparator
        });
        treeSet.add("Jack");
        treeSet.add("Tom");
        treeSet.add("Ayo");
        treeSet.add("Luck");
        System.out.println(treeSet);//[Tom, Luck, Jack, Ayo]
    }
}

六、Map 接口

6.1、Map 接口实现类的特点 [很实用]

注意:这里讲的是JDK8的Map接口特点

1)Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value

2) Map 中的key和 value可以是任何引用类型的数据,会封装到HashMap$Node对象中

3) Map中的key 不允许重复,原因和HashSet 一样,前面分析过源码

4) Map 中的value可以重复

5) Map 的key可以为 null, value也可以为null,注意key 为null只能有一个,value为null可以多个

6)常用String类作为Map的 key

7) key和 value之间存在单向一对一关系,即通过指定的key总能找到对应的value

8) Map存放数据的key-value示意图,一对k-v是存放在H阿时候Map$Node中的,又因为Node实现了Entry接口,有些书上也说一对k-v就是一个Entry

6.2、Map接口常用方法

方法说明
default boolean remove(Object key, Object value)根据键删除映射关系
V get(Object key)根据键获取值
int size()获取元素个数
boolean isEmpty()判断个数是否为 0
void clear()清除 k-v
boolean containsKey(Object key)查找键是否存在

6.3、Map接口遍历方法

Map遍历的示意图(比List, 和Set复杂点但是基本原理一样)

Map接口遍历方式

1)containsKey:查找键是否存在

2)keySet:获取所有的键

3)entrySet:获取所有关系k-v

4)values:获取所有的值

import java.util.*;

public class MapFor {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("海绵宝宝","派大星");
        map.put("熊大","熊二");
        map.put("大头儿子","小头爸爸");
        map.put("黑猫警长",null);
        map.put(null,"奥特曼");
        //第一种:先取出所有的Key,通过Key取出对应的value
        Set keySet = map.keySet();
        //(1)增强for
        for(Object key : keySet){
            System.out.println(key+" - "+map.get(key));
        }
        //(2)迭代器
        Iterator iterator = keySet.iterator();
        while (iterator.hasNext()) {
            Object key =  iterator.next();
            System.out.println(key+" - "+map.get(key));
        }

        //第二种:把所有的value取出
        Collection values = map.values();
        //然后遍历Collection就行
        //(1)增强for
        for(Object value : values){
            System.out.println(value);
        }
        //(2)迭代器
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()) {
            Object value =  iterator1.next();
            System.out.println(value);
        }

        //第三种:通过EntrySet来获取
        Set entrySet = map.entrySet();
        //(1)增强for
        for(Object entry : entrySet){
            //将entry转成map.Entry
            Map.Entry m = (Map.Entry) entry;
            System.out.println(m.getKey()+" - "+m.getValue());
        }
        //(2)迭代器
        Iterator iterator2 = entrySet.iterator();
        while (iterator2.hasNext()) {
            Object next = iterator2.next();
            //向下转型 Map.Entry
            Map.Entry m  =  (Map.Entry) next;
            System.out.println(m.getKey()+" - "+m.getValue());
        }
    }
}

6.4、Map 接口实现类-HashMap

6.4.1、HashMap 小结

1)Map接口的常用实现类:HashMap、Hashtable和Properties.

2)HashMap是Map接口使用频率最高的实现类。

3)HashMap是以 key-val对的方式来存储数据(HashMap$Node类型)[案例Entry ]4) key不能重复,但是值可以重复,允许使用nul键和null值

5)如果添加相同的key,则会覆盖原来的key-val,等同于修改.(key不会替换,val会替换)

6)与HashSet-样,不保证映射的顺序,因为底层是以hash表的方式来存储的.(jdk8的hashMap底层数组+链表+红黑树)

7)HashMap没有实现同步,因此是线程不安全的,方法没有做同步互斥的操作,没有synchronized

6.4.2、HashMap 底层机制及源码剖析

1、基本介绍

1) (k,v)是一个Node实现了Map.Entry<K,V>,查看HashMap的源码可以看到.

2)jdk7.0的hashmap 底层实现[数组+链表],jdk8.0底层[数组+链表+红黑树]

2、扩容机制[和HashSet相同]

1)HashMap底层维护了Node类型的数组table,默认为null

2)当创建对象时,将加载因子(loadfactor)初始化为0.75.

3)当添加key-val时,通过key的哈希值得到在table的索引。然后判断该索引处是否有元素。如果没有元素直接添加。如果该索引处有元素,继续判断该元素的key和准备加入的key相是否等,如果相等,则直接替换val; 如果不相等需要判断是树结构还是链表结构。做出相应处理。如果添加时发现容量不够,则需要扩容。

4)第1次添加,则需要扩容table容量为16,临界值(threshold)为12(16*0.75)

5)以后再扩容,则需要扩容table容量为原来的2倍(32),临界值为原来的2倍,即24,依次类推6)在Java8中,如果一条链表的元素个数超过 TREEIFY_THRESHOLD(默认是8),并且table的大小>= MIN_ TREEIFY_CAPACITY(默认64),就会进行树化(红黑树)

6.5、Map 接口实现类-HashTable

6.5.1、HashTable的基本介绍

1、基本内容

1)存放的元素是键值对:即K-V

2) hashtable的键和值都不能为null,否则会抛出NullPointerException

3) hashTable使用方法基本上和HashMap一样

4) hashTable是线程安全的(synchronized), hashMap是线程不安全的

5)简单看下底层结构

2、HashTable的应用案例

下面的代码是否正确,如果错误,为什么?

Hashtable table = new Hashtable0://ok
table.put("john", 100);//ok
table.put(null, 100);//异常
table.put("john", null);//异常
table.put("lucy", 100);//ok
table.put("lic", 100);//ok
table.put("lic", 88):;//替换
System.out.printin(table);

6.6、Hashtable 和 HashMap 对比

版本

线程安全(同步)

效率

允许null键null值

HashMap

1.2

不安全

可以

Hashtable

1.0

安全

较低

不可以

6.7、Map 接口实现类-TreeMap

TreeMap 构造器可以传入比较器,所以TreeMap常用来排序,可以自定义存放数据顺序。

import java.util.Comparator;
import java.util.TreeMap;

public class TreeMap_ {
    public static void main(String[] args) {
        TreeMap treeMap = new TreeMap();//默认构造器,默认比较:自然排序
        treeMap.put("Jack","杰克");
        treeMap.put("Tom","汤姆");
        treeMap.put("Smith","史密斯");
        System.out.println(treeMap);//{Jack=杰克, Smith=史密斯, Tom=汤姆}由小到大排序

        //如果按照传入的key由大到小排序:
        treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o2).compareTo((String)o1);
                //如果是按照长度由大到小:return ((String)o1).length()-((String)o2).length(); 
            }
        });
        treeMap.put("Jack","杰克");
        treeMap.put("Tom","汤姆");
        treeMap.put("Smith","史密斯");
        System.out.println(treeMap);//{Tom=汤姆, Smith=史密斯, Jack=杰克} 由大到小排序
    }
}

6.8、Map 接口实现类-Properties

6.8.1、基本介绍

1、Properties类继承自Hashtable类井且实现了Map接口,也是使用一种键在直对的形式来保存数据。

2、他的使用特点和Hashtable类似

3、Properties 还可以用于从xxx.properties文件中,加载数据到Properties类对象并进行读取和修改

4、说明:工作后 xxx.properties文件通常作为配置文件,这个知识点在10流举例,有兴趣可先看文章

6.8.2、基本使用

//1. Properties 继承 Hashtable
//2. 可以通过 k-v 存放数据,当然 key 和
Properties properties = new Properties
//增加
//properties.put(null, "abc");//抛出 空指针异常
//properties.put("abc", null); //抛出 空指针异常
properties.put("john", 100);//k-v
properties.put("lucy", 100);
properties.put("lic", 100);
properties.put("lic", 88);//如果有相同的 key , value 被替换
System.out.println("properties=" + properties);
//通过 k 获取对应值
System.out.println(properties.get("lic"));//88
//删除
properties.remove("lic");
//修改
properties.put("john", "约翰");//k不换,v换

6.9、总结-开发中如何选择集合实现类(记住)

1、一组对象[单列]: Collection接口

a)允许重复:List

增删多:LinkedList [麻层维护了一个双向链表]

改查多:ArrayList [麻层维护Object类型的可变数组]

b)不允许重复:Set

无序:HashSet[底层是HashMap,维护了一个哈希表即(数组+链表+

c)排序:TreeSet(提供的一个构造器,可以传入一个比较器(匿名内部类)

TreeSet treeSet = new TreeSet();
TreeSet treeSet = new TreeSet(new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
        //下面 调用 String 的 compareTo 方法进行字符串大小比较
        //如果老韩要求加入的元素,按照长度大小排序
        //return ((String) o2).compareTo((String) o1);
        return ((String) o1).length() - ((String) o2).length();
    }
});

插入和取出顺序一致:LinkedHashSet,维护数组+双向链表

2、组键值对[双列]: Map

a)键无序: HashMap[底层是:哈希表jdk7:数组+链表,jdk8:数组+链表+红黑树

b)键排序:TreeMap(提供的一个构造器,可以传入一个比较器(匿名内部类)

TreeMap treeMap = new TreeMap();
TreeMap treeMap = new TreeMap(new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
        //按照传入的 k(String) 的大小进行排序
        //按照 K(String) 的长度大小排序
        //return ((String) o2).compareTo((String) o1);
        return ((String) o2).length() - ((String) o1).length();
    }
});

c)键插入和取出顺序一致:LinkedHashMap

d)读取文件 Properties

6.10、Collections 工具类

6.10.1、Collections 工具类介绍

1、Collections是一个操作Set、List 和 Map等集合的工具类

2、Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作

6.10.2、排序、查找、替换操作

1、排序操作(均为 static 方法)
方法说明
reverse(List)反转List中元素的顺序
shuffle(List)对List集合元素进行随机排序
sort(List)根据元素的自然顺序对指定List集合元素按升序排序
sort(List, Comparator)根据指定的Comparator产生的顺序对List集合元素进行排序
swap(List, int, int)将指定list集合中的i处元素和j处元素进行交换
2、查找、替换
方法说明
Object max(Collection)根据元素的自然顺序返回给定集合中的最大元素。
Object max(Collection, Comparator)根据指定的顺序返回给定集合中的最大元素。k
Object min(Collection)
Object min(Collection, Comparator)
int frequency(Collection, Object)返回指定集合中指定元素的出现次数。
void copy(List dest,List src)将什么中的内容复制到什么中?
boolean replaceAll(List list, Object oldVal, Object newVal)使用新值替换List 对象的所有旧值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端 16】使用Ajax发送异步请求

Ajax 基础入门&#xff1a;实现异步请求 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。通过使用 Ajax&#xff0c;可以在后台与服务器交换数据&#xff0c;这意味着可以在不影响用户…

解决hook汇编代码时空间不足的一种方法

思路&#xff1a;如下图&#xff0c;使用两条jmp指令。原内存地址使用一条jmp指令跳转到新开辟的内存空间(VirtualAlloc或者VirtualAllocEx函数&#xff09;&#xff0c;在新开辟的内存空间完成处理之后再使用jmp指令跳转到原内存地址合适的位置&#xff08;通常是原内存处被ho…

华为诺亚发布无限上下文大模型,超越SoTA 4.3%

你的大语言模型是不是也患上了"长文健忘症"&#xff1f;当使用大模型遇到长上下文时总是会出现词不达意&#xff1f;别担心&#xff0c;LLM界的"记忆大师"来啦&#xff01;华为诺亚方舟实验室最新推出的EM-LLM模型&#xff0c;就像是给大模型装上了"超…

光伏混合储能直流微网直流母线电压下垂控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 此模型以混合储能系统为研究对象&#xff0c;采用基于关联参数SOC的改进下垂控制策略&#xff0c;将初始下垂系数与储能单元SOC的n次幂的比值作为现行下垂系数&#xff0c;通过改变n值&#xff0c;…

2.5 C#视觉程序开发实例2----图片内存管理

2.5 C#视觉程序开发实例2----图片内存管理 1 目标效果视频 mat-buffer 2 Mat 数组的定义 3 图片内存使用场合说明 3.1 程序加载或者切换程序时 3.2 设定时&#xff0c;注册图片 例如注册一个线速的图片 注册流程说明 3.3 外部触发时采集最新图片或者按钮点击时触发拍照 …

计算机毕业设计碾压导师Python+Django农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

基于Spark的农产品个性推荐系统 相关技术介绍: 1. Python Python是一种高级编程语言&#xff0c;具有简洁、易读、易学的特点&#xff0c;被广泛应用于Web开发、数据分析、人工智能等领域。 在此系统中&#xff0c;我们使用Python进行后端开发&#xff0c;利用其强大的语法…

图形引擎实战:Unity性能分析工具原理介绍

最近在维护一个Unity性能分析工具&#xff0c;类似UPR&#xff0c;客户端采集信息&#xff0c;WEB端显示数据。下面简单介绍下原理。 数据来源 Profiler数据 熟悉Unity的同学对Profiler一定不会陌生&#xff0c;我们的性能数据主要来源于它&#xff0c;主要包含函数耗时&…

Linux基础操作(下)

软件安装&#xff0c;CentOS系统和Ubuntu是使用不同的包管理器 CentOS使用yum管理器&#xff0c;Ubuntu使用apt管理器 在CentOS系统中&#xff0c;使用yum命令联网管理软件安装 yum语法: yum [-y] [install | remove | search ] 软件名称 在Ubuntu系统中&#xff0c;使用apt命…

如何跨越 LangChain 应用研发的最后一公里

说 [LangChain] 是现在最流行的 AI 应用开发框架&#xff0c;应该没有人出来反对吧。LangChain 的出现极大地简化了基于大型语言模型&#xff08;LLM&#xff09;的 AI 应用构建难度&#xff0c;如果把 AI 应用比作一个人的话&#xff0c;那么 LLM 相当于这个人的“大脑”&…

FRP配置内网穿透52版本以上适用

简述 适用frp配置内网穿透来说我们需要进行简单的区分&#xff0c;具有公网IP的服务器我们简称为服务端&#xff0c;内网的服务器我们可以简称为客户端&#xff0c;frp需要针对不同的服务器配置不同的文件 下载安装包 Linux下载地址 https://github.com/fatedier/frp/relea…

数据丢失不用愁!这四款数据恢复大师免费版助你找回珍贵回忆

我们在办公或者是生活中常常会遇到不小心将手机设备或者计算机当中的重要数据误删除/格式化/或其他不小心丢失的情况&#xff0c;但是不用紧张&#xff0c;这篇文章就是给大家分享如何恢复他们&#xff0c;以下带来除易我数据恢复外的其他好用的数据恢复软件&#xff1a; 第一…

后端笔记(2)--JDBC

1.JDBC简介 *JDBC(Java DataBase Connectivity)就是使用java语言操作关系型数据库的一套API *JDBC本质&#xff1a;&#xff08;可以使用同一套代码&#xff0c;操作不同的关系型数据库&#xff09; ​ *官方定义的一套操作所有关系型数据库的规则&#xff0c;即接口 ​ *各…

2024年巴黎奥运会奖牌榜数据源:各国选手为荣誉而战!

奥运会是全球瞩目的盛会&#xff0c;每四年举办一次&#xff0c;汇集了来自超过200个国家的优秀运动员参与夏季和冬季的400多场比赛。这是一项真正的全球综合性运动会&#xff0c;各个国家选手为了荣誉和国家的面子而激烈竞争。2024年的巴黎奥运会将是一场令人期待的盛宴&#…

C语言——选择结构

C语言——选择结构 关系运算符及关系表达式关系运算符关系表达式 逻辑运算符和逻辑表达式逻辑运算符逻辑表达式 选择语句if语句条件运算符switch case语句 关系运算符及关系表达式 关系运算符 关系运算实际上是比较运算&#xff0c;C语言提供了六种关系运算符分别为&#xff…

Go语言教程(一看就会)

全篇文章 7000 字左右&#xff0c; 建议阅读时长 1h 以上。 Go语言是一门开源的编程语言&#xff0c;目的在于降低构建简单、可靠、高效软件的门槛。Go平衡了底层系统语言的能力&#xff0c;以及在现代语言中所见到的高级特性。它是快速的、静态类型编译语言。 第一个GO程序…

一篇文章带你入门爬虫并编写自己的第一个爬虫程序

一、引言 目前我们处在一个信息快速迭代更新的时代&#xff0c;海量的数据以大爆炸的形式出现在网络之中&#xff0c;相比起过去那个通过广播无线电、书籍报刊等传统媒介获取信息的方式&#xff0c;我们现在通过网络使用搜索引擎几乎可以获得任何我们需要的信息资源。 但与此同…

Python3网络爬虫开发实战(7)JavaScript 动态渲染页面爬取

文章目录 一、Selenium1. 基本安装2. 基本使用3. 声明浏览器对象4. 访问页面5. 查找节点6. 节点交互7. 动作链8. 执行 JavaScript9. 获取节点信息10. 切换 Frame11. 延时等待12. 前进后退13. Cookies14. 选项卡管理15. 异常处理16. 反屏蔽17. 无头模式18. Pyppeteer&#xff0c…

《遥远的救世主》读后感

未完待续。。。。 未完待续。。。。 未完待续。。。。 【经典语录】 01. 我们这个民族总是以有文化自居&#xff0c;却忘了问一句&#xff1a;是有什么文化&#xff1f;是真理真相的文化还是弱势文化&#xff1f;是符合事物规律的文化还是违背事物规律的文化&#xff1f;任何…

shell脚本与sed基本语法

Day11 一、shell 基础 1、shell 概念 shell 英文翻译过来是外壳的意思&#xff0c;作为计算机语言来理解可以认为它是 操作系统的外壳。可以通过shell 命令来操作和控制操作系统&#xff0c;比如 Linux中的shell命令就包括 ls、cd、pwd 等等。 2、shell 在内核的基础上编写的…

第一个设计模式——单例模式

目录 一、特点&#xff1a; 二、实现单例模式步骤 三、饿汉式 四、懒汉式 五、双重检查锁 六、静态内部类 七、枚举 八、可能被反序列化和反射破坏什么意思&#xff1f; 九、如何解决呢&#xff1f; 一、特点&#xff1a; 唯一性&#xff0c;单例模式确保程序中只有一…