Java中的Set、List、Map的区别及主要实现类方法

Java中的Set、List、Map的区别

数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。

JAVA集合主要分为三种类型:

  • Set(集)
  • List(列表)
  • Map(映射)

Set、List和Map是Java集合框架中的三种不同的接口,它们各自有不同的特点和用途。

  1. Set
    • Set是一种集合,用于存储不重复的元素。
    • Set接口的实现类通常使用哈希表或树等数据结构来实现元素的存储和去重。
    • Set中的元素没有特定的顺序,即不保证元素的插入顺序和访问顺序。
    • 常见的Set接口的实现类有HashSet、LinkedHashSet和TreeSet。
  2. List
    • List是一种有序集合,允许存储重复的元素。
    • List接口的实现类通常使用数组或链表等数据结构来实现元素的存储和有序访问。
    • List中的元素有索引,可以根据索引进行访问、插入和删除操作。
    • List中的元素是有序的,即保持插入顺序。
    • 常见的List接口的实现类有ArrayList、LinkedList和Vector。
  3. Map
    • Map是一种键值对的映射集合,用于存储键值对关系。
    • Map中的键是唯一的,值可以重复。
    • Map接口的实现类通常使用哈希表、树或链表等数据结构来实现键值对的存储和查找。
    • Map中的键值对没有特定的顺序,即不保证键值对的插入顺序和访问顺序。
    • 常见的Map接口的实现类有HashMap、TreeMap。

总结:

  • Set用于存储不重复的元素,List用于存储有序的元素序列,Map用于存储键值对映射关系。
  • Set和List都是集合,而Map是映射。
  • Set和Map中的元素没有特定的顺序,而List中的元素是有序的。

Collection 接口 :Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection,Map

Collection接口的方法

Collection接口是Java集合框架的根接口,它定义了操作集合的基本方法。下面是Collection接口中的主要方法:

  1. int size():返回集合中的元素数量。
  2. boolean isEmpty():如果集合中没有元素,则返回true;否则返回false。
  3. boolean contains(Object o):如果集合中包含指定的元素,则返回true。
  4. boolean add(E e):将指定的元素添加到集合中。如果集合因为元素的存在而发生改变,则返回true。
  5. boolean remove(Object o):从集合中移除指定的元素。如果集合包含了该元素,则返回true。
  6. boolean containsAll(Collection<?> c):如果集合中包含指定集合中的所有元素,则返回true。
  7. boolean addAll(Collection<? extends E> c):将指定集合中的所有元素添加到集合中。如果集合因为添加元素而发生改变,则返回true。
  8. boolean removeAll(Collection<?> c):从集合中移除指定集合中的所有元素。如果集合因为移除元素而发生改变,则返回true。
  9. boolean retainAll(Collection<?> c):仅保留集合中包含在指定集合中的元素,移除其他元素。如果集合因为保留元素而发生改变,则返回true。
  10. void clear():从集合中移除所有的元素。
  11. Object[] toArray():返回包含集合所有元素的数组。
  12. T[] toArray(T[] a):返回包含集合所有元素的数组,并将其存储在指定的数组中。如果指定的数组大小足够大,并且集合可以适应指定的数组,则将元素存储在该数组中。否则,将分配一个新的数组,其运行时类型是指定数组的运行时类型,具有相同的大小。
Iterator接口方法
  1. boolean hasNext():如果迭代器还有元素可以遍历,则返回true;否则返回false。

  2. E next():返回迭代器中的下一个元素,并将迭代器的位置向后移动。

  3. void remove():从集合中移除迭代器最后返回的元素。这个方法只能在调用next()方法之后且在调用remove()方法之前调用一次,否则会抛出IllegalStateException异常。

  4. Set(): Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类:

    1. HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
    2. TreeSet:TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。
Set 的用法

Set是一种集合类型,它表示一组唯一的对象,不允许重复。Set接口继承自Collection接口,常用的实现类有HashSet、LinkedHashSet和TreeSet。

Set接口的主要方法
  1. add(E e):将指定的元素添加到集合中。如果集合中已经包含了该元素,则不会添加,并返回false;否则将元素添加到集合中,并返回true。
  2. remove(Object o):从集合中移除指定的元素。如果集合中包含了该元素,则移除并返回true;否则返回false。
  3. contains(Object o):判断集合中是否包含指定的元素。如果集合中包含了该元素,则返回true;否则返回false。
  4. size():返回集合中元素的数量。
  5. isEmpty():判断集合是否为空。如果集合中没有元素,则返回true;否则返回false。
  6. clear():清空集合中的所有元素。
Set接口的主要实现类
  1. HashSet:基于哈希表实现的Set,不保证元素的顺序,不允许有重复元素。它提供了常数时间的基本操作,如添加、移除、包含等。
  2. LinkedHashSet:基于哈希表和链表实现的Set,它维护了元素的插入顺序,可以通过迭代器按照插入顺序遍历集合中的元素。
  3. TreeSet:基于红黑树实现的Set,它可以对元素进行排序,并且不允许有重复元素。元素可以根据它们的自然顺序或者通过提供的比较器进行排序。
HashSet()的常用方法

HashSetSet接口的一个实现类,它基于哈希表实现,不保证元素的顺序,不允许有重复元素。

  1. add(E e):将指定的元素添加到集合中。如果集合中已经包含了该元素,则不会添加,并返回false;否则将元素添加到集合中,并返回true。
  2. remove(Object o):从集合中移除指定的元素。如果集合中包含了该元素,则移除并返回true;否则返回false。
  3. contains(Object o):判断集合中是否包含指定的元素。如果集合中包含了该元素,则返回true;否则返回false。
  4. size():返回集合中元素的数量。
  5. isEmpty():判断集合是否为空。如果集合中没有元素,则返回true;否则返回false。
  6. clear():清空集合中的所有元素。

这些方法是HashSet的基本用法,通过它们可以实现对集合中元素的添加、移除、判断、获取以及清空等操作。

由于HashSet不保证元素的顺序,因此遍历的结果可能是无序的。

TreeSet()的常用方法

TreeSetSet接口的一个实现类,它基于红黑树(Red-Black tree)实现,可以对元素进行排序。

  1. add(E e):将指定的元素添加到集合中。如果集合中已经包含了该元素,则不会添加,并返回false;否则将元素添加到集合中,并返回true。
  2. remove(Object o):从集合中移除指定的元素。如果集合中包含了该元素,则移除并返回true;否则返回false。
  3. contains(Object o):判断集合中是否包含指定的元素。如果集合中包含了该元素,则返回true;否则返回false。
  4. size():返回集合中元素的数量。
  5. isEmpty():判断集合是否为空。如果集合中没有元素,则返回true;否则返回false。
  6. clear():清空集合中的所有元素。
  7. first():返回集合中的第一个(最小)元素。
  8. last():返回集合中的最后一个(最大)元素。
  9. lower(E e):返回小于给定元素的最大元素,如果不存在,则返回null。
  10. higher(E e):返回大于给定元素的最小元素,如果不存在,则返回null。
  11. floor(E e):返回小于等于给定元素的最大元素,如果不存在,则返回null。
  12. ceiling(E e):返回大于等于给定元素的最小元素,如果不存在,则返回null。
  13. pollFirst():移除并返回集合中的第一个(最小)元素。
  14. pollLast():移除并返回集合中的最后一个(最大)元素。
  15. iterator():返回一个迭代器,可以在集合中迭代元素的顺序是按照元素的自然顺序。

这些方法是TreeSet的基本用法,通过它们可以实现对集合中元素的添加、移除、判断、获取以及清空等操作,以及获取集合中的第一个元素、最后一个元素,以及执行与有序集合相关的操作。

由于TreeSet基于红黑树实现,因此元素在遍历时会按照它们的自然顺序或者自定义的比较器进行排序。

HashSet和TreeSet区别

HashSet基于哈希表实现,无序且快速,适合查找;TreeSet基于红黑树实现,有序且支持排序,适合有序集合操作。

HashSetTreeSet是Java中Set接口的两个主要实现类,它们之间有以下区别:

  1. 底层数据结构
    • HashSet基于哈希表实现,使用哈希表存储元素,不保证元素的顺序,不允许有重复元素。
    • TreeSet基于红黑树实现,使用树结构存储元素,可以对元素进行排序,并且不允许有重复元素。
  2. 元素顺序
    • HashSet不维护元素的顺序,即元素在集合中的顺序是不确定的。
    • TreeSet维护元素的排序顺序,可以根据元素的自然顺序或者提供的比较器进行排序。因此,TreeSet中的元素是有序的。
  3. 性能
    • HashSet的基本操作(添加、删除、包含)具有常数时间的性能,即O(1)。
    • TreeSet的基本操作的性能取决于红黑树的高度,通常情况下,添加、删除、包含等操作的时间复杂度是O(log n),其中n是集合中的元素数量。
  4. 使用场景
    • 如果不需要元素的排序,只需简单地存储和检索元素,并且不关心元素的顺序,可以使用HashSet
    • 如果需要对元素进行排序,或者需要维护插入顺序,可以使用TreeSet。它适用于需要按照特定顺序遍历元素的场景。

综上所述,选择HashSet还是TreeSet取决于您的需求,如果需要元素的排序或者需要维护插入顺序,可以选择TreeSet;如果只需要简单的存储和检索元素,并且不关心元素的顺序,可以选择HashSet

List的用法

List是Java集合框架中的一个接口,它表示有序的集合,可以包含重复元素。List接口继承自Collection接口,它提供了按照索引访问元素的功能。

List接口的主要方法
  1. int size():返回列表中的元素数量。
  2. boolean isEmpty():如果列表中没有元素,则返回true;否则返回false。
  3. boolean contains(Object o):如果列表包含指定的元素,则返回true。
  4. boolean add(E e):将指定的元素添加到列表的末尾。如果列表因为添加元素而发生改变,则返回true。
  5. boolean remove(Object o):从列表中移除指定的元素。如果列表包含了该元素,则返回true。
  6. E get(int index):返回列表中指定位置的元素。
  7. E set(int index, E element):用指定的元素替换列表中指定位置的元素,并返回原始元素。
  8. void add(int index, E element):在列表的指定位置插入指定的元素。
  9. E remove(int index):移除列表中指定位置的元素,并返回该元素。
  10. int indexOf(Object o):返回列表中第一次出现指定元素的索引,如果列表不包含该元素,则返回-1。
  11. int lastIndexOf(Object o):返回列表中最后一次出现指定元素的索引,如果列表不包含该元素,则返回-1。
  12. void clear():移除列表中的所有元素。
  13. List subList(int fromIndex, int toIndex):返回列表中指定范围的视图。
List接口的主要实现类
  1. ArrayList:基于动态数组实现的List,它允许快速随机访问元素。当需要频繁地访问列表中的元素,而不涉及插入和删除操作时,通常使用ArrayList。由于它是基于数组实现的,因此在随机访问时具有较好的性能。但是,插入和删除操作可能会导致元素的移动,因此在大量插入和删除操作时性能可能会受到影响。
  2. LinkedList:基于双向链表实现的List,它允许高效地在列表的任意位置进行插入和删除操作。当需要频繁地执行插入和删除操作时,通常使用LinkedList。由于它是基于链表实现的,因此在插入和删除操作时具有较好的性能。但是,随机访问时的性能可能不如ArrayList,因为需要遍历链表来找到指定位置的元素。
ArrayList()常用方法

ArrayList是Java中List接口的一个主要实现类,它基于动态数组实现,提供了一系列常用的方法来操作列表中的元素。以下是ArrayList常用的方法:

  1. add(E e):将指定的元素追加到列表的末尾。
  2. add(int index, E element):将指定的元素插入到列表的指定位置。
  3. remove(int index):移除列表中指定位置的元素。
  4. remove(Object o):移除列表中第一个出现的指定元素。
  5. get(int index):返回列表中指定位置的元素。
  6. set(int index, E element):将列表中指定位置的元素替换为指定的元素。
  7. size():返回列表中的元素数量。
  8. isEmpty():如果列表中没有元素,则返回true;否则返回false。
  9. clear():移除列表中的所有元素。
  10. contains(Object o):如果列表包含指定的元素,则返回true。
  11. indexOf(Object o):返回列表中第一次出现指定元素的索引,如果列表不包含该元素,则返回-1。
  12. lastIndexOf(Object o):返回列表中最后一次出现指定元素的索引,如果列表不包含该元素,则返回-1。
  13. toArray():返回包含列表中所有元素的数组。
  14. addAll(Collection<? extends E> c):将指定集合中的所有元素追加到列表的末尾。
  15. addAll(int index, Collection<? extends E> c):将指定集合中的所有元素插入到列表的指定位置。

这些方法提供了对ArrayList中元素进行添加、移除、获取、替换、查询等操作的支持,是使用ArrayList时常用的方法。

LinkedList()常用方法

LinkedList是Java中List接口的另一个主要实现类,它基于双向链表实现。以下是LinkedList常用的方法:

  1. add(E e):将指定的元素追加到列表的末尾。
  2. add(int index, E element):将指定的元素插入到列表的指定位置。
  3. remove(int index):移除列表中指定位置的元素。
  4. remove(Object o):移除列表中第一个出现的指定元素。
  5. get(int index):返回列表中指定位置的元素。
  6. set(int index, E element):将列表中指定位置的元素替换为指定的元素。
  7. size():返回列表中的元素数量。
  8. isEmpty():如果列表中没有元素,则返回true;否则返回false。
  9. clear():移除列表中的所有元素。
  10. contains(Object o):如果列表包含指定的元素,则返回true。
  11. indexOf(Object o):返回列表中第一次出现指定元素的索引,如果列表不包含该元素,则返回-1。
  12. lastIndexOf(Object o):返回列表中最后一次出现指定元素的索引,如果列表不包含该元素,则返回-1。
  13. toArray():返回包含列表中所有元素的数组。
  14. addAll(Collection<? extends E> c):将指定集合中的所有元素追加到列表的末尾。
  15. addAll(int index, Collection<? extends E> c):将指定集合中的所有元素插入到列表的指定位置。
  16. addFirst(E e):将指定元素插入到列表的开头。
  17. addLast(E e):将指定元素追加到列表的末尾。
  18. removeFirst():移除并返回列表的第一个元素。
  19. removeLast():移除并返回列表的最后一个元素。
  20. getFirst():返回列表的第一个元素。
  21. getLast():返回列表的最后一个元素。
  22. peek():检查列表的第一个元素,但不移除它。
  23. peekFirst():检查列表的第一个元素,但不移除它。
  24. peekLast():检查列表的最后一个元素,但不移除它。
  25. poll():移除并返回列表的第一个元素,如果列表为空则返回null。
  26. pollFirst():移除并返回列表的第一个元素,如果列表为空则返回null。
  27. pollLast():移除并返回列表的最后一个元素,如果列表为空则返回null。

这些方法提供了对LinkedList中元素进行添加、移除、获取、替换、查询等操作的支持,是使用LinkedList时常用的方法。另外,LinkedList还提供了一些与双向链表特性相关的方法,例如在链表的开头或末尾进行添加和移除操作。

ArrayList和LinkedList区别

ArrayList基于数组实现,适合随机访问;LinkedList基于链表实现,适合频繁插入和删除。

  1. 底层数据结构
    • ArrayList基于动态数组实现,内部使用数组来存储元素。因此,它支持随机访问,可以通过索引快速访问元素。
    • LinkedList基于双向链表实现,内部使用链表来存储元素。因此,它不支持随机访问,访问元素时需要从头或尾部开始遍历链表。
  2. 插入和删除操作的性能
    • ArrayList中,插入和删除元素的性能取决于元素移动的数量。如果插入或删除元素位置之后的元素需要移动,则性能较低。平均情况下,插入和删除的时间复杂度是O(n)。
    • LinkedList中,插入和删除元素的性能不受影响,因为只需要修改相邻节点的指针即可。在链表的头部和尾部进行插入和删除操作的性能是常数时间的,即O(1);在中间位置进行插入和删除操作的性能取决于元素的位置,平均情况下为O(n/2),即O(n)。
  3. 随机访问的性能
    • ArrayList中,由于支持随机访问,可以通过索引快速访问元素,其时间复杂度为O(1)。
    • LinkedList中,由于不支持随机访问,访问元素时需要从头或尾部开始遍历链表,其时间复杂度取决于元素的位置,平均情况下为O(n/2),即O(n)。
  4. 空间占用
    • ArrayList的空间利用率较高,因为它只在需要时扩展内部数组的大小,并且不会浪费额外的空间。
    • LinkedList的空间占用较高,因为除了存储元素本身外,还需要额外的空间来存储节点之间的指针。
  5. 适用场景
    • 如果需要频繁地进行随机访问,可以选择ArrayList
    • 如果需要频繁地进行插入和删除操作,尤其是在集合的头部和尾部进行操作,可以选择LinkedList

综上所述,选择ArrayList还是LinkedList取决于您的需求,如果需要频繁地进行随机访问,可以选择ArrayList;如果需要频繁地进行插入和删除操作,尤其是在集合的头部和尾部进行操作,可以选择LinkedList

Map的用法

Map是一种集合类型,它表示一组键值对的映射关系。Map接口中的键和值都是对象,键是唯一的,但值可以重复。 Map没有继承于Collection接口从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

Map接口的主要方法
  1. put(key, value):添加键值对到Map中。
  2. get(key):获取指定键对应的值。
  3. remove(key):移除指定键对应的键值对。
  4. containsKey(key):判断Map中是否包含指定的键。
  5. containsValue(value):判断Map中是否包含指定的值。
  6. keySet():获取Map中所有键的集合。
  7. values():获取Map中所有值的集合。
  8. entrySet():获取Map中所有键值对的集合。
  9. 遍历键值对:使用增强for循环或迭代器遍历Map中的键值对。
Map接口的主要实现类
  1. HashMap:基于哈希表实现的Map,不保证元素的顺序,不允许有重复键。
  2. TreeMap:基于红黑树实现的有序Map,元素按照键的自然顺序或者指定的比较器进行排序。
  3. LinkedHashMap:基于哈希表和链表实现的Map,维护了元素的插入顺序或者访问顺序。
  4. Hashtable:早期的哈希表实现的Map,线程安全但性能相对较低,已被ConcurrentHashMap取代。
  5. ConcurrentHashMap:并发环境下线程安全的哈希表实现的Map,提供了高并发性能
HashMap()常用方法
  1. put(K key, V value):将指定的键值对添加到HashMap中。
  2. get(Object key):返回指定键所映射的值,如果该键不存在,则返回null。
  3. remove(Object key):从HashMap中移除指定键及其对应的值。
  4. containsKey(Object key):判断HashMap中是否包含指定的键。
  5. containsValue(Object value):判断HashMap中是否包含指定的值。
  6. size():返回HashMap中键值对的数量。
  7. isEmpty():判断HashMap是否为空,如果HashMap中没有键值对,则返回true。
  8. clear():移除HashMap中的所有键值对。
  9. keySet():返回一个包含HashMap中所有键的Set集合。
  10. values():返回一个包含HashMap中所有值的Collection集合。
  11. entrySet():返回一个包含HashMap中所有键值对的Set集合,每个元素都是Map.Entry对象。

这些方法能够实现对HashMap中键值对的添加、获取、移除、判断、遍历等操作。

TreeMap()常用方法
  1. put(K key, V value):将指定的键值对添加到TreeMap中。
  2. get(Object key):返回指定键所映射的值,如果该键不存在,则返回null。
  3. remove(Object key):从TreeMap中移除指定键及其对应的值。
  4. containsKey(Object key):判断TreeMap中是否包含指定的键。
  5. containsValue(Object value):判断TreeMap中是否包含指定的值。
  6. size():返回TreeMap中键值对的数量。
  7. isEmpty():判断TreeMap是否为空,如果TreeMap中没有键值对,则返回true。
  8. clear():移除TreeMap中的所有键值对。
  9. firstKey():返回TreeMap中的第一个(最小)键。
  10. lastKey():返回TreeMap中的最后一个(最大)键。
  11. lowerKey(K key):返回小于指定键的最大键,如果不存在,则返回null。
  12. higherKey(K key):返回大于指定键的最小键,如果不存在,则返回null。
  13. floorKey(K key):返回小于等于指定键的最大键,如果不存在,则返回null。
  14. ceilingKey(K key):返回大于等于指定键的最小键,如果不存在,则返回null。
  15. keySet():返回一个包含TreeMap中所有键的Set集合。
  16. values():返回一个包含TreeMap中所有值的Collection集合。
  17. entrySet():返回一个包含TreeMap中所有键值对的Set集合,每个元素都是Map.Entry对象。

这些方法能够实现对TreeMap中键值对的添加、获取、移除、判断、遍历等操作,以及获取最小键、最大键、小于指定键的最大键、大于指定键的最小键等操作。

HashMap和TreeMap区别
  1. 底层数据结构
    • HashMap:基于哈希表实现,使用数组和链表/红黑树组合实现,不保证元素的顺序。
    • TreeMap:基于红黑树实现,保持元素的排序顺序。
  2. 元素顺序
    • HashMap:不保证元素的顺序,因为其内部结构是无序的。
    • TreeMap:元素按照键的自然顺序或者指定的比较器进行排序,保持有序性。
  3. 性能
    • HashMap:基本操作的时间复杂度为O(1),但在极端情况下可能达到O(n)。
    • TreeMap:基本操作的时间复杂度为O(log n),具有更稳定的性能。
  4. 适用场景
    • HashMap:适用于需要快速添加、查找、删除键值对,并且不关心元素顺序的场景。
    • TreeMap:适用于需要对元素进行排序,并且需要有序遍历元素的场景。

综上所述,选择HashMap还是TreeMap取决于需求。如果不需要元素的排序,并且需要快速的增删改查操作,可以选择HashMap;如果需要元素有序,并且需要有序遍历元素,可以选择TreeMap。

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

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

相关文章

Linux netstat命令教程:网络统计工具(附实例详解和注意事项)

Linux netstat命令介绍 netstat&#xff08;网络统计&#xff09;是一个在Linux中用于显示网络相关信息并诊断各种网络问题的命令。它可以显示你的计算机正在进行的连接、发送信息的路径&#xff0c;甚至一些技术细节&#xff0c;如正在发送或接收的数据包的数量。 Linux net…

速盾:CDN是怎么防止ddos攻击的?

CDN&#xff08;内容分发网络&#xff09;是一种用于提高网站性能和安全性的重要技术。它通过在全球多个位置分布节点来存储和分发网站内容&#xff0c;以减少用户访问网站时的延迟并提高网站的可用性。除了提供高质量的内容分发&#xff0c;CDN还能有效地防止DDoS攻击。 DDoS…

Frida 远程RPC 调用进阶

引言: 今天讲下Frida 远程RPC 调用,为什么要用它,方便快捷。 安卓IOS 简单适用,代码量少很多,比Xposed。 1,安卓调用: 安卓调用,一般我们使用usb,模拟器的话直接用adb 命令去直连都可以,但是我这里叫一个稳定的方法,使用wifi adb ,比较靠谱,设置模拟器的ip,然…

点亮一颗 LED: 单片机 ch32v003 (RISC-V) 使用 rust 编写固件

首发日期 2024-04-09, 以下为原文内容: 使用 rust 编写单片机的程序 ? 很新, 但没问题. 使用 RISC-V CPU 的单片机 (比如 ch32v003) ? 也没问题. 同时使用 ? 哦嚯, 问题出现了 !! ch32v003 是一款使用 rv32ec 指令集的国产单片机, 很便宜 (某宝零卖只要 0.4 元一个, 在同档…

简单了解JVM

一.JVM简介 jvm及Java virtual machineJava虚拟机&#xff0c;它是一个虚构出来的计算机&#xff0c;一种规范。其实抛开这么专业的句子不说&#xff0c;就知道 JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互&#…

Handler——小白能懂的原理,老鸟需要的面经

1.机制学习 1.1Handler定义 发送并处理 与线程的消息队列关联的Message和Runnable 1.2基本用法 1、Message.obtain() 从消息池取得Message 2、Handler().sendMessage(msg) 发送消息 3、Handler().post 将Runnable包装成Message发送 以下提供一个结构代码 import android.os.H…

VMware导出虚拟机vmkd格式转换qcow2

VMware虚拟机导出qcow2格式可以上传至云服务 1、需要导出的虚拟机 2、克隆虚拟机 3、选择克隆源 4、创建完整克隆 5、完成 6、找到VMware安装路径 7、找到vmware-vdiskmanager所在路径使用cmd或Windows PowerShell进入目录 进入vmware-vdiskmanager目录 cd F:\软件\VMware Wo…

VRTK/SteamVR手柄震动功能

VRTK/SteamVR手柄震动功能 前言代码块 前言 手柄震动功能配合虚拟仿真模块的模拟电击等功能非常方便 代码块 SteamVR_Controller.DeviceRelation.Rightmost是右侧手柄 SteamVR_Controller.DeviceRelation.Leftmost是左侧手柄 var deviceIndex2 SteamVR_Controller.GetDevic…

debian安装和基本使用

debian安装和基本使用 文章目录 debian安装和基本使用1. 为什么选择debian2. 如何下载Debian2.1 小型安装镜像2.2 完整安装镜像 3. Debian操作系统安装3.1 创建Debian虚拟机3.2 安装操作系统 4. Debian系统的初始设置4.1 桌面环境的配置4.2 配置网络4.3 生效网络配置4.4 配置de…

阿药陪你学Java(第零讲)

第零讲&#xff1a;基本数据类型 Java包括两种数据类型&#xff0c;分别是内置数据类型&#xff08;基本数据类型&#xff09;和引用数据类型。 内置数据类型 Java提供了8中内置类型&#xff0c;其中包括4种数字整型、2种数字浮点型、1中字符型、1中布尔型。下面进行详细介绍…

Python防止打包后的exe重复执行

文章目录 一、前言二、实现方法三、代码四、执行结果五、相较于其他方式的优点一、前言 pyinstaller打包的exe如果被连续点击的话,会启动多个程序,对于复杂的程序来说,同时运行可能会造成严重的后果,因此需要一个程序锁,保证单次仅启动一个exe。 二、实现方法 利用 sqli…

React 快速入门:掌握前端开发的核心技能

React 快速入门&#xff1a;掌握前端开发的核心技能 一、React 简介1.1 React 的历史1.2 React 的概念1.3 React 的特点1.4 React 的官网地址 二、开发环境搭建三、React 基础3.1 JSX3.2 组件3.3 Props3.4 State3.5 props 和 state 的区别3.6 Hook 四、React 生命周期五、添加样…

golang context

作用&#xff1a;用于在go协程中 传递上下文、超时、取消、传值 底层实现&#xff1a;是由互斥锁、channel、map来实现的 互斥锁&#xff1a;保护临界资源 channel: 用于信号通知&#xff0c;比如ctx.Done() map: 保存父ctx下派生的所有子ctx, 父ctx关闭&#xff0c;子ctx都关…

Redis Pipelining 底层原理分析及实践

作者&#xff1a;vivo 互联网服务器团队-Wang Fei Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务。在遇到批处理命令执行时&#xff0c;Redis提供了Pipelining(管道)来提升批处理性能。本文结合实践分析了Spring Boot框架下Redis的Lettuce客户端和Redisson客户端对…

linux c多线程简单队列实现

编译环境&#xff1a;Ubuntu16.04 64位 交叉编译工具&#xff1a;arm-hisiv500-linux-gcc 文章目录 1. 背景2. 涉及的函数3. 头文件JList.h4. 类的实现 1. 背景 最近项目中需要用到多线程通信&#xff0c;自己造个轮子吧&#xff0c;对照上一篇linux c共享内存和信号量。 2. …

python如何学习数据分析

学习使用 Python 进行数据分析是一个循序渐进的过程&#xff0c;需要掌握基本的 Python 编程技能&#xff0c;并了解数据处理、数据可视化和常用的数据分析工具和库。以下是学习 Python 数据分析的步骤和建议&#xff1a; 1. 掌握 Python 编程基础 在开始学习数据分析之前&am…

Unity构建详解(7)——AssetBundle格式解析

【文件格式】 文件可以分为文本文件、图片文件、音频文件、视频文件等等&#xff0c;我们常见的这些文件都有行业内的标准格式&#xff0c;其意味着按照一定的规则和规范去保存读取文件&#xff0c;可以获取我们想要的数据。 有些软件会有自己的文件格式&#xff0c;会按照其…

神经网络和反向传播算法

1. 理解神经网络的基础 开始于感知器&#xff1a;首先理解感知器&#xff08;Perceptron&#xff09;模型&#xff0c;这是最简单的神经网络形式。感知器接收多个输入&#xff0c;通过加权和并应用激活函数来产生输出。这为理解更复杂的神经网络奠定了基础。多层网络&#xff…

风储微网虚拟惯性控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 风储微网虚拟惯性控制系统simulink建模与仿真。风储微网虚拟惯性控制系统是一种模仿传统同步发电机惯性特性的控制策略&#xff0c;它通过集成风力发电系统、储能系统和其他分…

rk3588 安卓13 应用安装白名单的接口

文章目录 概述一、app应用安装白名单核心代码二、app应用安装白名单核心功能分析三、代码实战1.先导入所需要的包2.添加获取白名单方法3.添加限制白名单方法4.上层使用PS:查看当前白名单 总结 概述 在13.0系统rom定制化开发中&#xff0c;客户需求要实现应用安装白名单功能&am…