Java进阶九—数组问题(集合框架)

Java进阶九—数组问题(集合框架)

一.原生数组带来的问题

  • 原生数组容易造成超出边界,如果非要使用传统的数组,增删改查,就要用到数据结构,非常复杂
  • CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写
    package com.array;import org.junit.Test;public class ArrayTest {public static final int SIZE = 3;@Testpublic void testArray() {int[] array = new int[SIZE];array[0] = 1;array[1] = 2;array[2] = 3;array[3] = 4;for (int arrays :array) {System.out.println(arrays);}}
    }
    

由此我们抛出Java Conllections FrameWork即Java集合框架,也可称为函数库 

二.Conllections家族 

  • Java集合框架是一个包含一系列实作可重复使用集合的数据结构的类别和界面集合
  • Java集合大致可以分为两大体系,一个是Collection,另一个是Map

 

三. 黑帮的帮规 

集合 (Java Platform SE 8) (oracle.com)

  • lterables集合层次结构中的根接口,可以理解为保护伞
  • 一般黑老大不会自己出手,会让手下三个组织来办事,所以用的时候找类来实现
  • 黑老大定下的规矩(方法),手下三个组织必须遵守。其实就是Collection的方法,实现的三个接口List,Queue,Set必须重写方法。

 四.ArrayList

 ArrayList (Java Platform SE 8 ) (oracle.com)

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

ArrayList 继承了 AbstractList ,并实现了 List 接口可以自动扩容

 1.添加

这个E代表泛型,表示任意变量类型。 

public void arrayListTest() {// 任意类型ArrayList arrayList = new ArrayList();arrayList.add(1);arrayList.add(4.3);arrayList.add("C");arrayList.add("fuck");System.out.println(arrayList);// 规定为String类型,泛型限定ArrayList<String> arrayList1 = new ArrayList<>();arrayList1.add("fu");arrayList1.add("ck");System.out.println(arrayList1);}

 

泛型也可以是对象,创建一个Student类 

package com.array;public class Student {private String name;private int age;public Student() {}public Student(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
 public void arrayListTest() {// 泛型为StudentArrayList<Student> arrayList = new ArrayList<>();arrayList.add(new Student("fuck",22));arrayList.add(new Student("LiLi",33));System.out.println(arrayList);}

 

还有一种添加可以指定下标位置。 

  public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(3);// 添加下标时,要注意添加的位置,添加的位置已有的位置前或中间,不能是后面。arrayList.add(0,0);arrayList.add(2,2);System.out.println(arrayList);}

2.合并 

  public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(3);// 添加下标时,要注意添加的位置,添加的位置已有的位置前或中间,不能是后面。arrayList.add(0,0);arrayList.add(2,2);ArrayList<Integer> arrayList1 = new ArrayList<>();arrayList1.add(4);// 将arrayList1合并到arrayListarrayList.addAll(arrayList1);System.out.println(arrayList);}

 它是如何实现的,看源码

集合转换成普通数组,拷贝数组并返回。 

第二种是选择下标插入,非常简单与添加使用的方式一样,我应该不用说了。

3.将集合转换成数组

public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);// 需要Object类型的数组去接收Object[] array = arrayList.toArray();for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}}

4.清空与拷贝 

 public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);System.out.println(arrayList);// 清空arrayList.clear();System.out.println(arrayList);}

 public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);System.out.println(arrayList);ArrayList<Integer> arrayList1 = (ArrayList<Integer>) arrayList.clone();// 拷贝System.out.println(arrayList1);}

5. 查看集合中是否有这个元素

 public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);// 返回boolean类型boolean number1 = arrayList.contains(3);System.out.println(number1);boolean number2 = arrayList.contains(5);System.out.println(number2);}

 

6. 获取集合的容量与需要的下标值,与任何遍历

集合之所以可以直接输出不用遍历,是因为它重新了toString方法。

public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);// 集合容量System.out.println(arrayList.size());// 下标为2的值int indexTwo = arrayList.get(2);System.out.println(indexTwo);// 遍历,并给每一个元素加2,// 遍历的作用:不仅要输出,还有操作// 方法一:for循环数组遍历时使用length,而集合遍历使用sizefor (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i)+2+"\t");}System.out.println();// 方法二:增强for循环for (Integer value : arrayList) {System.out.print(value+2+"\t");}

7. 给值找下标

  public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");arrayList.add("LiLi");arrayList.add("Fuck");arrayList.add("JiJi");// 从前往后,查找最近的System.out.println(arrayList.indexOf("Fuck"));// 从后往前,查找最近的System.out.println(arrayList.lastIndexOf("Fuck"));}

8. 查看集合是否为空

public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");// 集合是否为空System.out.println(arrayList.isEmpty());ArrayList<String> arrayList1 = new ArrayList<>();// 集合是否为空System.out.println(arrayList1.isEmpty());}

9. 删除

 public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");arrayList.add(null);System.out.println(arrayList);// 指定值删除,删除值为空的System.out.println(arrayList.remove(null));System.out.println(arrayList);}

public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");arrayList.add(null);System.out.println(arrayList);// 指定下标删除,删除值为空的System.out.println(arrayList.remove(3));System.out.println(arrayList);}

 

 public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");arrayList.add(null);System.out.println(arrayList);ArrayList<String> arrayList1 = new ArrayList<>();arrayList1.add("Fuck");arrayList1.add(null);// 根据arrayList1集合元素删除arrayList里的相同元素arrayList.removeAll(arrayList1);System.out.println(arrayList);}

 10.两个集合取交集(相同元素)

 public void arrayListTest() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);System.out.println(arrayList);ArrayList<Integer> arrayList1 = new ArrayList<>();arrayList1.add(3);arrayList1.add(5);System.out.println(arrayList1);// 取交集System.out.println(arrayList.retainAll(arrayList1));// 原理是取完交集后,放在arrayList中System.out.println(arrayList);}

11. 替换

 public void arrayListTest() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);System.out.println(arrayList);// 把3替换成4arrayList.set(2,4);System.out.println(arrayList);}

12.排序与倒序 

 由于此方法要使用拉姆达表达式,使用我们采用另一种方法。 

集合 (Java Platform SE 8 ) (oracle.com)

public void arrayListTest() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(7);arrayList.add(4);arrayList.add(0);arrayList.add(44);System.out.println(arrayList);// 排序,从小到大Collections.sort(arrayList);System.out.println(arrayList);// 倒序Collections.reverse(arrayList);System.out.println(arrayList);}

 13.取指定下标范围的值

public void arrayListTest() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(7);arrayList.add(4);arrayList.add(0);arrayList.add(44);System.out.println(arrayList);// 查找下标1到3的值;System.out.println(arrayList.subList(1,4));// 之所以下标是1-4是因为,这个查找原理是这样的:1 <= 下标范围 < 4}

五.Linked链表

  • ArrayList数组集合,增删慢,查询快
  • LinkedList链表集合,增删快,查询慢

 数组集合之所以增删慢,是因为增删时集合内元素要移动

 链表集合增删快,是因为链表集合增删时内部元素不需要移动

六.LinkedList一带而过 

  • 链表是数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址
  • 链表可分为单向链表和双向链表
  • 由于黑老大定下的规矩,所以它跟ArrayList方法差不多相同。

LinkedList (Java Platform SE 8 ) (oracle.com)

 七.iterator 迭代器初试

  • 迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需目标或结果
  • 每一次对过程的重复被称为一次“迭代”,而每一次迭代的结果会被用来作为下一次迭代的初始值

 迭代器Iterator用于Conllections家族 ,不管用于ArrayList还是LinkedList都可以迭代输出

 public void arrayListTest() {// 数组集合ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Tom");arrayList.add("Fuck");arrayList.add("Lise");// 使用方式Iterator<String> iterator = arrayList.iterator();// hasNext()判断是否有值while (iterator.hasNext()) {String value = iterator.next();System.out.println(value);}}

public void arrayListTest() {// 链表集合LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Tom");linkedList.add("Fuck");linkedList.add("Lise");// 使用方式Iterator<String> iterator = linkedList.iterator();// hasNext()判断是否有值while (iterator.hasNext()) {String value = iterator.next();System.out.println(value);}}

八.fori、增强for、迭代器的区别、谈谈三者性能

  • for循环适合数据的读取与修改
  • 增强for循环适合数据的读取
  • Iterator不要使用for循环嵌套使用,适合数据的读取与修改
      public void arrayListTest() {// 链表集合LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Tom");linkedList.add("Fuck");linkedList.add("Lise");// 使用方式Iterator<String> iterator = linkedList.iterator();// hasNext()判断是否有值while (iterator.hasNext()) {String value = iterator.next();// 删除Tomif (value.equals("Tom")) {// 要使用iterator自带的remove()方法iterator.remove();}}System.out.println(linkedList);}

增强for循环是一个小型的迭代器了,如果一定要在增强for循环中修改集合的话可以使用迭代器,但不建议在增强for循环中直接修改

 谈谈三者性能:比较时间复杂度

如果是 ArrayList ,用三种方式遍历的速度是for循环>Iterator>增强for循环,速度级别基本一致,一般都会用for循环或者增强for循环,因为Iterator写法相对复杂一些


如果是 LinkedList,则三种方式遍历的差距很大了,数据量大时越明显,Iterator>增强for循环>>>for循环,推荐使用增强for循环或者Iterator

List遍历:for,foreach Iterator 速度比较_list迭代器遍历执行慢-CSDN博客

九.Set和HashSet 

 HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合,允许有 null 值,是无序的,即不会记录插入的顺序。

 public void setTest() {// 使用Hash函数实现HashSet,元素无序,且不重复HashSet<String> hashSet = new HashSet<>();hashSet.add("Tom");hashSet.add("Fuck");hashSet.add("LiLi");hashSet.add("LiLi");hashSet.add("Fuck");System.out.println(hashSet);// 之所以输出后没有顺序且是唯一,是由于hashSet的每一个元素都会给应该hash值// hash值相当与身份证,不重复是唯一的}

关于Java的Hash算法的深入理解-CSDN博客

十.LinkedHashSet 

如果要创建有序集合呢?LinkedHashSet便是有序的不重复的

 public void setTest() {LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();linkedHashSet.add("Tom");linkedHashSet.add("Fuck");linkedHashSet.add("LiLi");linkedHashSet.add("LiLi");linkedHashSet.add("Fuck");System.out.println(linkedHashSet);}

十一.Map、HashMap、Entry 

 HashMap (Java Platform SE 8 ) (oracle.com)

 public void mapTest() {// 有两个泛型:第一个为key(钥匙),第二个为value(值)HashMap<Integer,String> hashMap = new HashMap<>();hashMap.put(10000000,"Fuck");hashMap.put(10000001,"Tom");hashMap.put(10000002,"LiLi");hashMap.put(10000003,"Man");System.out.println(hashMap);// 1.输出编号为10000000的人String value = hashMap.get(10000000);System.out.println(value);// 2.删除编号10000001的人hashMap.remove(10000001);System.out.println(hashMap);// 3.是否包含编号为10000002的人与叫Fuck的人System.out.println(hashMap.containsKey(10000002));System.out.println(hashMap.containsValue("Fuck"));// 4.替换编号为10000003的人的名字为DoghashMap.replace(10000003,"Dog");System.out.println(hashMap);// 5.保存编号Set<Integer> keys = hashMap.keySet();System.out.println(keys);// 6.保存编号与名字Set<Map.Entry<Integer, String>> entrySet = hashMap.entrySet();System.out.println(entrySet);}

已经存在的键值对,再次.put()会替换原来的,.get()不存在的值会返回null 

十二. Entry与Map转换Set之后遍历: Iterator<Entry<Integer,Integer>> iterator = entrySet.iterator(); 

  • 之所以使用Entry把Map转换Set是因为之后方便遍历
  • Entry就是用来管理键值对对象的,将对象包裹起来,提供遍历的方式
  • Entry可以使用迭代器,筛选值,但只适合在内存中使用,不适用于JDBC
  public void MapTest() {HashMap<Integer,Integer> hashMap = new HashMap<>();System.out.println("学生准考证号与成绩");hashMap.put(10000000,88);hashMap.put(10000001,49);hashMap.put(10000002,53);hashMap.put(10000003,83);hashMap.put(10000004,71);System.out.println(hashMap);System.out.println("80分以上的分数");// 使用Set保存学生准考证号与成绩方便遍历Set<Map.Entry<Integer,Integer>> entrySet = hashMap.entrySet();// 使用ArrayList保存80分以上的分数ArrayList<Integer> arrayList = new ArrayList<>();// 迭代器的泛型是Map.Entry<Integer,Integer>不要出错Iterator<Map.Entry<Integer,Integer>> iterator = entrySet.iterator();while (iterator.hasNext()) {// 取出学生成绩放入vaLueint value = iterator.next().getValue();// 判断80分以上的分数if (value > 80) {arrayList.add(value);}}System.out.println(arrayList);}

 

 十三.LinkedHashMap

HashMap是无序的,可以自定义泛型,而LinkedHashMap相当于有序的HashMap 

LinkedHashMap (Java Platform SE 8 ) (oracle.com) 

 

十四.集合框架部分结束 

剩下的类需要自己去学习了!了解各类是怎么实现的,以及其之间的区别,JDK的新特性暂时用不到,还没学习到框架 

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

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

相关文章

Mac如何配置Java环境

想必很多小伙伴会遇到配置Java环境的情况&#xff0c;今天就跟大家一起分享下我的安装过程&#xff0c;记录一下也是留给需要的小伙伴学习 一、下载和安装JDK 登录OracleJDK官网&#xff1a;https://www.oracle.com/java/technologies/downloads/&#xff0c;或者OpenJDK官网…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

反网络爬虫的三个阶段

随着网络爬虫的普及和网络攻击的日益复杂&#xff0c;升级网络安全措施成为保护网站和应用程序免受恶意爬虫侵害的必要举措。本文将深入研究反网络爬虫的三个阶段&#xff0c;并详细探讨IP地址过滤的策略&#xff0c;以提升网络的安全性。 第一部分&#xff1a;反网络爬虫的三…

射频芯片CMT2310-DEMO 通信覆盖测试体验

CMT2310是一款超低功耗,高性能的射频收发器,申请一套原厂CMT2310演示demo来验证下Sub-868设备在国内城市环境通信覆盖效果。 城市道路实测情况 测试小结&#xff1a;设备已基于外置天线&#xff0c;且以最佳方位做验证&#xff0c;但测试结果数据不是很理想。

Vue3 性能优化

代码分析 由于我们使用的是vite vite打包是基于rollup 的我们可以使用 rollup 的插件 npm install rollup-plugin-visualizervite.config.ts 配置 记得设置open 不然无效 import { visualizer } from rollup-plugin-visualizer; plugins: [vue(), vueJsx(),visualizer({open:…

C_14练习题答案

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1.下列属于计算机中高级语言的是(D) A. 机器语言 B.符号语言 C. 汇编语言 D. C语言 下列合法的标识符是(B)A. case B. …

【PS】制作 素描 + 遗照

复制一个图层 图像-调整-黑白 图片变成黑白图片&#xff08;好像遗照啊&#xff09; 新建一个图层&#xff0c;按住ATLDETELED 填充图层颜色为白色 &#xff08;设置一下颜色&#xff09; 设置混合模式为&#xff1a;颜色减淡 设置前景色为黑色。 选择毛笔工具&#xff0c;在…

[node] Node.js的内置模块

[node] Node.js的内置模块 Domain 模块使用方式方法概览属性示例 DNS 模块使用方式方法概览rrtypes 错误码示例 Net 模块使用方式方法概览net.Server方法事件 net.Socketnet.Socket 事件属性方法 示例 os使用方式方法概览示例 util使用方式常用方法util.callbackify~~util.inhe…

MyISAM与InnoDB存储引擎的区别

1、InnoDB支持事务&#xff0c;MyISAM不支持事务&#xff1b; 2、InnoDB支持外键&#xff0c;MyISAM不支持外键&#xff1b; 3、InnoDB和MyISAM的索引都是由B树数据结构实现的&#xff0c;它俩索引的不同为&#xff1a;InnoDB根据索引是否与数据进行绑定将索引分成了聚簇索引…

v-if和v-show的区别

v-if 条件性地渲染一块内容&#xff0c;这块内容只会在指令的表达式返回 truthy值的时候被渲染。 /**truthy&#xff08;真值&#xff09;指的是在布尔值上下文中&#xff0c;转换后的值为真的值。所有值都是真值&#xff0c;除非它们被定义为 假值&#xff08;即除 false、0、…

贝叶斯球快速检验条件独立

贝叶斯球 定义几个术语&#xff0c;描述贝叶斯球在一个结点上的动作&#xff1a; 通过&#xff08;pass through&#xff09;&#xff1a;从当前结点的父结点方向过来的球&#xff0c;可以访问当前结点的任意子结点&#xff08;父->子&#xff09;。从当前节点的子结点方向…

hive(2)

-- 复习 CREATE TABLE IF NOT EXISTS dept_partition ( deptno int, dname string, loc string ) partitioned BY(month string) row FORMAT delimited fields terminated BY \t ; DESC dept_partition; show partitions dept_partition; ALTER TABLE dept_part…

格雷编码(转换与计算)附代码

目录 格雷码对应表 格雷码转换公式 公式1 公式2 代码实现 格雷码对应表 十进制数 4位自然二进制码 4位典型格雷码 0 0000 0000 1 0001 0001 2 0010 0011 3 0011 0010 4 0100 0110 5 0101 0111 6 0110 0101 7 0111 0100 8 1000 1100 9 1001…

SpringSecurityoauth2.0自整理文档

被标记为资源的url不会走用户认证过滤器,所以通过createBefor>AuthFilter添加的过滤器无效 也就是在ResourceServerConfigurerAdapter实现类中配置的资源路径 记录一下手动加载用户和调用系统方法加载用户,以及他们的配置记录一下自动加载用户和自动密码校验的配置获取授权码…

十五、W5100S/W5500+RP2040之MicroPython开发<Modbus示例>

文章目录 1. 前言2. 相关网络信息2.1 简介2.2 指令构成2.3 优点2.4 应用 3. WIZnet以太网芯片4. Modbus TCP通信示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;Micr…

C语言-第十六周做题总结

id:374 A.求最大值及其下标 题目描述 本题要求编写程序&#xff0c;找出给定的n个数中的最大值及其对应的最小下标&#xff08;下标从0开始&#xff09;。 输入 输入在第一行中给出一个正整数n&#xff08;1<n≤10&#xff09;。第二行输入n个整数&#xff0c;用空格分开…

C++ 获取位域成员的位宽

C 中可以使用位域来节省内存&#xff0c;实现不同长度的数据的存放&#xff0c;例如&#xff1a; struct BF {uint32_t a1 : 4;uint32_t a2 : 5;uint32_t a3 : 6; } bf;结构体变量 bf 大小为 2 Byte&#xff0c;其成员变量 a1, a2, a3 分别占 4&#xff0c; 5&#xff0c; 6 位…

ApsaraMQ Serverless 演进之路,助力企业降本

作者&#xff1a;家泽 ApsaraMQ 与时俱进&#xff0c;砥砺前行 阿里云消息队列从诞生开始&#xff0c;至今已有十余年。今年&#xff0c;阿里云消息产品全面品牌升级为 ApsaraMQ&#xff0c;与时俱进&#xff0c;砥砺前行。 2012 年&#xff0c;RocketMQ 诞生于集团内部&…

测试理论知识八:敏捷开发测试、极限编程测试

1. 敏捷开发模式下的测试 敏捷开发的核心理念&#xff1a; 个体和互动高于流程和工具。 工作的软件高于详尽的文档。 客户合作高于合同谈判。 响应变化高于遵循计划。 2. 敏捷开发的特征 敏捷开发提倡迭代式和增量式的开发模式&#xff0c;并强调测试在其中的重要作用。这…

【Linux系统基础】(4)在Linux上部署Tomcat、Nginx软件

Tomcat安装部署【简单】 简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个W…