常用类和枚举入门-----

news/2024/5/25 9:36:06/文章来源:https://blog.csdn.net/2301_77565910/article/details/136690297

day 13

一、枚举

理解:

实现:1. 不需要提高Set方法,因为枚举对象通常为只读

2.对枚举对象、属性使用final + static 共同修饰,实现底层优化。

3.枚举对象名通常使用全部大写,常量的命名规范。

4.枚举根据对象需要,也可以有多个属性。

class Seanson{private String name;//季节名称private String description;//季节描述public String getName(){return name;}public String gerDescription(){return description;}private Season(String name,String description){this.name = name;this.description = description;}public  static final Season SPRING = new Season("春天","温度");public  static final Season SUMMER= new Season("夏天","温度");public  static final Season AUTUMN= new Season("秋天","温度");public  static final Season WINITER = new Season("冬天","温度");
}

枚举实现:

1.构造器私有化

  1. 在类中创建一组对象[四个春夏秋冬]

  2. 对外露对象(通过为对象添加public final static 修饰符)

  3. 提共get 方法但不提供set 方法(外部只能读)

使用enum 来实现枚举类:

  1. 使用关键字 enum 替代class

  2. 如:public static final Season SPRING = new Season("春天","温暖")直接使用 SPRING ("春天","温暖")

  3. 如果有多个常量对象,使用逗号隔开最后一个用分号。

  4. 如果使用enum 来实现枚举类,要求将将定义常量对象写在最前面

enum  Season2{SPRING ("春天","温暖"),SUMER("夏天","炎热")....;
}

enum关键字实现枚举注意事项:

  1. 当使用enum 关键字开发枚举类时,默认会继承Enume类

  2. 如果使用无参构造器创建枚举对象,则实参列表和小括号可以省略

enum Gender{BOY,GIRL;
}

二、包装类(重点):

知识点:包装类的使用 含义:8种基本数据类型对应的类 出现原因: Java为纯面向对象语言(万物皆对象),但是8种基本数据类型不能new对象, 就破坏了Java为纯面向对象语言的特征,所以Java又为8种基本数据类型匹配了对应的类,这种类叫做包装类/封装类

基本数据类型包装类继承类
byteByteObject.Number.Byte
shortShortObject.Number.Short
intIntegerObject.Number.Integer
longLongObject.Number.Long
folatFloatObject.Number.Float
doubleDoubleObject.Number.Double
charCharacterObject.Character
booleanbooleanObject.Boolean

注意:int类型的包装类为Integer,char类型的包装类为Character,其余的包装类都是基本数据类型的首字母大写

1.integer 底层实现:

  //该类MyInteger类缓存类private static class MyIntegerCache{public static final int low = -128;public static final int high = 127;public static final MyInteger[] cache;//存储MyInterger对象的缓存类数据static{cache = new MyInteger[high -low +1];int j = low;for(int i = 0;i<cache.length;i++){cache[i] = new MyInteger(j++);}}}

package com.day13.test;
/***   * */
public class Test01 {public  static void main(String[] args){//手动装箱  基本数据类型转换成对象int  i = 100;Integer integer= Integer.valueOf(i);System.out.println(integer);//手动拆箱Integer integer1 = new Integer(100);int i1 = integer1.intValue();System.out.println(i1);//自动装箱int  i = 100;Integer integer = i;System.out.println(integer);//自动拆箱Integer integer = new Integer(100);int i = integer;System.out.println(i);//拓展:将string 转换成int String str = "123";int num = Integer.parseInt(str);System.out.println(num);}
}
​
​
//重点:package com.day13.test;
​
public class MyInteger {private final int value;public MyInteger(int value){this.value = value;}public static MyInteger valueOf(int i  ){if(i >= MyIntegerCache.low && i <= MyIntegerCache.high){return MyIntegerCache.cache[i -MyIntegerCache.low];}return new MyInteger(i);}public String toString(){return String.valueOf(value);}public int intValue(){return value;}//该类MyInteger类缓存类private static class MyIntegerCache{public static final int low = -128;public static final int high = 127;public static final MyInteger[] cache;//存储MyInterger对象的缓存类数据static{cache = new MyInteger[high -low +1];int j = low;for(int i = 0;i<cache.length;i++){cache[i] = new MyInteger(j++);}}}
}
​

测试类:

package com.day13.test;
/*** 包装类深入* *   * */
public class Test02 {public static void main(String[] args) {//封箱Integer integer1 = Integer.valueOf(100);Integer integer2 = Integer.valueOf(100);System.out.println(integer1 == integer2);//true Integer integer3= Integer.valueOf(200);Integer integer4 = Integer.valueOf(300);System.out.println(integer3 == integer4);//falseSystem.out.println(integer1);System.out.println(integer2);System.out.println(integer3);System.out.println(integer4);System.out.println("===============================integer底层如下");MyInteger myInteger1 = MyInteger.valueOf(100);MyInteger myInteger2 = MyInteger.valueOf(100);System.out.println(myInteger1 == myInteger2);  MyInteger myInteger3 = MyInteger.valueOf(200);MyInteger myInteger4 = MyInteger.valueOf(300);System.out.println(myInteger3 == myInteger4);  //打印对象System.out.println(myInteger1);System.out.println(myInteger2);System.out.println(myInteger3);System.out.println(myInteger4);//打印基本数据类型integerSystem.out.println(myInteger1.intValue());System.out.println(myInteger2.intValue());System.out.println(myInteger3.intValue());System.out.println(myInteger4.intValue());
}
}
​

面试题

       MyInteger myInteger1 = MyInteger.valueOf(100);MyInteger myInteger2 = MyInteger.valueOf(100);System.out.println(myInteger1 == myInteger2); //ture MyInteger myInteger3 = MyInteger.valueOf(200);MyInteger myInteger4 = MyInteger.valueOf(300);System.out.println(myInteger3 == myInteger4);  //fase

ture因为 myInteger1 == myInteger2 是相同对象指针指向的是同一个地址

false因为integer 的取值范围在-128~127之间,200和300超出了integer 取值范围,myInteger3 == myInteger4,属于两个不同的对象指向不同的地址所有两个地址不同值也不同。

三、常用类:

字符串类:

  1. String

  2. StringBuffer 安全的,因为它会对线程上锁,确保了信息私密性。

  3. StringBuilder 线程不安全 。

底层:

String -> char[]

面试题:

StringBuilder:线程不安全,在单线程的情况下使用 StringBuffer:因为方法上加锁(synchronized),线程安全,在多线程的情况下使用。

注意:

StringBuffer和StringBuilder使用是一样的

1. String类使用:

知识点:字符串类 分类: String StringBuffer StringBuilder

底层:

 public class String{//常量类型的字符数组final char[] value; //不可扩容}//StringBuilder和StringBuffer都是可变的字符串public class AbstractStringBuilder{char[] value; //可扩容}public class StringBuffer extends AbstractStringBuilder{}public class StringBuilder extends AbstractStringBuilder{}

str.concat("DEF123");//在末尾追加字符串,并返回新的
str.substring(2);//从指定下标处截取到字符串末尾,并返回新的字符串
str.substring(1, 7);//从开始下标处(包含)截取到结束下标处(排他),并返回新的字符串
str.toLowerCase();//转小写,并返回新的字符串
str.toUpperCase();//转大写,并返回新的字符串
str.trim();//去除首尾空格,并返回新的字符串
str.replace('c', 'C');//替换字符,并返回新的字符串
str.replaceFirst("12", "xx");//替换第一次出现的字符串,并返回新的字符串str.replaceAll("3", "888");//替换字符串,并返回新的字符串str.replaceAll(" ", "");//去除空格str.indexOf("888") //获取字符串第一次出现的下标str.lastIndexOf("888")//获取字符串最后一次出现的下标str.charAt(7)// 获取指定下标上的字符​

package com.ady.string_class;
​
import java.util.Arrays;
​
public class Test01 {
​public static void main(String[] args) {​String str = "123abc";str = str.concat("DEF123");//在末尾追加字符串,并返回新的字符串str = str.substring(2);//从指定下标处截取到字符串末尾,并返回新的字符串str = str.substring(1, 7);//从开始下标处(包含)截取到结束下标处(排他),并返回新的字符串str = str.toLowerCase();//转小写,并返回新的字符串str = str.toUpperCase();//转大写,并返回新的字符串str = "   123a  bcD  EF12  3   ";str = str.trim();//去除首尾空格,并返回新的字符串str = str.replace('c', 'C');//替换字符,并返回新的字符串str = str.replaceFirst("12", "xx");//替换第一次出现的字符串,并返回新的字符串str = str.replaceAll("3", "888");//替换字符串,并返回新的字符串str = str.replaceAll(" ", "");//去除空格System.out.println("获取字符串第一次出现的下标:" + str.indexOf("888"));//2System.out.println("获取字符串最后一次出现的下标:" + str.lastIndexOf("888"));//13System.out.println("获取指定下标上的字符:" + str.charAt(7));//CSystem.out.println("判断两个字符串是否相同(区分大小写):" + str.equals("xx888abCDEF12888"));//trueSystem.out.println("判断两个字符串是否相同(不区分大小写):" + str.equalsIgnoreCase("xx888ABCdef12888"));//trueSystem.out.println("判断字符串是否以某个字符串开头:" + str.startsWith("xx8"));//trueSystem.out.println("判断字符串是否以某个字符串结尾:" + str.endsWith("12888"));//true//将字符串转换为字符数组char[] charArray = str.toCharArray();System.out.println(Arrays.toString(charArray));//[x, x, 8, 8, 8, a, b, C, D, E, F, 1, 2, 8, 8, 8]//将其他类型转换为字符串System.out.println(String.valueOf(123));//int -> StringSystem.out.println(String.valueOf(123.123));//double -> StringSystem.out.println(String.valueOf('A'));//char -> StringSystem.out.println(String.valueOf(true));//boolean -> String//将其他类型转换为字符串 -- 简单版本System.out.println(123 + "");System.out.println(123.123 + "");System.out.println('A' + "");System.out.println(true + "");}
​
}
​

2. StringBuffer的使用

package com.ady.string_class;
​
public class Test02 {/*** 知识点:StringBuffer的使用*/public static void main(String[] args) {StringBuffer sb = new StringBuffer();//将字符串追加到末尾sb.append("123abc");sb.append("DEF123");//将字符串插入到指定下标的位置sb.insert(6, "XXX");//从开始下标处(包含)替换到结束下标处(排他)的字符串sb.replace(6, 9, "XYl");//删除指定下标处的字符sb.deleteCharAt(5);//从开始下标处(包含)删除到结束下标处(排他)的字符串sb.delete(3, 11);//反转字符串sb.reverse();System.out.println(sb);}
}
​

3.StringBuilder的使用

package com.qf.string_class;
​
public class Test03 {/*** 知识点:StringBuilder的使用*/public static void main(String[] args) {StringBuilder sb = new StringBuilder();//将字符串追加到末尾sb.append("123abc");sb.append("DEF123");//将字符串插入到指定下标的位置sb.insert(6, "XXX");//从开始下标处(包含)替换到结束下标处(排他)的字符串sb.replace(6, 9, "XYl");//删除指定下标处的字符sb.deleteCharAt(5);//从开始下标处(包含)删除到结束下标处(排他)的字符串sb.delete(3, 11);//反转字符串sb.reverse();System.out.println(sb);
}
​

四、String 类深入

1.知识点:深入String -- 创建对象
package com.ady.string_class;
​
public class Test06 {/*** 知识点:深入String -- 字符串频繁拼接问题* * 注意:字符串频繁拼接使用StringBuilder 或 StringBuffer*/public static void main(String[] args) {//获取1970.1.1 0:0:0到现在的毫秒数(1000毫秒=1秒)//long currentTimeMillis = System.currentTimeMillis();//      long startTime = System.currentTimeMillis();
//      String str = "琉璃";
//      for (int i = 0; i < 100000; i++) {
//          str += "皇冠给你带";//底层实现://  str = str + "小可爱,皇冠给你带";
//  str = new StringBuilder(String.valueOf(str)).append("小可爱,皇冠给你带").toString();
//      }
//      long endTime = System.currentTimeMillis();
//      System.out.println("消耗时长:" + (endTime-startTime));long startTime = System.currentTimeMillis();StringBuilder sb = new StringBuilder(900000);//减少底层容器的伸缩性(减少底层容器的扩容次数)sb.append("蒋羽");for (int i = 0; i < 100000; i++) {sb.append("小可爱,皇冠给你带");}long endTime = System.currentTimeMillis();System.out.println("消耗时长:" + (endTime-startTime));//16}
}
​
2. 深入StringBuilder 和 StringBuffer

知识点:深入StringBuilder 和 StringBuffer的底层原理

  • 知识点:深入StringBuilder 和 StringBuffer的底层原理

  • StringBuilder:线程不安全,在单线程的情况下使用

  • StringBuffer:因为方法上加锁(synchronized),线程安全,在多线程的情况下使用

package com.ady.string_class;
​
public class Test07 {public static void main(String[] args) {//底层默认创建16个长度字符数组//StringBuilder sb = new StringBuilder();//底层创建10000个长度字符数组//StringBuilder sb = new StringBuilder(10000);//底层创建str.length() + 16 个长度字符数组//StringBuilder sb = new StringBuilder("琉璃");//sb.append("aaa");//sb.append("bbb");//底层默认创建16个长度字符数组//StringBuffer sb = new StringBuffer();//底层创建10000个长度字符数组//StringBuffer sb = new StringBuffer(10000);//底层创建str.length() + 16 个长度字符数组StringBuffer sb = new StringBuffer("琉璃");sb.append("aaa");sb.append("bbb");}
}
​

3.String vs StringBuffer vs StringBuilder

知识点:String vs StringBuffer vs StringBuilder

​
package com.ady.string_class;
​
public class Test08 {/*** 知识点:String vs StringBuffer vs StringBuilder* * String是不可变的字符串* public class String{*      final char[] value;//不可扩容* }* * StringBuffer和StringBuilder是可变的字符串* * public class AbstractStringBuilder{*      char[] value;//可扩容* }* * public class StringBuffer extends AbstractStringBuilder{}* * public class StringBuilder extends AbstractStringBuilder{}* */
}
​

面试题:

package com.ady.string_class;
​
public class Test04 {/*** 知识点:深入String -- 创建对象*/public static void main(String[] args) {//面试题1:描述下列代码创建多个少String对象?//答案:1个,“abc”作为字面值常量,是放在常量池中,常量池中的数据不允许重复
//      String str1 = "abc";//0x11
//      String str2 = "abc";//0x11
//      System.out.println(str1 == str2);//true
​//面试题2:描述下列代码创建多个少String对象?//答案:3个,"abc"+new出来的两个String对象String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1 == str2);//false}
}
​

package com.day13.Test01;
​
public class Test02 {public static void main(String[] args) {String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2);//tureString str5 = "abc";String str6 = "abc";System.out.println(str5 == str6);//tureString str3 = "ab"+"b";String str4 = "abc";System.out.println(str3 == str4); //falseString str7 = "ab"+"c"; //在编译的时候就已经拼接完了System.out.println(str7 == str1);//turefinal String s1 = "ab";final String s2 = "c";  //在常量池的时候就已经拼接了System.out.println(s1 == str4);String  s3 = "ab";String s4 = "c";String str12 = s3 +s4; 
//底层:new  StringBuidler(String.valueOf().appdend(s4).toString();)System.out.println(str12 == str5);//false}
}
​
package com.day13.Test01;
/**字符串拼接问题
*/
public class Test01 {public static void main(String[] args) {String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2);
//ture原因是str1和str2 都是同一个数组空间,指向的是同一地址String str3 = new String("abc");String str4 = new String("abc");System.out.println(str3 == str4);  
//false  原因是str3 和 str4 都新new 对象各自开辟的内存空间,不属于同以地址的不同对象所以它俩不同。}
}
​

知识点:深入String -- 字符串频繁拼接问题package com.day13.Test01;public class Test04 {public static void main(String[] args) {//底层默认创建16个长度字符数组//StringBuilder sb = new StringBuilder();//底层创建1000个长度字符数组//StringBuilder sb= new StringBuilder(1000);//底层创建str.length() + 16个长度字符数组//StringBuilder sb = new StringBuilder("莉莉");//sb.append("aaa");//sb.append("bbb");//底层默认创建16个长度字符数组//StringBuffer sb = new StringBuffer();//底层创建10000个长度字符数组//StringBuffer sb = new StringBuffer(10000);//底层创建str.length() + 16 个长度字符数组StringBuffer sb = new StringBuffer("莉莉");sb.append("aaa");sb.append("bbb");System.out.println(sb);}
}

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

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

相关文章

Arduino IDE的下载和安装

一、Arduino的介绍 Arduino是一款开源电子原型平台&#xff0c;主要包含两部分&#xff1a;硬件&#xff08;各种型号的Arduino板&#xff09;和软件&#xff08;Arduino IDE&#xff09;。这个平台由意大利的Massimo Banzi、David Cuartielles等人共同开发设计&#xff0c;并于…

express+mysql+vue,从零搭建一个商城管理系统11--使用Sequelize

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、安装sequelize和mysql2二、修改config/db.js三、修改models/user.js&#xff0c;models/shop.js&#xff0c;models/goods.js四、新建dao/user.js&#xff0c;dao/shop.js&#xff0c;dao/goods.js五、修…

深度解析Nginx正向代理的原理与实现

目录 前言 1. 什么是正向代理 2. Nginx正向代理的配置 3. Nginx正向代理的实现原理 4. 示例代码 5. 总结 前言 Nginx是一个高性能的Web服务器和反向代理服务器&#xff0c;但它也可以用作正向代理服务器。本文将深入解析Nginx正向代理的原理和实现&#xff0c;并提供相关…

如何让Windows 10的开始菜单回到7的样子?这里提供详细步骤

前言 在新版本的Windows推出时,你可能会听到一个抱怨,那就是他们对开始菜单做了什么,如果你只想让Windows 10中的开始菜单像Windows 7的开始菜单那样外观和功能,我们将提供帮助。 准备条件 除了Windows 10安装之外,我们唯一需要的是一个非常方便的小程序,那就是Classic…

前端基础篇-深入了解 HTML 表格标签、表单标签和表单项标签

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 表格标签概述 1.1 表格标签定义 2.0 表单标签概述 2.1 表单标签定义 3.0 表单项标签概述 3.1 表单项标签定义 1.0 表格标签概述 顾名思义&#xff0c;就是用来…

分享一下 iOS 发布/测试证书 申请过程

1.使用 已开通iOS开发者 的账号登陆 Apple Developer Apple Developer 2.点击下图右上角的 Account&#xff08;账户&#xff09; 点击下图中的 certificates&#xff08;证书&#xff09; 然后会挑战至下图所示页面 3.然后先要注册一个 App id 点击 register 就完成了 4.…

数字化转型导师坚鹏:基于湖北产业的科技金融创新模式与案例研究

基于湖北产业政策的科技金融创新模式与案例研究 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚科技金融有哪些利好政策&#xff1f; 不知道科技金融有哪些成功案例&#xff1f; 不知道科技金融有哪些创新模式&#xff1f; 课程特色&#xff1a; 有…

【LeetCode: 2864. 最大二进制奇数 + 模拟 + 位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Android SDK 开发 云托管

开发SDK,拒绝重复造轮子。 本文陈述两种SDK开发方式&#xff0c;第一种AAR方式&#xff1b;第二种远程依赖方式。 具体步骤分为&#xff1a; 一、如何开发SDK&#xff1f; 二、如何打包AAR&#xff1f; 三、如何打包AAR&#xff1f; 四、如何进行SDK远程托管&#xff1f; 五、如…

【LeetCode热题100】21. 合并两个有序链表(链表)

一.题目要求 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入…

webpack5零基础入门-6webpack处理图片资源

1.在webpack5中file-loader和url-loader为内置模块 通过在加载器中配置rule即可激活 {test: /\.(png|jpe?g|gif|webp)$/,type: asset} 2.使用webpack进行打包 执行npx webpack 可以看到图片资源打包后都被放到了dist文件目录下 3.使用webpack进行图片格式转换为base64 优势…

Vue.js+SpringBoot开发考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

Midjourney绘图欣赏系列(九)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

Apache SeaTunnel MongoDB CDC 使用指南

随着数据驱动决策的重要性日益凸显&#xff0c;实时数据处理成为企业竞争力的关键。SeaTunnel MongoDB CDC(Change Data Capture) 源连接器的推出&#xff0c;为开发者提供了一个高效、灵活的工具&#xff0c;以实现对 MongoDB 数据库变更的实时捕获和处理。 本文将深入探讨该连…

如何使用ChatGPT辅助写论文、数据分析、AI绘图?【附学习资料】

原文链接&#xff1a;如何使用ChatGPT辅助写论文、数据分析、AI绘图&#xff1f;【附学习资料】https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597452&idx1&sn8aa991235ffee89fc76590a90b9005d7&chksmfa823c6bcdf5b57df0cb02ecd1821921f38ea6de34c7…

【MMDetection3D实战(2)】: 利用MMDet3D预训练模型进行推理

安装完成MMDet3D环境后,我们就可以基于MMDet3D提供的预训练模型在点云和单目图像上进行推理。 下图是利用是基于预训练模型的推理结果,可以看到无论是基于点云还是图像,它都能给出一个正确的推理结果,把对应的car和motor的3D box正确的框出来。 推理的实现很简单,大体分…

【git】GitHub仓库没有 Contribution activity

解决方案 检查并更改本地的 git 绑定的邮箱和名字 git config --global user.name "Your New Name" git config --global user.email "yournewemailexample.com"查询方式 git config --global user.name git config --global user.email成功显示

【SQL】1070. 产品销售分析 III(窗口函数)

题目描述 leetcode题目&#xff1a;1070. 产品销售分析 III 方法一&#xff1a;窗口函数 select product_id, year as first_year, quantity, price from (select *,dense_rank() over(partition by product_id order by year) as rkfrom Sales ) A where A.rk 1方法二 …

IDEA开启Run Dashboard

1、Run Dashboard是什么&#xff0c;为什么要使用 Run Dashboard 是 IntelliJ IDEA 中的一个工具窗口&#xff0c;用于管理和监视项目中正在运行的应用程序和配置。它提供了一种集中管理运行和调试过程的方式&#xff0c;可以让开发人员更方便地查看和控制正在运行的应用程序。…

【Swing】Java Swing实现省市区选择编辑器

【Swing】Java Swing实现省市区选择编辑器 1.需求描述2.需求实现3.效果展示 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在公司的一个 Swing 的项目上需要实现一个选择省市区的编辑器&#xff0c;这还是第一次做这种编辑器&#xf…