java集合的迭代器与遍历

文章目录

  • 迭代器
    • Iterator
      • 1、什么是Iterator
      • 2,iterator接口的API
      • 3、Irerator()方法细节解释
      • 4. Irerator的原理示意图
      • 5. forEach循环与Iterator遍历的区别与联系
    • ListIterator
      • 1.ListIterator的概述
        • (1) 概念
        • (2) 解析
      • 2.ListIterator的生成
      • 3.ListIterator的API
      • 4.ListIterator的add方法解析
      • 5.ListIterator与Iterator的区别
  • java集合遍历
    • 1. ArrayList的遍历方式
      • 第一种,通过迭代器遍历。即通过Iterator去遍历。
      • 第二种,随机访问index,通过索引值去遍历。
      • 第三种,增强for循环遍历。如下:
      • 第四种,forEach遍历。如下:
      • 第五种,stream流式遍历
      • 第六种,forEachRemaining方法遍历:继续输出其余的元素
    • 2. LinkedList的遍历方式
      • 第七种:通过pollFirst()来遍历LinkedList,获取并移除此列表的第一个元素;如果此列表为空,则返回 null
      • 第八种:通过pollLast()来遍历LinkedList,获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
      • 第九种:通过removeFirst()来遍历LinkedList,移除并返回此列表的第一个元素。 NoSuchElementException - 如果此列表为空。
      • 第十种:通过removeLast()来遍历LinkedList,移除并返回此列表的最后一个元素。NoSuchElementException - 如果此列表为空。
    • 3. Set集合的遍历方式
    • 4. Map集合的遍历方式
      • ①for-each + keySet()/values()遍历key/Value
      • ②[重要]for-each + entrySet()遍历
      • ③for-each + keySet() + get()方法遍历
      • ④Iterator + entrySet()遍历
      • ⑤[重要]lambda表达式遍历
      • ⑥stream流遍历
      • 总结——简洁又好用的遍历方式

迭代器

Iterator

1、什么是Iterator

一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用 Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本身。
  2、Iterator与ListIterator有什么区别?
  Iterator:只能正向遍历集合,适用于获取移除元素。ListIerator:继承Iterator,可以双向列表的遍历,同样支持元素的修改。

2,iterator接口的API

 boolean hasNext()  如果仍有元素可以迭代,则返回 true。E next() 返回迭代的下一个元素。void remove()  从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。

3、Irerator()方法细节解释

Iterator iterator = col.iterator();//获取迭代器对象
hasNext(): 判断游标右边是否还有下一个元素,默认游标都在集合的第一个元素之前。
注意:此时只是判断是否有下一个元素,并不移动指针。
while(iterator.hasNext()){
//next():①指针下移 ②将下移以后集合位置上的元素返回
Object next = iterator.next();
System.out.println(“next=”+next);
}

迭代过程如图所示:
在这里插入图片描述
(1)、如果iterato.next()指向的内存中如果没有元素会抛出异常
(2)、当退出while后,iterator.hasNext()中next已经走到尾部,若继续调用iterator.hasNext()将会报错(若要继续遍历,可通过重置迭代器解决)
(3)、void remove()方法 :删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素,如果当前指针指向的内存中没有元素,那么会抛出异常

4. Irerator的原理示意图

在这里插入图片描述

5. forEach循环与Iterator遍历的区别与联系

(1)使用范围不同

forEach: 不仅可以在集合中使用,也可以在数组中遍历使用
Iterator:专门为遍历集合而生,集合并没有提供专门的遍历的方法。在数组中不能遍历用

(2)遍历过程不同

iterator.remove() 删除当前遍历到的值
foreach遍历集合元素时不能调用remove删除元素,否则会出现ConcurrentModificationException

(3)增强的for循环和Iterator的联系

增强的for循环(遍历集合)时,底层使用的是Iterator
凡是可以使用增强的for循环(遍历的集合),肯定也可以使用Iterator进行遍历

ListIterator

1.ListIterator的概述

(1) 概念

官方文档说,此接口只是用于List的迭代器,通过它我们可以从任意方向遍历列表、在迭代期间修改列表、获取迭代器在列表中的当前位置。ListIterator没有当前元素(current element),它的光标总是处于调用previous()方法返回的元素和next()方法返回的元素之间。长度为n的列表,它的迭代器有n+1个光标位置

在这里插入图片描述
绿色代表ListIterator迭代器的位置,在ListItarator中迭代器的位置都是指的光标的位置。红色代表List列表中的元素,把这张图存脑袋里,把这张图存脑袋里,把这张图存脑袋里,这个接口的所有操作都没啥障碍了。

(2) 解析

在使用java集合的时候,都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。这两种迭代器有什么区别呢?下面我们详细分析。这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置,如下图所示:
在这里插入图片描述
这里假设集合List由四个元素List1、List2、List3和List4组成,当使用语句Iterator it = List.Iterator()时,迭代器it指向的位置是上图中Iterator1指向的位置,当执行语句it.next()之后,迭代器指向的位置后移到上图Iterator2所指向的位置。

2.ListIterator的生成

 List<Integer> list =Arrays.asList(1,2,3,4);ListIterator<Integer> it = list.listIterator();                无参ListIterator<Integer> it1 = list.listIterator(list.size());    有参

3.ListIterator的API

add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前
hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false
hasPrevious(): 如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false
next():返回列表中ListIterator指向位置后面的元素
nextIndex(): 返回列表中ListIterator所需位置后面元素的索引
previous(): 返回列表中ListIterator指向位置前面的元素
previousIndex():返回列表中ListIterator所需位置前面元素的索引
remove(): 从列表中删除最后一次执行next()或previous()方法返回的元素。(有点拗口,意思就是对迭代器使用hasNext()方法时,删除ListIterator指向位置后面的元素;当对迭代器使用hasPrevious()方法时,删除ListIterator指向位置前面的元素)
remove使用时注意三点:

  1.调用remove()方法之前,一定要有next()previous()方法执行,否则报错:java.lang.IllegalStateException2.执行next()previous()之后与执行remove()之前,不能执行add(E)方法,'否则报错: java.lang.IllegalStateException3.就近原则。

set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e
调用set(E)方法前,不能调用remove() 和 add(E) 方法,否则会报错:java.lang.IllegalStateException。

4.ListIterator的add方法解析

void add ( E e ) 将指定元素插入到previous()返回的元素与当前光标位置之间。如何理解呢?上图:
在这里插入图片描述
就是说不仅将元素插入到e1和e2之间,也插入到了e1和cursor之间。
在这里插入图片描述
此时调用next()方法,仍然返回的是e2,调用previous()返回的就是新插入的元素了。
值得注意的是,当光标位置处于0(第一个元素左边)时,调用add(E)方法会出现异常,因为现在光标左边还没有元素呀

5.ListIterator与Iterator的区别

一.相同点

都是迭代器,都可以对集合中的元素进行遍历 。当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。

二.不同点

1: 范围不同:Iterator可应用于Collection及其子类型所有的集合,而ListIterator只能用于List及其子类型,如List、ArrayList、LinkedList和Vector等
(2: 遍历功能略微不同:Iterator和ListIterator都有hasNext()next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()previous()方法,可以实现逆向(顺序向前)遍历。Iterator则不可以逆向遍历。即 ListIterator 因为有hasPrevious()previous()方法,所以可实现双向遍历,而terator只能单向顺序向前遍历。
(3: Iterator在遍历过程中仅仅有一个remove移除元素的方法, 故Iterator在遍历过程中不能够往集合里新增、修改元素;而ListIterator在遍历过程中有add()方法、remove方法、set方法,可以在遍历过程中向List中添加/删除集合中的元素,或者修改集合元素。
(4: Iterator在遍历过程中不能定位到索引位置,ListIterator可以定位当前的索引位置,nextIndex()previousIndex()可以实现。注意: map并没有实现Iterator,ListIterator接口,所以其不能使用这两种迭代器直接进行遍历

java集合遍历

1. ArrayList的遍历方式

第一种,通过迭代器遍历。即通过Iterator去遍历。

List<Integer> list =Arrays.asList(1,2,3,4);
Iterator<Integer>  iter = list.iterator();
while (iter.hasNext()) {Integer  value = iter.next();System.out.println("v..."+value);
}或者通过for的方式
List<Integer> list =Arrays.asList(1,2,3,4);
for(Iterator iter = list.iterator(); iter.hasNext();){Integer  value = iter.next();System.out.println("v..."+value);
}

第二种,随机访问index,通过索引值去遍历。

由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素。

List<Integer> list =Arrays.asList(1,2,3,4);
for (int i=0; i<list.size(); i++) {System.out.println("i= "+i+"....v..."+list.get(i));      
}

第三种,增强for循环遍历。如下:

List<Integer> list =Arrays.asList(1,2,3,4);
for (Integer value : list) {System.out.println("v..."+value);
}

第四种,forEach遍历。如下:

List<Integer> list =Arrays.asList(1,2,3,4);
list.forEach(v->System.out.println("v..."+value));
也可以简写为
list.forEach(System.out::println);

第五种,stream流式遍历

List<Integer> list =Arrays.asList(1,2,3,4);
list.stream.map(x->x++).collect(Collectors.toList());
或者
list.stream.forEach(v->System.out.println("v..."+value));

第六种,forEachRemaining方法遍历:继续输出其余的元素

由于某种原因导致遍历停止了,然后在通过foreachRemaing 遍历的时候,只会遍历剩余集合中还存在的元素。

ArrayList<Integer> arrayList=new ArrayList<>();for (int i = 0; i <10; i++) {arrayList.add(i);}System.out.println("迭代器第一次遍历");Iterator<Integer> iterator=arrayList.iterator();while(iterator.hasNext()){int num=iterator.next();System.out.print(num);if(num==5){break;}}System.out.println("");System.out.println("输出其余元素:");iterator.forEachRemaining(new Consumer<Integer>() {@Overridepublic void accept(Integer s) {System.out.print(s);}});

在这里插入图片描述

遍历ArrayList时,使用随机访问(即,通过索引序号访问)效率最高,而使用迭代器的效率最低

2. LinkedList的遍历方式

由于LinkedList与ArrayList实现同一个接口List,故ArrayList的六种遍历方式对于LinkedList同样适用,这里只对LinkedList的特有遍历方式做解释说明
数据准备:

List<Integer> list = new LinkedList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);知识回顾:
pollFirst():删除头;并且返回头,如果列表为空,则不会给出任何异常,并且返回null。 特有方法
pollLast():删除尾; 并且返回尾,如果列表为空,则不会给出任何异常,并且返回null。特有方法
removeFirst(E e):删除头,获取元素并删除,返回头;如果列表为空,抛出NoSuchElementException异常。 特有方法
removeLast(E e):删除尾;获取元素并删除,返回尾;如果列表为空,抛出NoSuchElementException异常。 特有方法

第七种:通过pollFirst()来遍历LinkedList,获取并移除此列表的第一个元素;如果此列表为空,则返回 null

     while(list.pollFirst() != null){}

第八种:通过pollLast()来遍历LinkedList,获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。

while(list.pollLast() != null) {}

第九种:通过removeFirst()来遍历LinkedList,移除并返回此列表的第一个元素。 NoSuchElementException - 如果此列表为空。

try {while(list.removeFirst() != null) {}
} catch (NoSuchElementException e) {
}

第十种:通过removeLast()来遍历LinkedList,移除并返回此列表的最后一个元素。NoSuchElementException - 如果此列表为空。

try {while(list.removeLast() != null) {}
} catch (NoSuchElementException e) {
}

3. Set集合的遍历方式

set集合支持的遍历方式同ArrayList集合的六种遍历方式,这里就不在列举了,有疑问的看ArrayList集合的遍历方式

4. Map集合的遍历方式

①for-each + keySet()/values()遍历key/Value

for-each:一种遍历形式

可以遍历集合或者数组,实际上是迭代器遍历的简化写法,也称增强for循环。
each表示每个;for-each表示循环数组或集合中的对象、数据。

keySet()方法:拿到全部的Key

将Map中所有的键(Key)存入到Set集合中。
Key表示键值;Set表示Set集合。

values()方法:拿到全部的Value

返回一个新的Iterator(迭代器)对象,该对象包含Map中存在的每个元素的值(Value)。
vluees是值的复数形式,表示它有很多的值。

HashMap<String, Integer> map1 = new HashMap<>();
map1.put("小明", 1);
map1.put("小红", 2);
map1.put("小张", 3);//for-each + keySet()遍历key
for (String key : map1.keySet()) { //遍历keySystem.out.println("key = " + key);
}
//for-each + values()遍历value
for (Integer value : map1.values()) { //遍历valueSystem.out.println("value = " + value);
}遍历结果:
key = 小明
key = 小红
key = 小张
value = 1
value = 2
value = 3

一次只能取出Key的值或者Value的值,这样显然是很不方便的。

②[重要]for-each + entrySet()遍历

Map.Entry是为了更方便的输出map键值对。一般情况下,想要输出Map中的key 和 value,就必须先得到key的集合keySet(),然后再循环每个key得到每个value。values()方法是获取集合中的所有值,不包含键,没有对应关系。而Entry可以一次性获得这两个值。

entrySet()方法:拿到全部的键值对

将Map中所有的键(Key)-值(Value)对存入到Set集合中,这个方法返回的是一个Set<Map.Entry<K,V>>。
entry表示条目、清单;Set表示Set集合。
entry里面的内容如下:
Key1, Value1
Key2, Value2
Key3, Value3
… , …
Key65535, Value65535

HashMap<String, Integer> map1 = new HashMap<>();
map1.put("小明", 1);
map1.put("小红", 2);
map1.put("小张", 3);//for-each + entrySet()遍历
for (Map.Entry<String, Integer> entry : map1.entrySet()) { System.out.print("key = " + entry.getKey());System.out.println(", value = " + entry.getValue());
}执行结果:
key = 小明, value = 1
key = 小红, value = 2
key = 小张, value = 3

Map.Entry是最常见也最常用的遍历Map的方式

③for-each + keySet() + get()方法遍历

get()方法:传入Key,返回对应的Value

将要返回的元素的键(Key)作为参数,找到并返回对应该键(Key)的值(Value)。
如果没有找到键(Key),返回undefined。
因为键(Key)是唯一的,所以不用担心找到第一个后第二个不输出的问题。

HashMap<String, Integer> map1 = new HashMap<>();
map1.put("小明", 1);
map1.put("小红", 2);
map1.put("小张", 3);//for-each + keySet() + get()方法遍历
for (String key : map1.keySet()) {Integer value = map1.get(key);System.out.print("key = " + key);System.out.println(", value = " + value);
}
执行结果:
key = 小明, value = 1
key = 小红, value = 2
key = 小张, value = 3

一般不推荐使用这种方法,因为多了一步根据key查找value的操作,效率会相对慢一些。写法和最开始的for-each遍历很相似,不同的是value使用了get()方法来获取。

map.get(key)方法的底层实现:
先调用Key的Hashcode方法得到哈希值,通过哈希算法得到对应的数组的下标,通过数组下标快速定位到某个位置上,如果这个位置上什么也没有,则返回null,如果这个位置上有单向链表,那么会拿着参数k和单项链表中的每个节点的k进行比较(equals()),如果所有的节点都返回false,那么最终该方法返回null,如果有一个节点的k和我们的k相匹配,那么该k节点所对应的value就是我们要找的value。
原文链接:https://blog.csdn.net/qq_51960163/article/details/117530311

④Iterator + entrySet()遍历

iterator() 方法:返回一个用于遍历当前集合的迭代器

HashMap<String, Integer> map1 = new HashMap<>();
map1.put("小明", 1);
map1.put("小红", 2);
map1.put("小张", 3);//Iterator + entrySet()遍历
Iterator<Map.Entry<String, Integer>> iter = map1.entrySet().iterator();
while (iter.hasNext()) {Map.Entry<String, Integer> entry = iter.next();System.out.print("key = " + entry.getKey());System.out.println(", value = " + entry.getValue());
}
执行结果:
key = 小明, value = 1
key = 小红, value = 2
key = 小张, value = 3

使用Iterator创建一个迭代器来遍历这个Map,和方法②类似,但区别在于:

​ for-each通常用于一次性遍历整个集合,大大提升了代码的简洁性和可阅读性,但期间无法控制遍历的过程。而Iterator通过hasNext(),next() 更好地控制便利过程的每一步。
​ for-each在遍历过程中严禁改变集合的长度,且无法对集合的删除或添加等操作。而Iterator可以在遍历过程中对集合元素进行删除操作。

但是在idea编译器中,编译器会给出警告,提示说该写法可以简化,简化后的写法和for-each + entrySet()方法遍历一致:

for (Map.Entry<String, Integer> entry : map1.entrySet()) {System.out.print("key = " + entry.getKey());System.out.println(", value = " + entry.getValue());
}

⑤[重要]lambda表达式遍历

forEach() 方法:遍历数组中每一个元素并执行特定操作

Lambda表达式:能够非常简练地表达特定的操作行为。在遍历集合中的元素时,如果对每个元素都执行同样的操作,也可以用Lambda表达式来指定对元素的操作行为,从而简化遍历访问集合的代码。

HashMap<String, Integer> map1 = new HashMap<>();
map1.put("小明", 1);
map1.put("小红", 2);
map1.put("小张", 3);//lambda表达式遍历
map1.forEach((key, value) -> {System.out.print("key = " + key);System.out.println(", value = " + value);
});执行结果:
key = 小明, value = 1
key = 小红, value = 2
key = 小张, value = 3

forEach方法遍历了map1,同时获取到key和value的值。美观,简洁,大气。

⑥stream流遍历

Stream流的作用:区别于IO流,用来对容器(集合,数组)操作进行书写简化,配合众多函数式接口以及lambda表达式,方法引用,集合的遍历,计数,过滤,映射,截取等操作变得异常优雅,上流。

HashMap<String, Integer> map1 = new HashMap<>();
map1.put("小明", 1);
map1.put("小红", 2);
map1.put("小张", 3);//stream流遍历
map1.entrySet().stream().forEach((Map.Entry<String, Integer> entry) -> {System.out.print("key = " + entry.getKey());System.out.println(", value = " + entry.getValue());
});
执行结果:
key = 小明, value = 1
key = 小红, value = 2
key = 小张, value = 3

但是在idea编译器中,编译器会给出警告,提示说该写法可以简化,简化后的写法和lambda表达式一致:

map1.forEach((key, value) -> {System.out.print("key = " + key);System.out.println(", value = " + value);
});

总结——简洁又好用的遍历方式

①for-each + entrySet()遍历

HashMap<String, Integer> map1 = new HashMap<>();
map1.put("小明", 1);
map1.put("小红", 2);
map1.put("小张", 3);//for-each + entrySet()遍历
for (Map.Entry<String, Integer> entry : map1.entrySet()) {System.out.print("key = " + entry.getKey());System.out.println(", value = " + entry.getValue());
}

②lambda表达式遍历

HashMap<String, Integer> map1 = new HashMap<>();
map1.put("小明", 1);
map1.put("小红", 2);
map1.put("小张", 3);//lambda表达式遍历
map1.forEach((key, value)->{System.out.print("key = " + key);System.out.println(", value = " + value);
});

鸣谢:https://blog.csdn.net/qq_52430605/article/details/132159145

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

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

相关文章

【从零开始学习JVM | 第九篇】了解 常见垃圾回收器

前言&#xff1a; 垃圾回收器&#xff08;Garbage Collector&#xff09;是现代编程语言中的一项重要技术&#xff0c;它提供了自动内存管理的机制&#xff0c;极大地简化了开发人员对内存分配和释放的繁琐工作。通过垃圾回收器&#xff0c;我们能够更高效地利用计算机的内存资…

selenium+python自动化测试 —— 解决无法启动IE浏览器及报错问题!

前言&#xff1a;记录启动IE浏览器的报错及解决方法。 错误1&#xff1a; selenium.common.exceptions.WebDriverException: Message: IEDriverServer.exe executable needs to be in PATH. Please download from http://selenium-release.storage.googleapis.com/index.html…

【C语言:动态内存管理】

文章目录 前言1.malloc2.free3.calloc4.realloc5.动态内存常见错误6.动态内存经典笔试题分析7.柔性数组8.C/C中的内存区域划分 前言 文章的标题是动态内存管理&#xff0c;那什么是动态内存管理&#xff1f;为什么有动态内存管理呢&#xff1f; 回顾一下以前学的知识&#xff…

SpringBoot+Vue3前后端快速整合入门

前言 最近需要维护一个个人项目&#xff0c;由于笔者是一个大后端&#xff0c;所以借此机会把前端学习过程记录一下&#xff0c;方便后续回顾。 前端项目初始化 安装npm 在前端项目初始化时&#xff0c;我们必须要安装好node&#xff0c;官网地址如下&#xff0c;因为笔者后…

1.【Multisim仿真】数电模电学习,仿真软件的初步使用

学习计划路径&#xff1a; >Multisim电路仿真软件熟练掌握 >数字电路基础课程 >逻辑电路设计与应用 >熟练掌握存储器、脉冲波形发生器、D/A和A/D转换器原理 >基本元器件熟练掌握 >晶体管放大电路及负反馈放大电路 >集成运算放大器设计 >电压变电流电路…

解决GateWay报错:Exceeded limit on max bytes to buffer : 262144

场景&#xff1a; 前端传来了一个大的字符串 发现请求不通 一番调试发现SpringGateway 默认内存缓冲区262144字节 网上查了很多种常见的解决方案无效之后 直接重写底层 网友的解决方案 方案1&#xff08;无效&#xff09; 直接修改缓冲区大小 spring:codec:max-in-memory-s…

【STM32】STM32学习笔记-LED闪烁 LED流水灯 蜂鸣器(06-2)

00. 目录 文章目录 00. 目录01. GPIO之LED电路图02. GPIO之LED接线图03. LED闪烁程序示例04. LED闪烁程序下载05. LED流水灯接线图06. LED流水灯程序示例07. 蜂鸣器接线图08. 蜂鸣器程序示例09. 下载10. 附录 01. GPIO之LED电路图 电路图示例1 电路图示例2 02. GPIO之LED接线图…

持续集成交付CICD:Jenkins使用GitLab共享库实现自动上传前后端项目Nexus制品

目录 一、实验 1.GitLab本地导入前后端项目 2.Jenkins新建前后端项目流水线 3.Sonarqube录入质量阈与质量配置 4.修改GitLab共享库代码 5.Jenkins手动构建前后端项目流水线 6.Nexus查看制品上传情况 7.优化代码获取RELEASE分支 8.优化Jenkins流水线项目名称 一、实验 …

计算机网络:数据链路层(网桥)

带你速通计算机网络期末 目录 一、冲突域和广播域 二、网桥介绍 三、网桥分类—―透明网桥 四、网桥分类―—源路由网桥 五、多接口网桥―—以太网交换机 总结 一、冲突域和广播域 冲突域:在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只…

华为数通---配置基本QinQ示例

QinQ简介 定义 QinQ&#xff08;802.1Q-in-802.1Q&#xff09;技术是一项扩展VLAN空间的技术&#xff0c;通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的功能&#xff0c;可以使私网VLAN透传公网。由于在骨干网中传递的报文有两层802.1Q Tag&#x…

MySQL之DQL语句

DQL语句 DQL&#xff08;Data Query Language&#xff09;查询数据 操作查询&#xff1a;select简单的查询&#xff0c;复杂的查询数据库中最核心的语言&#xff0c;最重要的语句使用频繁的语句 指定查询 查询全部 语法&#xff1a; select 全部字段&#xff08;*&#x…

什么是tomcat?tomcat是干什么用的?

目录 Tomcat 的主要用途包括&#xff1a; 托管Java Web应用程序&#xff1a; Servlet 容器&#xff1a; 以下是关于Servlet容器的一些关键特性和功能&#xff1a; 生命周期管理&#xff1a; 多线程支持&#xff1a; HTTP请求处理&#xff1a; HTTP响应生成&#xff1a;…

金融众筹系统源码:适合创业孵化机构 附带完整的搭建教程

互联网技术的发展&#xff0c;金融众筹作为一种新型的融资方式&#xff0c;逐渐成为创业孵化机构的重要手段。为了满足这一需求&#xff0c;金融众筹系统源码就由此而生&#xff0c;并附带了完整的搭建教程。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.…

《从入门到精通:AJAX基础知识解析,前端开发中利器》基础篇

目录 学习目标&#xff1a; 学习目录&#xff1a; 学习时间&#xff1a; 学习内容&#xff1a; 什么是 AJAX&#xff1f; 怎么用 AJAX &#xff1f; 认识 URL 协议 域名 资源路径 获取 - 新闻列表 URL 查询参数 axios&#xff0d;查询参数 常用请求方法和数据提…

Jenkins离线安装部署教程简记

前言 在上一篇文章基于Gitee实现Jenkins自动化部署SpringBoot项目中&#xff0c;我们了解了如何完成基于Jenkins实现自动化部署。 对于某些公司服务器来说&#xff0c;是不可以连接外网的&#xff0c;所以笔者专门整理了一篇文章总结一下&#xff0c;如何基于内网直接部署Jen…

ELADMIN - 免费开源 admin 后台管理系统,基于 Spring Boot 和 Vue ,包含前端和后端源码

一款简单好用、功能强大的 admin 管理系统&#xff0c;包含前端和后端源码&#xff0c;分享给大家。 ELADMIN 是一款基于 Spring Boot、Jpa 或 Mybatis-Plus、 Spring Security、Redis、Vue 的前后端分离的后台管理系统。 ELADMIN 的作者在 Github 和 Gitee 上看了很多的项目&…

Java项目学生管理系统六后端补充

班级管理 1 班级列表&#xff1a;后端 编写JavaBean【已有】编写Mapper【已有】编写Service编写controller 编写Service 接口 package com.czxy.service;import com.czxy.domain.Classes;import java.util.List;/*** author 桐叔* email liangtongitcast.cn* description*/ p…

【Jenkins】Centos环境安装Jenkins(通过rpm安装)

在Centos操作系统中通过rpm安装Jenkins 参考官网 https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 1、下载安装Jdk17 下载安装 # 更新您的系统&#xff0c;不一定需要 # sudo yum -y update # 安装将用于下载 Java 17 二进制文件的 wget 命令行工具。 s…

计算机网络传输层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 传输层的功能端口UDP协议UDP数据报UDP的首部格式UDP校验 TCP协议&#xff08;必考&#xff09;TCP报文段TCP连接的建立TCP连接的释放TCP的可靠传输TCP的流量控制零窗口探测报文段 TCP的拥塞控制慢开始和拥塞控制快重传和快恢复 TCP和U…

薅github的羊毛-用pages建自己的博客或静态资源站 - 1/2

注册帐号 准备邮箱注册帐号&#xff0c;在注册界面输入用户名、邮箱及密码完成注册。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 1. 在注册成过程中&#xff0c;会往邮箱发送验证码&#xff0c;请如实填写即可 2. 验证码没错的话&#xff0c;就代…