第8章 java集合

Java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如队列等。除此之外,Java集合还可用于保存具有映射关系关联数组。Java集合大致可分为SetListQueueMap四种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合,Java5又增加了Queue体系集合,代表一种队列集合实现。

8.1 java集合概述

  • 集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。(所有的集合类都位于java.util包下,处理多线程环境下的并发安全问题,Java5还在java.util.concurrent包下提供了一些多线程支持的集合类。)
  • Java的集合类主要由两个接口派生而出:CollectionMap,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
  • Collection集合:
    在这里插入图片描述
  • Map保存的每项数据都是 key-value 对(根据key来获取数据)
    在这里插入图片描述

Set代表无序、不可重复的集合;
List代表有序、重复的集合;
Map则代表具有映射关系(key-value)的集合;
Queue体系集合,代表一种队列集合实现。

  • 常用的实现类:HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap、TreeMap 等。

8.2 Collection和Iterator接口

  • Collection接口定义的如下操作集合元素的方法:

boolean add(Object o):该方法用于向集合里添加一个元素。
boolean addAll(Collection c):该方法把集合c里的所有元素添加到指定集合里。
void clear()清除集合里的所有元素,将集合长度变为0。
boolean contains(Objecto):返回集合里是否包含指定元素。
boolean containsAll(Collection c):返回集合里是否包含集合c里的所有元素。
boolean isEmpty():返回集合是否为空
Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。
boolean remove(Object o)删除集合中的指定元素o,(当包含了一个或多个元素o时,只删除第一个)
boolean removeAll(Collection c):从集合中删除集合c里包含的所有元素(相当于用调用该方法的集合减集合c
boolean retainAll(Collection c):从集合中删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集
int size():该方法返回集合里元素的个数
Object[] toArray():该方法把集合转换成一个数组

8.2.1 使用Lambda表达式遍历集合

  • java 8 为Iterable接口新增了一个forEach(Consumer action) 默认方法(参数类型为函数式接口,因此可以使用Lambda表达式遍历集合元素)。
public class CollectionEach{public static void main(Stirng[] args){//创建一个集合Collection books = new HashSet();books.add("java讲义");books.add("c语言讲义");books.add("c++讲义");//调用forEach()方法遍历集合books.forEach(obj -> System.out.println("集合元素:" + obj));}
}

8.2.2 使用java 8 增强的Iterator遍历集合元素

  • Iterator主要用于遍历(迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。
  • Iterator接口里定义了4个方法:

boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回true。
Object next():返回集合里的下一个元素。
void remove():删除集合里上一次next方法返回的元素。
void forEachRemaining(Consumer action):该方法可使用Lambda表达式来遍历集合元素。(Java8为Iterator新增的默认方法)

public class IteratorTest{public static void main(String[] args){//创建集合、添加元素的代码与前一个程序相同...//获取books集合对应的迭代器Iterator it = books.iterator();while(it.hasNext()){//it.next()方法返回的数据类型为Object类型,需要强制转换String books = (String)it.next();System.out.println(book);if(book.equlas("java讲义")){//从集合中删除上一次next()方法返回的元素it.remove();}//对book变量赋值,不会改变集合元素本身book = "测试字符串";}System.out.println(books);}
}
  • Iterator仅用于遍历集合,Iterator本身并不提供盛装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。
  • 当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。
  • 迭代时Collection集合里的元素不能被改变,只有通过Iterator的 remove()方法删除上一次next()方法返回的集合元素才可以;否则将会引发java.util.Concurrent ModificationException异常。
  • Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程修改),程序立即引发异常。

8.2.3 使用Lambda表达式遍历Iterator

  • java 8 为Iterator新增了一个forEachRemaining(Consumer action) 方法(参数也是函数式接口)。程序会依次将集合元素传给Consumer的accept(T t) 方法。
Iterator it = books.iterator();
it.forEachRemaining(obj -> System.out.println("集合元素:" + obj));
  • Iterator的forEachRemaining()方法来遍历集合元素,参数是一个Lambda表达式(目标类型是Comsumer),因此上面代码也可用于遍历集合元素。

8.2.4 使用foreach循环遍历集合元素

for (Object obj : books){//此处的book变量也不是集合元素本身String book = (String) obj;System.out.println(book);
}
  • 使用foreach循环来迭代更加简洁。foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量,因此在foreach循环中修改迭代变量的值也没有任何实际意义
  • 同样,当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则将引发Concurrent ModificationException异常

8.2.5 使用java 8 新增的Predicate操作集合

java 8 为Collection集合新增了一个removeIf(Predicate filter)方法(批量删除符合filter条件的所有元素)。Predicate对象作为参数,也是函数式接口,可使用Lambda表达式。

//过滤条件:所有长度小于10的字符串元素都会被删除
books.removeIf(ele -> ((String)ele).length() < 10);

8.2.6 使用java 8 新增Stream操作集合

  • Java8还新增了Stream、IntStream、LongStream、DoubleStream等流式API,这些API代表多个支持串行和并行聚集操作的元素。上面4个接口中,Stream是一个通用的流接口,而IntStream、LongStream、DoubleStream则代表元素类型为int、long、double的流。
  • Java8还为上面每个流式API提供了对应的Builder,例如Stream.Builder、IntStream.Builder、LongStream.Builder、DoubleStream.Builder。
  • 独立使用Stream的步骤如下:
    ①使用StreamXxxStreambuilder()类方法创建该Stream对应的Builder。
    ②重复调用Builderadd()方法向该流中添加多个元素。
    ③调用Builderbuild()方法获取对应的Stream
    ④调用Stream的聚集方法
IntStream is = IntStream.builder().add(20).add(13).add(-2).add(18).build();//下面调用聚集方法的代码每次只能执行一行System.out.println("is")System.out.println("is 所有元素的最大值:"+is.max().getAsInt());System.out.println("is 所有元素的最小值:"+is.min().getAsInt());	System.out.println("is 所有元素的总和:"+is.sum());System.out.println("is 所有元素的总数:"+is.count());System.out.print1n("is所有元素的平均值:”+is.average());System.out.print1n("is所有元素的平方是否都大于20:"+is.allMatch(ele -> ele*ele > 20));System.out.println("is是否包含任何元素的平方大于20:"+is.anyMatch(ele -> ele*ele > 20));//将is映射成一个新 Stream,新Stream的每个元素是原Stream元素的2倍+1IntStream newIs = is.map(ele -> ele*2 + 1);//使用方法引用的方式来遍历集合元素newIs.forEach(System.out :: println);
  • 中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。上面程序中的map()方法就是中间方法。中间方法的返回值是另外一个流。
  • 末端方法:末端方法是对流的最终操作。当对某个Stream执行末端方法后,该流将会被“消耗”且不再可用。上面程序中的sum()、count()、average()等方法都是末端法。
  • 两个特征:
    有状态的方法:这种方法会给流增加一些新的属性,比如元素的唯一性、元素的最大数量、保证元素以排序的方式被处理等。有状态的方法往往需要更大的性能开销
    短路方法:短路方法可以尽早结束对流的操作,不必检查所有的元素。
  • Stream常用的中间方法:

filter(Predicate predicate):过滤Stream中所有不符合predicate的元素。
mapToXxx(ToXxxFunction mapper):使用ToXxxFunction对流中的元素执行一对一的转换,该方法返回的新流中包含了ToXxxFunction转换生成的所有元素。
peek(Consumer action):依次对每个元素执行一些操作,该方法返回的流与原有流包含相同的元素。该方法主要用于调试
distinct():该方法用于排序流中所有重复的元素(判断元素重复的标准是使用equals()比较返回true)。这是一个有状态的方法。
sorted():该方法用于保证流中的元素在后续的访问中处于有序状态。这是一个有状态的方法。
limit(long maxSize):该方法用于保证对该流的后续访问中最大允许访问的元素个数。这是一个有状态的、短路方法。

  • Stream常用的末端方法:

forEach(Consumer action)遍历流中所有元素,对每个元素执行action。
toArray():将流中所有元素转换为一个数组
reduce():该方法有三个重载的版本,都用于通过某种操作来合并流中的元素。
min():返回流中所有元素的最小值
max():返回流中所有元素的最大值
count():返回流中所有元素的数量
anyMatch(Predicate predicate):判断流中是否至少包含一个元素符合Predicate条件。
allMatch(Predicate predicate):判断流中是否每个元素都符合Predicate条件。
noneMatch(Predicate predicate):判断流中是否所有元素都不符合Predicate条件。
findFirst():返回流中的第一个元素
findAny():返回流中的任意一个元素

  • 除此之外,Collection接口提供了一个stream()默认方法,该方法可返回该集合对应的流,接下来即可通过流式API来操作集合元素。
//统计书名包含“java”子串的图书数量
books.stratm().filter( ele -> ((String)ele).contins("java") ).count();
  • 程序只要调用Collectionstream()方法即可返回该集合对应的Stream,接下来就可通过Stream提供的方法对所有集合元素进行处理,这样大大地简化了集合编程的代码,这也是Stream编程带来的优势。

8.3 Set集合

Set集合由Set接口和Set接口的实现类组成,Set接口继承了Collection接口,因此包含了Collection接口的所有方法。(Set不允许包含重复元素)
后面介绍的HashSet、TreeSet、EnumSet三个实现类

8.3.1 HashSet类

  • HashSet是Set接口的典型实现,按Hash算法存储集合中的元素,存取查找性能。
  • HashSet具有以下特点:不能保证元素的排列顺序,顺序不同不是同步的;集合元素值可以是null
  • 向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。(如果两个元素equals()方法比较true,但hashCode()方法返回值不相等,HashSet将会把它们存储在不同的位置,依然可以添加成功。)
  • 把某个类的对象保存到HashSet集合中,重写这个类的equals()方法和hashCode()方法时,应该尽量保证两个对象通过equals()方法比较返回true时,它们的hashCode()方法返回值也相等
  • HashSet中如果有多个元素的hashCode值相同,但它们通过equals()方法比较返回false,就需要在一个“桶”里放多个元素(链式结构保存),这样会导致性能下降
HashSet hs = new HashSet();
  • 重写hashCode()方法的基本规则:

程序运行中,同一个对象多次调用hashCode()方法应该返回相同的值
两个对象通过equals()方法比较返回true时,两个的hashCode()方法应返回相等的值
对象中用作equals()方法比较标准的实例变量,都应该用于计算hashCode值

  • 重写hashCode()方法的一般步骤:
    (1)计算出一个int类型的hashCode值;(2)用计算出来的对个hashCode值组合计算出一个hashCode值返回;
  • 当程序把可变对象添加到HashSet中之后,尽量不要去修改该集合元素中参与计算hashCode()、equals()实例变量,否则将会导致HashSet无法正确操作这些集合元素。

8.3.2 LinkedHashSet类

  • LinkedHashSet是HashSet的一个子类。使用链表维护元素的次序;遍历时按元素的添加顺序来访问集合里的元素;性能略低于HashSet(因为链表维护内部顺序)。
LinkedHashSet books = new LinkedHashSet();
  • LinkedHashSet依然是HashSet,依然不允许集合元素重复。

8.3.3 TreeSet类

  • TreeSet是SortedSet接口的实现类,可以确保集合元素处于排序状态
  • TreeSet提供几个额外的方法:

Comparator comparator():如果TreeSet采用了定制排序,则该方法返回定制排序所使用的Comparator;如果TreeSet采用了自然排序,则返回null。
Object first():返回集合中的第一个元素
Object last():返回集合中的最后一个元素
Object lower(Objecte):返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是TreeSet集合里的元素)。
Object higher(Object e):返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,参考元素不需要是TreeSet集合里的元素)。
SortedSet subSet(Object fromElement,Object toElement):返回此Set的子集合范围从fromElement(包含)到toElement(不包含)。
SortedSet headSet(Object toElement):返回此Set的子集,由小于toElement的元素组成。
SortedSet tailSet(Object fromElement):返回此Set的子集,由大于或等于fromElement的元素组成。

  • TreeSet采用红黑树的数据结构来存储集合元素。

(1)自然排序

  • 自然排序:TreeSet回调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,按照升序排列。
  • 其他实现了Comparable接口的常用类:

BigDecimal、BigInteger以及所有的数值型对应的包装类:按它们对应的数值大小进行比较。
Character:按字符的UNICODE值进行比较。
Boolean:true对应的包装类实例大于false对应的包装类实例。
String:按字符串中字符的UNICODE值进行比较。
Date、Time:后面的时间、日期比前面的时间、日期大。

Treeset ts = new TreeSet();
  • 如果把一个对象添加到TreeSet,则该对象的类必须实现Comparable接口,否则程序将会抛出异常。
  • 大部分类在实现compare To(Object obj)方法时,都需要将被比较对象obj强制类型转换成相同类型,因为只有相同类的两个实例才会比较大小。
  • 向TreeSet中添加的应该是同一个类的对象,否则也会引发ClassCastException异常。
  • 当把一个对象加入TreeSet集合中时,TreeSet 调用该对象的compareTo(Object obj)方法与容器中的其他对象比较大小,然后根据红黑树结构找到它的存储位置。(如果两个对象通过compare To(Object obj)方法比较相等,新对象将无法添加到TreeSet集合中。)
  • 判断两个对象是否相等唯一标准是:两个对象通过compare To(Object obj)方法,返回0,TreeSet则会认为它们相等;否则就认为它们不相等。
  • 重写该对象对应类应保证有一致的结果,规则:如果两个对象通过equals()方法比较返回true时,这两个对象通过compare To(Object obj)方法比较应返回0
  • 向TreeSet中添加一个可变对象,并且后面程序修改了该可变对象的实例变量,将导致它与其他对象的大小顺序发生了改变,但TreeSet不会再次调整它们的顺序。(甚至可能导致保存的这两个对象通过compare To(Object obj)方法比较返回0。)
  • 推荐不要修改放入HashSet和TreeSet集合中元素的关键实例变量

(2)定制排序

  • 通过Comparator接口的帮助(接口里包含一个int compare(T o1, T o2)方法)。
  • 如果需要实现定制排序:则需要在创建TreeSet 集合对象时,提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。由于Comparator是一个函数式接口,因此可使用Lambda表达式来代替Comparator对象。
TreeSet ts = new TreeSet( (o1, o2) -> {M m1 = (M)o1;M m2 = (M)o2;//根据M对象的age属性决定大小:age越大,M对象反而越小return m1.age > m2.age ? -1 : m1.age < m2.age ? 1 : 0;
});
  • 依然不可以向TreeSet中添加类型不同的对象,否则引发异常。
  • TreeSet判断两个集合元素相等的标准是:通过Comparator(或Lambda表达式)比较两个元素返回了0,这样TreeSet不会把第二个元素添加到集合中。

8.3.4 EnumSet类

  • EnumSet是一个专为枚举类设计的集合类,所有元素都必须是指定枚举类型的枚举值(创建时显式或隐式的指定),也是有序的。
  • 内部以位向量的形式存储,占用内存很小,运行效率很好,尤其批量操作。
  • EnumSet集合不允许加入null元素,将会抛出异常。
EnumSet es = EnumSet.allOf(Season.class);
  • EnumSet没有暴露任何构造器,应该通过它提供的类方法来创建EnumSet对象:

EnumSet allOf(Class elementType):包含指定枚举类所有枚举值的EnumSet集合。
EnumSet complementOf(EnumSet s):其元素类型指定EnumSet里元素类型相同的EnumSet集合,新EnumSet集合包含原EnumSet集合所不包含的、此枚举类剩下的枚举值(即新EnumSet集合和原EnumSet集合的集合元素加起来就是该枚举类的所有枚举值)。
EnumSet copyOf(Collection c):使用一个普通集合来创建EnumSet集合。
EnumSet copyOf(EnumSet s):与指定EnumSet具有相同元素类型、相同集合元素的EnumSet集合。
EnumSet noneOf(Class elementType):元素类型为指定枚举类型EnumSet。
EnumSet of(E first,E...rest):包含一个多个枚举值的EnumSet集合,传入的多个枚举值必须属于同一个枚举类
EnumSet range(E from,E to):创建一个包含从from枚举值到to枚举值范围内所有枚举值的EnumSet集合。

  • 还可以复制另外一个EnumSet集合或者Collection集合中的所有元素来创建新的EnumSet集合。(赋值Collection集合时,要求Collection集合的所有元素必须是同一个枚举类的枚举值)

8.3.5 各Set实现类的性能分析

  • HashSet和TreeSet是Set的两个典型实现,HashSet性能总是比TreeSet好(TreeSet红黑树算法额外维护)。
  • 只有需要保持排序的Set时,才应该使用TreeSet
  • HashSet有一个子类:LinkedHashSet插入删除比HashSet略慢,由于链表额外维护;但以为链表,遍历会更快。
  • EnumSet是所有Set实现类中性能最好的,但只能保存同一个枚举类的枚举值作为集合元素。
  • Set的三个实现类HashSet、TreeSet、EnumSet都是线程不安全的。(若多个线程访问,需通过Collections工具类的synchronizeedSortedSet方法来“包装”该Set集合,最好在创建时进行)

8.4 List集合

List集合代表一个元素有序可重复的集合,都有其对应的顺序索引。默认按元素的添加顺序设置元素的索引。

8.4.1 java 8 改进的List接口和ListIterator接口

  • List作为Collection接口的子接口,可以使用Collection接口里的方法。
List books = new ArrayList();
  • List是有序集合,所以增加了一些根据索引来操作集合元素的方法:

void add(int index,Object element):将元素 element 插入到List集合的index处
boolean addAll(int index,Collection c):将集合c所包含的所有元素都插入到List集合的index处
Object get(int index):返回集合index索引处的元素。
int indexOf(Object o):返回对象o在List集合中第一次出现的位置索引。
int lastIndexOf(Object o):返回对象o在List集合中最后一次出现的位置索引。
Object remove(int index)删除并返回index索引处的元素。
Object set(int index,Object element):将index索引处的元素替换element对象,返回被替换的旧元素。
List subList(int fromlndex,int tolndex):返回从索引fromIndex(包含)到索引tolndex(不包含)

  • 所有的List实现类都可以调用这些方法来操作集合元素。
  • List增加了根据索引来插入替换删除集合元素的方法。
    新增的两个默认方法:

void replaceAll(UnaryOperator operator):根据operator指定的计算规则重新设置List集合的所有元素。
void sort(Comparator c):根据Comparator参数对List集合的元素排序

  • List判断两个对象相等:通过equals()方法比较返回true即可。
  • 当调用List的set(int index,Object element)方法来改变List集合指定索引处的元素时,指定的索引必须是List集合的有效索引。即set(int index,Object element)方法不会改变List集合的长度
  • 与Set只提供了一个iterator()方法不同,List还额外提供了一个listIerator()方法,该方法返回一个Listlterator对象,Listlterator接口继承了Iterator接口,提供了专门操作List的方法。
  • Listlterator接口在Iterator 接口基础上增加了如下方法:

boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素
Object previous():返回该迭代器的上一个元素
void add(Object o):在指定位置插入一个元素

8.4.2 ArrayList和Vector实现类

  • ArrayList和Vector作为List类的两个典型实现,完全支持前面的List接口的全部功能。
  • ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的、允许再分配的Object[ ]数组。ArrayList或Vector对象使用initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组的长度时,它们的initialCapacity会自动增加
  • 添加大量元素时,可使用ensureCapacity(int minCapaticy)方法一次性增加。
  • 可以在创建时就指定initialCapacity的大小(若空或不指定,数组默认长度为10)
  • ArrayList和Vector还提供了如下两个方法来重新分配Object[ ]数组

void ensureCapacity(int minCapacity):将ArrayList 或Vector集合的Object[]数组长度增加大于或等于minCapacity值。
void trimToSize():调整ArrayList 或Vector集合的Object[]数组长度为当前元素的个数。可减少占用的存储空间。

  • ArrayList和Vector在用法上几乎完全一样,但Vector是个古老的集合,有很多缺点,尽量少用。
  • ArrayList是线程不安全的,Vector线程安全(也不推荐用)。
  • Vector还提供一个stack子类,用于模拟“栈”,“后进先出(LIFO)”。

Object peek():返回“栈”的第一个元素,但并不将该元素“pop”出栈
Object pop():返回“栈”的第一个元素,并将该元素“pop”出栈
void push(Object item):将一个元素“push”进栈,最后一个进“栈”的元素总是位于“栈”顶。

也是比较古老,尽量少用,推荐使用ArrayDeque后面讲。

8.4.3 固定长度的List

  • Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加删除该集合里的元素。

8.5 Queue集合

Queue用于模拟队列这种数据结构,“先进先出FIFO”。Queue接口中定义了几个方法:

void add(Objecte):将指定元素加入此队列的尾部
Object (element):获取队列头部的元素,但是不删除该元素。
boolean offer(Objecte):将指定元素加入此队列的尾部。当使用有容量限制的队列时,此方法通常比add(Objecte)方法更好。
Object peek():获取队列头部的元素,但是不删除该元素。如果此队列为空,则返回null。
Object poll():获取队列头部的元素,并删除该元素。如果此队列为空,则返回null。
Object remove():获取队列头部的元素,并删除该元素。

8.5.1 PriorityQueue实习类

  • PriorityQueue是一个比较标准的队列实现类。(保存队列元素的顺序并不是加入队列的顺序,而是按队列元素的大小进行重新排序)
  • PriorityQueue已经违反了队列的最基本规则:先进先出(FIFO)。
PriorityQueue pq = new PriorityQueue();
  • PriorityQueue不允许插入null元素,还要对队列进行排序(两种排序方式,自然排序、定制排序,同TreeSet参考8.3.3节)。

8.5.2 Deque接口与ArrayDeque实现类

  • Deque接口是Queue接口的子接口,代表一个双端队列
  • Deque接口的一些方法:

void addFirst(Objecte):将指定元素插入该双端队列的开头
void addLast(Objecte):将指定元素插入该双端队列的末尾
Iterator descendinglterator():返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。
Object getFirst()获取不删除双端队列的第一个元素
Object getLast()获取不删除双端队列的最后一个元素
boolean offerFirst(Object e):将指定元素插入该双端队列的开头
boolean offerLast(Objecte):将指定元素插入该双端队列的末尾
Object peekFirst()获取不删除该双端队列的第一个元素;如果此双端队列为空,则返回null。
Object peekLast()获取不删除该双端队列的最后一个元素;如果此双端队列为空,则返回null。
Object pollFirst()获取删除该双端队列的第一个元素;如果此双端队列为空,则返回null。
Object pollLast()获取删除该双端队列的最后一个元素;如果此双端队列为空,则返回null。
Object pop()(**栈方法**)pop出该双端队列所表示的栈的栈顶元素。相当于removeFirst()。
void push(Object e)(**栈方法**):将一个元素push进该双端队列所表示的栈的栈顶。相当于addFirst(e)。
Object removeFirst()获取删除该双端队列的第一个元素
Object removeFirstOccurrence(Object o)删除该双端队列的第一次出现的元素o
Object removeLast()获取删除该双端队列的最后一个元素
boolean removeLastOccurrence(Object o)删除该双端队列的最后一次出现的元素o

  • Deque 不仅可以当成双端队列,也可以当成
ArrayDeque stack = new ArrayDeque();//当成“栈”
ArrayDeque queue = new ArrayDeque();//当成“队列”
  • ArrayDeque:Deque接口提供的一个典型的实现类。(基于数组实现的双端队列,可以指定Object[]数组的长度,若不指定长度为16)。
  • ArrayList和ArrayDeque两个集合类的实现机制基本相似(底层都采用一个动态的、可重分配的Object[]数组来存储集合元素,超出系统重新分配)。
  • ArrayDeque当成“栈”(推荐使用ArrayDeque当栈,避免使用Stack古老)
    在这里插入图片描述
public class ArrayDequeStack{public static void main(String[] args){ArrayDeque stack = new ArrayDeque();//依次将三个元素push“入栈”stack.push("疯狂Java讲义");stack.push("轻量级Java EE企业应用实战");stack.push("疯狂Android讲义");//输出:[疯狂Android讲义,轻量级Java EE企业应用实战,疯狂Java讲义]System.out.println(stack);//访问第一个元素,但并不将其pop出“栈”,输出:疯狂Android讲义System.out.println(stack.peek());//依然输出:[疯狂Android 讲义,疯狂Java讲义,轻量级Java EE企业应用实战]System.out.println(stack);//pop出第一个元素,输出:疯狂Android 讲义System.out.println(stack.pop());//输出:[轻量级Java EE企业应用实战,疯狂Java讲义]System.out.println(stack);}
}
  • ArrayDeque当成“队列”
    在这里插入图片描述
public class ArrayDequeQueue{public static void main(String[] args){ArrayDeque queue = new ArrayDeque();//依次将三个元素“入队”queue.offer("疯狂Java讲义");queue.offer("轻量级Java EE企业应用实战");queue.offer("疯狂Android讲义");//输出:[疯狂Java讲义,轻量级JavaEE企业应用实战,疯狂Android讲义]System.out.println(queue);//访问队列头部的元素,但并不将其po11出队列“栈”,输出:疯狂Java讲义System.out.println(queue.peek());//依然输出:[疯狂Java 讲义,轻量级Java EE企业应用实战,疯狂Android讲义]System.out.println(queue);//po11出第一个元素,输出:疯狂Java讲义System.out.println(queue.poll());//输出:[轻量级Java EE企业应用实战,疯狂Android讲义]System.out.print1n(queue);}
}

8.5.3 LinkedList实现类

  • LinkedList类是List接口的实现类,意味着他是一个List集合,可以根据索引来随机访问集合中的元素。
  • LinkedList还实现了Deque接口,可以被当成双端队列来使用(可以当“栈”、“队列”)
  • 下面示范了LinkedList作为List集合双端队列的用法:
public class LinkedListTest{public static void main(String[] args){LinkedList books = new LinkedList();//将字符串加入队列的尾部books.offer("疯狂java讲义");//将一个字符串元素加入栈的顶部books.push("轻量级Java EE企业应用实战");//将字符串元素添加到队列的头部(相当于栈顶)books.offerFirst("疯狂Android讲义");//以List的方式(按索引)遍历集合元素for(int i = 0; i < books.size(); i++){System.out.println(books.get(i));}//访问不删除栈顶元素System.out.println(books.peekFirst());//访问不删除队列的最后一个元素System.out.println(books.peekLast());//栈顶元素弹出栈System.out.println(books.pop());//下面输出看到队列中第一个元素被删除System.out.println(books);//访问删除队列最后一个元素System.out.println(books.pollLast());//下面输出:"轻量级Java EE企业应用实战"System.out.println(books);}
}
  • ArrayListArrayDeque内部以数组的形式保存集合中的元素(随机访问性能好,比使用Iterator迭代器性能都好)
  • LinkedList内部以链表的形式保存集合中的元素(插入删除性能好)

8.5.4 各种线性表的性能分析

  • Java 提供的List 就是一个线性表接口,而ArrayList(基于数组的线性表)、LinkedList(基于链表的线性表)又是线性表的两种典型实现。Queue代表了队列Deque代表了双端队列(既可作为队列使用,也可作为使用)
  • 总体来说,ArrayList比LinkedList的性能要好,大部分时候建议使用ArrayList
  • 使用List集合建议:(1)遍历时,ArrayList、Vector集合,使用随机访问方法 get 遍历;LinkedList集合,使用迭代器(Iterator)遍历。(2)经常执行插入、删除操作来改变大量数据的List集合,建议使用LinkedList集合。(3)多个线程需要同时访问List集合中的元素,考虑使用Collections将集合包装成线程安全的集合。

8.6 java 8 增强的Map集合

  • Map具有映射关系的数据,保存两组值key 和value (key和value都可以是任何引用类型数据),key不允许重复。
  • key和value之间存在单向一对一关系。
  • Map里包含了一个keySet()方法,返回Map里所有key组成的Set集合。
  • Map提供了一个Entry内部类来封装key-value对,而计算Entry存储时则只考虑Entry封装的key。
  • 从Java源码来看,Java是先实现了Map,然后通过包装一个所有value都为null的Map就实现了Set集合
  • 如果把Map里所有的key放在一起看,它们就组成了一个Set集合(key没有顺序,不能重复)
  • 如果把Map里的所有value放在一起看,它们又非常类似于一个List(元素之间可以重复,根据索引来查找),只是Map中的索引不再是整数值,而是另一个对象。
  • 如果需要从Map中取出元素,需要该元素的key索引,因此,Map有时也被称为字典,或关联数组。
  • Map接口中定义的常用方法:

void clear()删除该Map对象中的所有key-value对
boolean containsKey(Object key):查询Map中是否包含指定的key,如果包含则返回true。
boolean containsValue(Object value):查询Map中是否包含一个或多个value,如果包含则返回true。
Set entrySet():返回Map中包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象。
Object get(Object key):返回指定key所对应的value;如果此Map中不包含该key,则返回null。
boolean isEmpty():查询该Map是否为空(即不包含任何key-value对),如果为空则返回true。
Set keySet():返回该Map中所有key组成的Set集合
Object put(Object key,Object value)添加一个key-value对,如果当前Map中已有一个与该key相等的key-value对,则新的key-value对会覆盖原来的key-value对。
void putAll(Map m):将指定Map中的key-value对复制到本Map中
Object remove(Object key)删除指定key所对应的key-value对,返回被删除key所关联的value,如果该key不存在,则返回null。
boolean remove(Object key,Object value):这是Java8新增的方法,删除指定key、value所对应的key-value对。如果从该Map中成功地删除该key-value对,该方法返回true,否则返回false。
int size():返回该Map里的key-value对的个数
Collection values():返回该Map里所有value组成的Collection

  • Map中包括一个内部类Entry,封装了一个key-value对。Entry包含如下三个方法:

Object getKey():返回该Entry里包含的key值
Object getValue():返回该Entry里包含的value值
Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。

8.6.1 java 8 为Map新增的方法

  • Java8除为Map增加了remove(Object key,Object value)默认方法之外,还增加了如下方法:

Object compute(Object key,BiFunction remappingFunction):该方法使用remappingFunction 根据原key-value 对计算一个新value。只要新value不为null,就使用新value覆盖原 value;如果原value不为null,但新value为null,则删除原key-value对;如果原value、新value同时为null,那么该方法不改变任何key-value对,直接返回null。
Object computelfAbsent(Object key,Function mappingFunction):如果传给该方法的key参数在Map中对应的value为null,则使用mappingFunction根据key计算一个新的结果,如果计算结果不为null,则用计算结果覆盖原有的value。如果原Map原来不包括该key,那么该方法可能会添加一组key-value对。
Object computelfPresent(Object key,BiFunction remappingFunction):如果传给该方法的key参数在Map中对应的value不为null,该方法将使用remappingFunction根据原key、value计算一个新的结果,如果计算结果不为null,则使用该结果覆盖原来的 value;如果计算结果为null,则删除原key-value对。
void forEach(BiConsumer action):该方法是Java8为Map新增的一个遍历key-value对的方法,通过该方法可以更简洁地遍历Map的key-value对。
Object getOrDefault(Object key,V defaultValue):获取指定key对应的value。如果该key不存在,则返回defaultValue。
Object merge(Object key,Object value,BiFunction remappingFunction):该方法会先根据key参数获取该Map中对应的value。如果获取的value为null,则直接用传入的value覆盖原有的value(在这种情况下,可能要添加一组key-value对);如果获取的value不为null,则使用remappingFunction函数根据原value、新value计算一个新的结果,并用得到的结果去覆盖原有的value。
Object putIfAbsent(Object key,Object value):该方法会自动检测指定key对应的value是否为null,如果该key对应的 value为null,该方法将会用新value代替原来的null值。
Object replace(Object key,Object value):将Map中指定key对应的value替换成新value。与传统putO方法不同的是,该方法不可能添加新的key-value对。如果尝试替换的key在原Map中不存在,该方法不会添加key-value对,而是返回null。
boolean replace(K key,V old Value,V newValue):将Map 中指定key-value对的原value替换成新value。如果在Map中找到指定的key-value对,则执行替换并返回true,否则返回false。
replaceAll(BiFunction function):该方法使用BiFunction对原key-value对执行计算,并将计算结果作为该key-value对的value值。

8.6.2 java 8 改进的HashMap和Hashtable实现类

  • HashMap 和Hashtable都是Map接口的典型实现类。Hashtable是一个古老的Map实现类(不推荐使用)。
Hashtable ht = new Hashtable();
HashMap ht = new HashMap();
  • Hashtable和HashMap有两点区别:(1)Hashtable是线程安全的,HashMap不是(但性能高一点);Hashtable不允许使用null作为key和value,将引发异常,HashMap可以。
  • 尽量少用Hashtable实现类,即使需要创建线程安全的Map实现类,可以通过后面介绍的Collections工具类把HashMap变成线程安全的。
  • 为了成功地在HashMap、Hashtable中存储、获取对象,用作key的对象必须实现hashCode()方法和equals()方法。
  • HashMap、Hashtable不能保证其中key-value对的顺序。
    (1)判断两个key相等的标准也是:两个key 通过equals()方法比较返回true,两个key的hashCode值也相等;
    (2)判断两个value相等的标准更简单:只要两个对象通过equals)方法比较返回true即可。
  • HashMap、Hashtable中还包含一个containsValue()方法,用于判断是否包含指定的value。
  • 使用自定义类作为key时,如果重写该类的equals(Object obj)和hashCode()方法,则应该保证两个方法的判断标准一致——当两个key 通过equals0方法比较返回true时,两个key的hashCode()返回值也应该相同。
  • 使用可变对象作为key,并且修改了作为key的可变对象,则可能出现:程序无法准确访问到Map中被修改过的key。(尽量不要使用可变对象,修改作为key的可变对象)

8.6.3 LinkedHashMap实现类

  • HashSet 有一个LinkedHashSet子类,HashMap也有一个LinkedHashMap子类;
LinkedHashMap lhm = new LinkedHashMap();
  • LinkedHashMap也使用双向链表来维护key-value对的次序(其实只需要考虑key的次序),迭代顺序与key-value对的插入顺序保持一致
  • LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能;但因为它以链表来维护内部顺序,所以在迭代访问Map里的全部元素时将有较好的性能

8.6.4 使用Properties读写属性文件

  • Properties类是Hashtable类的子类,可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件中,也可以把属性文件中的“属性名=属性值”
    加载到Map对象中。Properties里的key、value都是字符串类型
  • 提供三个方法来修改Properties里的key、value值:

String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map的get(Object key)方法。
String getProperty(String key,String defaultValue):该方法与前一个方法基本相似。该方法多一个功能,如果Properties中不存在指定的key时,则该方法指定默认值。
Object setProperty(String key,String value)设置属性值,类似于Hashtable的put)方法。

  • 还提供了两个读写属性文件的方法:

void load(InputStream inStream):从属性文件(以输入流表示)中加载key-value对,把加载到的key-value 对追加到Properties里(Properties是Hashtable的子类,它不保证key-value对之间的次序)。
void store(OutputStream out,String comments):将Properties中的key-value对输出到指定的属性文件(以输出流表示)中。

  • Properties可以把key-value对以XML文件的形式保存起来,也可以从XML文件中加载key-value对,用法与此类似,此处不再赘述。

8.6.5 SortedMap接口和TreeMap实现类

  • 正如 Set 接口派生出SortedSet子接口,SortedSet接口有一个TreeSet实现类。
  • 同样 Map接口也派生出一个SortedMap子接口,SortedMap接口也有一个TreeMap实现类。
TreeMap tm = new TreeMap();
  • TreeMap就是一个红黑树数据结构,每个key-value对作为红黑树的一个节点。根据key对节点进行排序,两种排序方式:自然排序、定制排序。
  • 类似于TreeSet,TreeMap中判断两个key相等的标准是:两个key通过compareTo()方法返回0。
  • 使用自定义类作为TreeMap的key,则重写该类的equals()方法和compareTo()方法时应保持一致的返回结果:两个key通过equals()方法比较返回true时,它们通过compareTo()方法比较应该返回0
  • 再次强调:SetMap的关系十分密切,Java源码就是先实现了HashMap、TreeMap等集合,然后通过包装一个所有的value都为null的Map集合实现了Set集合类。
  • 与TreeSet类似,TreeMap中提供一系列根据key顺序访问key-value的方法:

Map.Entry firstEntry():返回该Map中最小key所对应的key-value对,如果该Map为空,则返回null。
Object firstKe():返回该Map中的最小key值,如果该Map为空,则返回null。
Map.Entry lastEntry():返回该Map中最大key所对应的key-value对,如果该Map为空或不存在这样的key-value对,则都返回null。
Object lastKey():返回该Map中的最大key值,如果该Map为空或不存在这样的key,则都返回null。
Map.Entry higherEntry(Object key):返回该Map中位于key后一位的key-value对(即大于指定key的最小key 所对应的key-value对)。如果该Map为空,则返回null。
Object higherKey(Object key):返回该Map中位于key后一位的key值(即大于指定key的最小key值)。如果该Map为空或不存在这样的key-value对,则都返回null。
Map.Entry lowerEntry(Object key):返回该Map中位于key前一位的key-value对(即小于指定key的最大key所对应的key-value对)。如果该Map为空或不存在这样的key-value对,则都返回null。
Object lowerKey(Object key):返回该Map中位于key前一位的key值(即小于指定key的最大key值)。如果该Map为空或不存在这样的key,则都返回null。
NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean tolnclusive):返回该Map的子Map,其key的范围是从fromKey(是否包括取决于第二个参数)到toKey(是否包括取决于第四个参数)。
SortedMap subMap(Object fromKey,Object tokey):返回该Map的子Map,其key的范围是从fromKey(包括)到toKey(不包括)
SortedMap tailMap(Object fromKey):返回该Map的子Map,其key的范围是大于fromKey(包括)的所有key
NavigableMap tailMap(Object fromKey,boolean inclusive):返回该Map的子Map,其key的范围是大于fromKey(是否包括取决于第二个参数的所有key
SortedMap headMap(Object toKey):返回该Map的子Map,其key的范围是小于toKey(不包括)的所有key
NavigableMap headMap(Object toKey,boolean inclusive):返回该Map的子Map,其key的范围是小于toKey(是否包括取决于第二个参数的所有key

  • 其实它们很简单。因为TreeMap中的key-value对是有序的,所以增加了访问第一个、前一个、后一个、最后一个key-value对的方法,并提供了几个从TreeMap中截取子TreeMap的方法。

8.6.6 WeakHashMap实现类

  • WeakHashMapHashMap的用法基本相似。区别在于,HashMap的key保留了对实际对象的强引用,不会被垃圾回收,也不会自动删除这些key所对应的key-value对;但WeakHashMap的key只保留了对实际对象的弱引用,这些key所引用的对象可能被垃圾回收,也可能自动删除这些key所对应的key-value对。
WeakHashMap whm = new WeakHashMap();

8.6.7 IdentityHashMap实现类

  • 这个Map实现类的实现机制与HashMap基本相似,但它在处理两个key相等时比较独特:在IdentityHashMap中,当且仅当两个key 严格相等(key1==key2)时,IdentityHashMap 才认为两个key相等;对于普通的HashMap而言,只要keyl和key2通过equals()方法比较返回true,且它们的hashCode值相等即可。
IdentityHashMap ihm = new IdentityHashMap();
  • IdentityHashMap是一个特殊的Map实现!它有意违反Map的通常规范:IdentityHashMap要求两个key严格相等时才认为两个key相等。

8.6.8 EnumMap实现类

  • EnumMap是一个与枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式隐式指定它对应的枚举类
EnumMap enumMap = new EnumMap(Season.class);
  • EnumMap具有如下特征
    (1)EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑高效
    (2)EnumMap根据key的自然顺序(即枚举值在枚举类中的定义顺序)来维护key-value对的顺序。当程序通过keySet()、entrySet()、values()等方法遍历EnumMap时可以看到这种顺序。
    (3)EnumMap不允许使用null作为key,但允许使用null作为value。(如果试图使用null作为key时将抛出NullPointerException异常。如果只是查询是否包含值为null的key,或只是删除值为null的key,都不会抛出异常。)
  • 与创建普通的Map有所区别的是,创建EnumMap时必须指定一个枚举类,从而将该EnumMap和指定枚举类关联起来

8.6.9 个Map实现类的性能分析

  • 对于Map的常用实现类而言,虽然HashMap和Hashtable的实现机制几乎一样,但由于Hashtable是一个古老的、线程安全的集合,因此HashMap通常比Hashtable要快。
  • TreeMap 通常比HashMap、Hashtable要慢(尤其在插入、删除key-value对时更慢),因为TreeMap底层采用红黑树来管理key-value对(红黑树的每个节点就是一个key-value对)。
  • 使用TreeMap有一个好处:TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作。当TreeMap被填充之后,就可以调用keySet(),取得由key组成的Set,然后使用toArray)方法生成key的数组,接下来使用Arrays的binarySearch0方法在已排序的数组中快速地查询对象。
  • 对于一般的应用场景,程序应该多考虑使用HashMap,因为HashMap正是为快速查询设计的(HashMap底层其实也是采用数组来存储key-value对)。但如果程序需要一个总是排好序的Map时,则可以考虑使用TreeMap
  • LinkedHashMap 比HashMap慢一点,因为它需要维护链表来保持Map中key-value时的添加顺序。
  • IdentityHashMap性能没有特别出色之处,因为它采用与HashMap基本相似的实现,只是它使用==而不是equals0方法来判断元素相等。
  • EnumMap的性能最好,但它只能使用同一个枚举类的枚举值作为key。

8.7HashSet和HashMap的性能选项

  • 对于HashSet及其子类而言,它们采用hash算法来决定集合中元素的存储位置,并通过hash算法来控制集合的大小
  • 对于HashMapHashtable及其子类而言,它们采用hash 算法来决定Map中key的存储,并通过hash算法来增加key集合的大小
  • 可能发生“hash冲突”,冲突元素以链表形式存储。
    在这里插入图片描述
  • HashSet、HashMap的hash表包含如下属性:

容量(capacity):hash表中的桶数量。
初始化容量(initial capacity):创建hash表时桶的数量。HashMap和HashSet都允许在构造器中指定初始化容量。
尺寸(size):当前hash表中记录的数量。
负载因子(load factor):负载因子等于“size/capacity”。负载因子为0,表示空的hash表,0.5表示半满的hash表,依此类推。轻负载的hash表具有冲突少、适宜插入与查询的特点(但是使用Iterator迭代元素时比较慢)。

  • 除此之外,hash表里还有一个“负载极限”,“负载极限”是一个0~1的数值,“负载极限”决定了hash表的最大填满程度。当hash表中的负载因子达到指定的“负载极限”时,hash表会自动成倍地增加容量(桶的数量),并将原有的对象重新分配,放入新的桶内,这称为rehashing
  • HashSet和HashMap、Hashtable的构造器允许指定一个负载极限,默认的“负载极限”为0.75,这表明当该hash表的3/4已经被填满时,hash表会发生rehashing。
  • 使用足够大的初始化容量创建 HashSet和HashMap、Hashtable时,可以更高效地增加记录,但将初始化容量设置太高可能会浪费空间,因此通常不要将初始化容量设置得过高。

8.8 操作集合的工具类:Collections

8.8.1 排序操作

  • Collections提供了如下常用的类方法用于对List集合元素进行排序。

void reverse(List list)反转指定List集合中元素的顺序。
void shuffle(List list):对List集合元素进行随机排序(shuffle方法模拟了“洗牌”动作)。
void sort(List list):根据元素的自然顺序对指定List集合的元素按升序进行排序。
void sort(List list,Comparator c):根据指定Comparator产生的顺序对List集合元素进行排序。
void swap(List list,inti,intj):将指定List集合中的i处元素和j处元素进行交换
void rotate(List list,int distance):当distance为正数时,将list集合的后distance个元素“整体”移到前面;当distance为负数时,将list集合的前distance个元素“整体”移到后面。该方法不会改变集合的长度。

8.8.2 查找、替换操作

  • Collections还提供了常用的查找、替换集合元素的类方法。

int binarySearch(List list,Object key):使用二分搜索法搜索指定的List集合,以获得指定对象在List集合中的索引。如果要使该方法可以正常工作,则必须保证List中的元素已经处于有序状态。
Object max(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素
Object max(Collection coll,Comparator comp):根据Comparator指定的顺序,返回给定集合中的最大元素
Object min(Collection coll):根据元素的自然顺序,返回给定集合中的最小元素
Object min(Collection coll,Comparator comp):根据Comparator指定的顺序,返回给定集合中的最小元素
void fill(List list,Object obj):使用指定元素obj替换指定List集合中的所有元素。
int frequency(Collection c,Objecto):返回指定集合中指定元素的出现次数
int indexOfSubList(List source,List target):返回子List对象父List对象第一次出现的位置索引;如果父List中没有出现这样的子List,则返回□-1。
int lastIndexOfSubList(List source,List target):返回子List对象父List对象最后一次出现的位置索引;如果父List中没有出现这样的子List,则返回□-1。
boolean replaceAll(List list,Object oldVal,Object newVal):使用一个新值newVal 替换List对象的所有旧值oldVal。

8.8.3 同步控制

  • Collections类中提供了多个synchronizedXxx()方法,该方法可以将指定集合 包装成线程同步 的集合,从而可以解决多线程并发访问集合时的线程安全问题。
  • Java中常用的集合框架中的实现类HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap和TreeMap都是线程不安全的
public class SynchronizedTest{public static void main(String[] args){//下面程序创建了4个线程安全的集合对象Collection c = Collections.synchronizedCollection(new ArrayList());List list = Collections.synchronizedList(new ArrayList());Set s = Collections.synchronizedSet(new HashSet());Map m = Collections.synchronizedMap(new HashMap());}
}

8.8.4 设置不可变集合

  • 不可变的集合对象:只能访问集合元素,不可修改集合元素。
  • Collections提供了三类方法来返回一个不可变的集合:(三类方法的参数是原有的集合对象,返回值是该集合的“只读”版本。)

emptyXxx():返回一个空的、不可变的集合对象,此处的集合既可以是List,也可以是SortedSet、Set,还可以是Map、SortedMap等。
singletonXxx():返回一个只包含指定对象(只有一个或一项元素)的、不可变的集合对象,此处的集合既可以是List,还可以是Map。
unmodifiableXxx():返回指定集合对象的不可变视图,此处的集合既可以是List,也可以是Set、SortedSet,还可以是Map、SorteMap等。

//创建一个空的、不可改变的List对象
List unmodifiableList = Collections.emptyList();
//创建一个只有一个元素、不可改变的Set对象
Set unmodifiableSet = Collections.singleton("java");
//返回一个普通的Map对象对应的比可变版本
Map unmodifiableMap = Collectins.unmodifialeMap(scores);

8.8.5 java 9 新增的不可变集合

  • 程序直接调用Set、List、Map的of()方法即可创建包含N个元素的不可变集合,这样一行代码就可创建包含N个元素的集合。
  • 不可变意味着程序不能向集合中添加元素,也不能从集合中删除元素。
//创建包含4个元素的Set集合
Set set = Set.of("java","kotlin","go","swift");
//创建包含4个元素的List集合
List list = List.of(34, -25, 67, 231);
//创建包含3个key-value对的Map集合
Map map = Map.of("语文", 89, "数学", 82, "英语", 92);
//使用Map.entry()方法显示构建key-value对
Map map2 = Map.ofEntries(Map.entry("语文", 89),Map.entry("数学", 82),Map.entry("英语", 92));

8.9 烦琐的接口:Enumeration

  • Enumeration接口是Iterator迭代器的“古老版本”,有两个方法名字很长,不推荐使用。
  • 应该尽量采用Iterator迭代器。
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. SpringCloud Sleuth 分布式请求链路追踪

    SpringCloud Sleuth 分布式请求链路追踪SpringCloud Sleuth 概念搭建分布式请求链路SpringCloud Sleuth 概念 1、为什么要使用SpringCloud Sleuth&#xff1f;当前面临什么问题&#xff1f; 在微服务框架中&#xff0c;一个客户端发起的请求在后端系统中会经过多个不同的服务节…...

    2024/4/30 17:42:20
  2. Jenkins 定时备份插件 ThinBackup

    1、背景 公司的整个测试环境、正式环境打包都是用的同一个 Jenkins 构建编译打包的, 该 Jenkins 是搭建在内部的一台机器上&#xff0c;所有业务线加起来差不多有 100 多个大小项目&#xff0c;好担心内网的这台服务器如果硬盘换了这么多 Jenkins 配置这么办。 基于这个需求&…...

    2024/4/28 21:36:39
  3. 集成OpenFeign实现服务通信

    创建用户业务服务 略 &#xff08;可以参考前面SpringAlibabaCloud系列文章&#xff09; 业务服务控制层写一个测试接口 RestController RequestMapping("/user") public class UserController {/*** 测试使用feign 调用*/GetMapping("/feign/test")pub…...

    2024/4/7 0:21:36
  4. 【考研】操作系统:2014年真题47(同步互斥问题)

    前言 解决同步互斥问题的思路&#xff0c;源于对王道讲解的总结笔记 同类型题目&#xff1a; 【考研】操作系统&#xff1a;2015年真题45&#xff08;同步互斥问题&#xff09;_住在阳光的心里的博客-CSDN博客 【考研】操作系统&#xff1a;2009年真题45&#xff08;同步互…...

    2024/4/30 18:15:14
  5. C++ 学习之查找算法find、find_if

    1、 find 查找指定元素&#xff0c;找到返回指定元素的迭代器&#xff0c;找不到返回结束迭代器end() 利用find可以在容器中找指定的元素&#xff0c;返回值是迭代器 函数原型&#xff1a; find(iterator beg, iterator end, value); // 按值查找元素&#xff0c;找到返回指…...

    2024/4/19 12:47:49
  6. 软文推广如何一举攻城

    有人说&#xff0c;网站就好比我们的宝贝&#xff0c;日日夜夜兼顾着其排名变化&#xff0c;像似了古道上行走的浪荡豪侠&#xff0c;惧怕身上宝剑或玉佩被人抢了去&#xff0c;但个人网站软文使用软文推广&#xff0c;不道&#xff0c;或许又成了千古谜团&#xff0c;莫湘兆认…...

    2024/4/29 0:17:48
  7. 04 saltstack常用的模块

    saltstack常用的模块1. saltstack模块介绍2. saltstack常用模块2.1 saltstack常用模块之network2.1.1 network.active_tcp2.1.2 network.calc_net2.1.3 network.connect2.1.4 network.default_route2.1.5 network.get_fqdn2.1.6 network.get_hostname2.1.7 network.get_route2.…...

    2024/4/28 21:23:51
  8. Sentinel和Hystrix

    超详细的Sentinel入门 Hystrix 和 Sentinel 对比...

    2024/4/28 8:05:01
  9. UCOSⅢ查看任务堆栈空间:OSTaskStkChk()函数

    UCOSⅢ查看任务堆栈空间&#xff1a;OSTaskStkChk()函数 文章目录前言一、准备工作二、使用步骤1.创建堆栈检测任务2.在头文件os_cfg.h开启宏OS_CFG_STAT_TASK_STK_CHK_EN3.在堆栈检测任务使用OSTaskStkChk()函数三、结果前言 硬件的RAM资源有限&#xff0c;UCOSⅢ提供了一个系…...

    2024/4/27 22:17:50
  10. 高速刀片PCB分板机还有哪些优势特点?

    双工位离线式高速刀片分板机进行PCB板切割主要用日本NSK主轴&#xff0c;适用于所有V槽PCB板&#xff0c;应用于医疗行业、家电行业、半导体行业以及所有电子行业等。随着PCB分板机的广泛使用&#xff0c;双工位离线高速刀片分板机在PCB分板机领域的知名度也越来越高&#xff0…...

    2024/4/28 22:21:59
  11. Eclipse构建Maven项目的完整过程--普通web项目

    进行以下步骤的前提是你已经安装好本地maven库和eclipse中的maven插件了&#xff08;有的eclipse中已经集成了maven插件&#xff09; 一、Maven项目的新建 1、鼠标右键---->New----->Other... 2、直接点击下一步 3、选中 maven-archetype-webapp 后点击下一步 4、 Grou…...

    2024/4/28 17:29:38
  12. springboot使用Jsoup解析html,实现对html的修改

    目录一、需求二、解决2.1 简介2.2 Jsoup的主要功能三、入门3.1 maven引用3.2 简单使用一、需求 前端传至后端的html数据&#xff0c;后端需要根据html中对应的class或者tag&#xff0c;去替换掉相应的属性值或者修改标签等等。 二、解决 使用Jsoup 官方&#xff1a;https://…...

    2024/4/29 1:19:40
  13. 2021-11-03理解MVVM模型

    M&#xff1a;模型model&#xff1a;对应data中的数据 V&#xff1a;视图view&#xff1a;模板 VM&#xff1a;视图模型viewmodel&#xff1a;vue实例对象 data中的数据出现在vm实例中&#xff0c;出现在vm中的数据模板都可以调用...

    2024/4/28 15:06:46
  14. Keil 5 “st-link usb communication error“解决后记录

    调开发板时发现ST-Link出现 “st-link usb communication error” 我使用的是ST的BlueNRG-1芯片 就马上去查了一下&#xff0c;结合了一下问题所在 解决方法是需要下载老版固件 官方下载地址: https://www.st.com/zh/development-tools/stsw-link007.html 下面我就综合一下解决…...

    2024/4/28 8:13:09
  15. (C)(数据结构)中国大学MOOC-陈越、何钦铭-数据结构-2021秋--03-树1 树的同构 题解

    题目描述 输入样例每行代表第i个节点&#xff08;0 < i < n-1&#xff09;&#xff0c;字母表示数据域的值&#xff0c;数字代表其子树的根节点是第几个节点 #include <stdio.h> #include <stdlib.h>#define N 15 #define null -1typedef struct TreeNode//…...

    2024/4/28 18:11:19
  16. 什么是op操作

    什么是op&#xff08;操作&#xff09;&#xff1f; 所谓op就是operation&#xff0c;“操作”的意思。在tensorflow中op不仅包括加、减、乘、除等所有计算方式&#xff0c;同时也包括常量定义、变量定义、占位符定义等等。例如tf.constant()&#xff0c;tf.add()&#xff0c;…...

    2024/4/28 21:46:25
  17. %s——字符串中的占位符

    %s在字符串中表示占位符 public static void main(String[] args) {String s "姓名&#xff1a;%s,性别&#xff1a;%s";String name "fcp";String sex "man";System.out.println(String.format(s, name, sex));}输出结果为&#xff1a;姓名…...

    2024/4/28 0:30:47
  18. web-worker在vue中的使用

    安装vue-worker npm install vue-worker 安装worker-loader npm install worker-loader vue.config.js中添加如下配置 module.exports {devServer: {open: true,port: 3003,},lintOnSave: false, //关闭eslint警告chainWebpack: config > {config.module.rule(worker).tes…...

    2024/4/29 2:06:21
  19. Java多线程学习

    Java实现多线程的三种方式 1&#xff1a;通过继承Thread类实现 步骤&#xff1a;1.创建Thread线程类的一个子类&#xff0c;同时要重写Thread类的run()方法 2.创建该子类的实例对象&#xff0c;并通过start()方法启动线程 package com.lin;public class Thread01 extends Thr…...

    2024/4/28 16:17:28
  20. QR扫码综合示例教程(三)Qt5.15.2+Qt6.2.1(widget)摄像头显示(示例合并)

    前言&#xff1a; 目前Qt6已发布有一段时间了&#xff0c;但Qt6仍然缺少部分模块或存在bug&#xff0c;加上部分工程仍然要使用Qt5,所以很多工程要使用不同版本的Qt。本次教程将之前的2个示例项目合并 合并方法&#xff1a; 使用宏区分 #if (QT_VERSION > QT_VERSION_CH…...

    2024/4/27 23:43:48

最新文章

  1. Multi-Thread TCP Server Client

    prerequisite knowledge: Basic TCP Server & Client: URL Server #include <stdio.h> #include <string.h> #include <unistd.h> // read and write (TCP); sendto and recvfrom (UDP) #include <arpa/inet.h> // 包含#include <sys/socket.…...

    2024/4/30 20:13:50
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. N5171B是德科技N5171B信号发生器

    181/2461/8938产品概述&#xff1a; N5171B EXG 射频模拟信号发生器具有最佳的 EXG&#xff0c;旨在满足您对组件参数测试和接收器校准的信号需求。其出色的硬件性能可提供更快的吞吐量、更长的正常运行时间以及极好的准确性和可重复性。 Agilent / HP N5171B EXG 射频模拟信…...

    2024/4/30 3:37:47
  4. 人工智能的真实盈利:掌握 ChatGPT-4 用于业务营销(全)

    原文&#xff1a;Artificial Intelligence, Real Profits 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第一部分&#xff1a;理解基础知识 第一章&#xff1a; 人工智能和 ChatGPT-4 简介 在我们旅程的最初章节中&#xff0c;我们踏上了对人工智能&#xff08;AI…...

    2024/4/29 10:09:44
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57