糊涂(Hutool)工具常见的使用方法

 简介:

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

 

安装:

在我们的maven中引入糊涂的依赖即可

<!--引入Hutool工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>

因为我们使用的是单元测试,所以我们还需要引入junit的依赖。如果是spring boot项目,就不需要引入,引入junit,因为springboot已经继承了,要是maven项目就需要引入。

<!--引入junit单元测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><scope>test</scope></dependency>

集合类:

集合工具-ColUtil

主要封装了对数组和集合类的操作

新建一个ColUtilTest测试类:

public class ColUtilTest {}

在这个类上添加  @Slf4j注解

@Slf4j
public class ColUtilTest {}
join方法:

就是将一个集合转换成字符串。

    @Test@DisplayName(value = "测试集合转成字符串")void testListToStr(){String[] str = {"a","b","c","d"};ArrayList<String> list = CollUtil.newArrayList(str);String join = CollUtil.join(list, ","); //用指定分隔符分割log.info(join);}
sortPageAll方法

这是一个组合方法,功能是将给定的多个集合放到一个集合(list)中,根据给定的Comparator对象排序,然后分页取数据。

 

    @Test@DisplayName(value = "合并集合到一个集合中,并按照分页的数据按需取出")void testToList(){//Integer类型的比较器Comparator<Integer> comparator = new Comparator<>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}};//新建三个集合ArrayList<Integer> list1 = CollUtil.newArrayList(1, 2, 3);ArrayList<Integer> list2 = CollUtil.newArrayList(4, 5, 6);ArrayList<Integer> list3 = CollUtil.newArrayList(7, 8, 9);//把list1,list2,list3,按照从小到大排序,取 0~3个List<Integer> result = CollUtil.sortPageAll(0, 3, comparator, list1, list2, list3);System.out.println(result);}
popPart方法

传入一个栈对象,然后弹出指定数目的元素对象,弹出是指pop()方法,会从原栈中删掉。并否则删除的元素。

    @Test@DisplayName(value = "测试出栈")void testPopPart(){Stack stack = new Stack();stack.push(1);stack.push(2);stack.push(3);stack.push(4);List popPart = CollUtil.popPart(stack, 2);System.out.println(popPart);  //输出,出栈的元素System.out.println(stack);  //查看原来的stack}
append方法:

在数组末尾添加一个元素,其实就是List.add()方法实现的。

    @Test@DisplayName(value = "给数组末尾添加元素")void testToAppend(){Integer[] ids = {4,5};Integer[] append = ArrayUtil.append(ids, 1, 2, 3);System.out.println(Arrays.toString(append));     //输出数组元素System.out.println(ArrayUtil.toString(append));  //输出数组元素}
resize方法

重新调整数组的大小,如果调整后的大小比原来小,截断,如果比原来大,则多出的位置用null补位。

    @Test@DisplayName("重新调整数据的大小")void testResize(){Object[] array = ArrayUtil.newArray(5);  //创建一个长度为5的数组array[0] = 1;array[1] = 2;array[2] = 3;array[3] = 4;System.out.println(ArrayUtil.toString(array));   //输出数据的数据System.out.println(ArrayUtil.length(array));  //查看这个数组的长度Object[] resize = ArrayUtil.resize(array, 3);  //调整数组大小为3System.out.println(ArrayUtil.length(resize));   //输出调整后数组的大小System.out.println(ArrayUtil.toString(resize));Object[] newSize = ArrayUtil.resize(resize, 6);  //调整数组大小为6System.out.println(ArrayUtil.toString(newSize)); //测试新数组里面的数据System.out.println(ArrayUtil.length(newSize));  //测试新数组的长度}
addAll方法

将多个集合添加到一个Collection

    @Test@DisplayName(value = "把多个集合,合并到一个集合中")void testAddAll(){Collection coll = new ArrayList();coll.add(88);coll.add(99);Collection<Integer> collection = CollUtil.addAll(CollUtil.newArrayList(1, 2, 3, 4), CollUtil.newArrayList(6, 7, 8));collection.addAll(coll);System.out.println(collection);}
sub方法

对集合切片,其他类型的集合会转换成List,

自动修正越界等问题,完全避免IndexOutOfBoundsException异常。

    @Test@DisplayName(value = "测试对集合进行切片")void testSubList(){ArrayList<Integer> list = CollUtil.newArrayList(1, 2, 3, 4, 5, 6);List<Integer> subList = CollUtil.sub(list, 0, 3);System.out.println(subList);  //输出切片的数据System.out.println(CollUtil.sub(list, 0, list.size() + 3)); //已经明显超出集合长度了System.out.println(list);   //原集合}
isEmpty,isNotEmpty方法

判断集合是否为空(包括null和没有元素的集合)

    @Test@DisplayName(value = "list集合转成map")void testListToMap(){ArrayList<Integer> keys = CollUtil.newArrayList(1, 2, 3, 4);ArrayList<String> values = CollUtil.newArrayList("a", "b", "c", "d");Map<Integer, String> map = CollUtil.zip(keys, values);System.out.println(map);}
zip方法

给定两个集合,然后两个集合中的元素一一对应,组成一个Map。此方法还有一个重载方法,可以传字符,然后给定分隔符,字符串会被split成列表。

    @Test@DisplayName(value = "list集合转成map")void testListToMap(){ArrayList<Integer> keys = CollUtil.newArrayList(1, 2, 3, 4);ArrayList<String> values = CollUtil.newArrayList("a", "b", "c", "d");Map<Integer, String> map = CollUtil.zip(keys,values);System.out.println(map);}

列表工具-ListUtil

List在集合中使用最为频繁,因此新版本的Hutool中针对List单独封装了工具方法

indexOfAll方法 

查找某个元素,在集合中的位置(返回的是索引)

    @Test@DisplayName(value = "查找某个元素在集合中出现的位置")void test1(){LinkedList<String> linkedList = ListUtil.toLinkedList("1", "2", "3", "4", "3", "2", "1");int[] ints = ListUtil.indexOfAll(linkedList, "2"::equals);  //输出的是索引System.out.println(ArrayUtil.toString(ints));}
快速生成list集合方法:

用下面的方法,可以帮助我们快速的生成list集合。

    @Test@DisplayName(value = "快速生成list集合")void testFindOption(){List<Integer> list = ListUtil.of(1, 2, 3, 4, 5);list.forEach(l ->{System.out.println(l);  //遍历集合});ArrayList<Integer> arrayList = ListUtil.toList(1, 2, 3, 4);System.out.println(arrayList);LinkedList<Integer> linkedList = ListUtil.toLinkedList(1, 2, 3, 4, 5, 6, 7);System.out.println(linkedList);List<Integer> integerList = Arrays.asList(1, 2, 3, 4);System.out.println(integerList);}
sub方法

此方法是列表截取,根据起始索引截取。不会影响原来的集合

    @Test@DisplayName(value = "集合数据截取")void testSubList(){ArrayList<Integer> list = ListUtil.toList(1, 2, 3, 4, 5, 6);List<Integer> sub = ListUtil.sub(list, 0, 3);System.out.println(sub);  //截取出来的集合System.out.println(list); //原集合}
sortByProperty方法

按照bean对象的某个数字类型的字段值排序

先创建一个 TestBean实体类对象,添加 @Data,和@AllArgsConstructor注解

    @Data@NoArgsConstructor@AllArgsConstructorclass TestBean{private Integer id;private String name;}

    @Test@DisplayName(value = "按照我们自定义的bean对象中的id属性排序")void testSort(){ArrayList<TestBean> list = ListUtil.toList(new TestBean(2, "测试2"),new TestBean(4, "测试4"),new TestBean(1, "测试1"),new TestBean(3, "测试3"));list.forEach(System.out::println);  //排序前ListUtil.sortByProperty(list,"id");System.out.println("************************************************");list.forEach(l -> System.out.println(l));  //排序后}
swapTo方法

将指定元素和指定下标位置的元素交换位置

    @Test@DisplayName(value = "元素交换")void testSwap(){List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);ListUtil.swapTo(list,5,1);  // 元素为5 的和下标是1的交换位置System.out.println(list);}
partition方法
  • 这个方法起到分组的作用。
  • 通过传入要分组的集合,每个分组区间的大小,将一个集合分成不同的块。

    @Test@DisplayName(value = "集合分组")void testPart(){ArrayList<Integer> list = ListUtil.toList(1, 2, 3, 4, 5, 6,7);List<List<Integer>> partition = ListUtil.partition(list, 3); //三个元素是一组System.out.println(partition);System.out.println(ListUtil.partition(list, 2));  //两个元素是一组}

开发中常用工具类:

随机工具-RandomUtil

RandomUtil主要针对JDK中Random对象做封装,严格来说,Java产生的随机数都是伪随机数,所以Hutool封装后产生的随机结果也是伪随机结果。

新建一个 RandomTest测试类:在添加@slf4j注解

@Slf4j
@DisplayName(value = "测试生成随机数")
public class RandomTest {}

randomInt方法
  • RandomUtil.randomInt 获得指定范围内的随机数
  • 前包后不包

      @Test@DisplayName("测试生成指定范围的随机数")void randomTest1(){log.info("测试生成指定范围的随机数");for (int i = 0; i < 100; i++) {int random = RandomUtil.randomInt(10, 100);if (random == 10){log.info("包含了{}",random);}if (random == 100){log.info("包含了{}",random);}System.out.println("生成的随机数是:"+random);}}
randomBytes 方法
  • 生成一个 byte类型范围内的随机数,包含正数和负数。
  • 可以传递一个参数,表示生成几个。

    @Test@DisplayName("测试生成在byte范围内的随机数,包括正数和负数,返回在一个数组中")void randomTest2(){log.info("测试生成在byte范围内的随机数,包括正数和负数,返回在一个数组中");byte[] bytes = RandomUtil.randomBytes(10);System.out.println(ArrayUtil.toString(bytes));}
randomString 方法
  • 获得一个随机的字符串(只包含数字和字符)
  • 传入一个参数指定,生成的随机字符串的长度

    @Test@DisplayName(value = "获得一个随机的字符串(包含数字和字符)")void testRandomStr(){String s1 = RandomUtil.randomString(10);String s2 = RandomUtil.randomString(4);System.out.println(s1);System.out.println(s2);}
randomNumbers 方法

 获得一个只包含数字的字符串

    @Test@DisplayName(value = "获得一个随机的字符串(包含数字)")void testRandomNums(){String numbers1 = RandomUtil.randomNumbers(10);String numbers2 = RandomUtil.randomNumbers(7);System.out.println(numbers1);System.out.println(numbers2);}
唯一 ID工具-IdUtil

唯一ID生成应用十分广泛,生成方法也多种多样,Hutool针对一些常用生成策略做了简单封装。

唯一ID生成器的工具类,涵盖:

  • UUID
  • ObjectId(MongoDB)
  • Snowflake(Twitter)
UUID

UUID全称通用唯一识别码(universally unique identifier),JDK通过java.util.UUID提供了 Leach-Salz 变体的封装。Hutool中,生成一个UUID字符串方法如下: 

我们先新建一个测试类:UuidTest,然后加上@Slf4j的注解

@Slf4j
@DisplayName(value = "UUID的测试类")
public class UuidTest {}
randomUUID方法

生成的UUID是带 - 的字符串

    @Test@DisplayName(value = "测试生成带 - 的UUID")public void testId1(){log.info("测试生成带 - 的UUID");String uuid = cn.hutool.core.util.IdUtil.randomUUID();System.out.println(uuid);
simpleUUID方法

生成不带 - 的字符串

    @Test@DisplayName(value = "测试生成不带 - 的UUID")public void testId2(){log.info("测试生成不带 - 的UUID");String uuid = cn.hutool.core.util.IdUtil.simpleUUID();System.out.println(uuid);}

说明:

Hutool重写了java.util.UUID的逻辑,使用糊涂工具生成不带 - UUID字符串,不需要做字符串替换,性能提高一倍左右。

ObjectId

ObjectId是MongoDB数据库的一种唯一ID生成策略,是UUID version1的变种

我们新建一个ObjectIdTest测试类,加上@Slf4j的注解。

@Slf4j
@DisplayName(value = "ObjectId的测试类")
public class ObjectIdTest {}
next方法

生成类似于: 5bsf78fg878dsg7svdsf98dsds9

    @Test@DisplayName(value = "测试生成一串的ObjectId")void testObjectIdTest1(){log.info("测试生成一大串的ObjectId");String next = ObjectId.next();System.out.println(next);}
objectId方法

这个方法是 Hutool-4.1.14才开始提供

    @Test@DisplayName(value = "测试生成一串的ObjectId")void testObjectIdTest2(){log.info("测试生成一大串的ObjectId");String id = IdUtil.objectId();System.out.println(id);}

数组工具-ArrayUtil

数组工具类主要是解决对象数组(包括包装类型数组)和原始类型数组使用方法不统一的问题。

 新建一个ArrayUtilTest测试类,加上@Slf4j注解

@Slf4j
public class ArrayUtilTest {}

isEmpty方法

数组的判空类似于字符串的判空,标准是null或者数组长度为0,ArrayUtil中封装了针对原始类型和泛型数组的判空和判非空:

    @Test@DisplayName(value = "测试数组是否为空")void testIsEmpty(){int[] a = {};int[] b = null;int[] c = {1,2,3};System.out.println(ArrayUtil.isEmpty(a));System.out.println(ArrayUtil.isEmpty(b));System.out.println(ArrayUtil.isEmpty(c));}
isNotEmpty方法

    @Test@DisplayName(value = "测试非空判断")void testIsNotEmpty(){int[] a = {};int[] b = null;int[] c = {1,2,3};System.out.println(ArrayUtil.isNotEmpty(a));System.out.println(ArrayUtil.isNotEmpty(b));System.out.println(ArrayUtil.isNotEmpty(c));}
newArray方法

新建泛型数组。

Array.newInstance并不支持泛型返回值,在此封装此方法使之支持泛型返回值。

    @Test@DisplayName(value = "新建泛型数组")void testNewArray(){Object[] strArr = ArrayUtil.newArray(String.class, 4);strArr[0] = "1";strArr[1] = "2";strArr[2] = "8";System.out.println(ArrayUtil.toString(strArr));}

我的泛型是 String类型的,在给数组添加新元素的时候,如果添加 其他类型,比如 Integer类型,就会报错。

resize方法

使用ArrayUtil.size方法,生成一个新的重新设置大小的数组

    @Test@DisplayName(value = "调整数组大小")void testArrResize(){Object[] array = ArrayUtil.newArray(5);System.out.println(array.length);  //新生成数组的长度Object[] resize = ArrayUtil.resize(array, 3);System.out.println(resize.length);}
addAll方法

Array.addAll方法,将多个泛型数组合并为一个数组。

    @Test@DisplayName(value = "合并数组")void testAddAll(){Object[] intArr = ArrayUtil.newArray(Integer.class, 3);Object[] strArr = ArrayUtil.newArray(String.class, 4);Object[] all = ArrayUtil.addAll(intArr, strArr);System.out.println(all.length);all[0] = 1;all[4] = "你好";all[2] = 3.8D;System.out.println(ArrayUtil.toString(all));}
cone方法

数组本身支持clone方法,因此确定为某种类型数组时调用ArrayUtil.clone(T[]),不确定类型的使用ArrayUtil.clone(T),两种重载方法在实现上有所不同,但是在使用中并不能感知出差别。

    @Test@DisplayName(value = "克隆数组")void testClone(){Integer[] a = {1,2,3,4};Integer[] cloneB = ArrayUtil.clone(a);System.out.println(ArrayUtil.toString(cloneB));}

数字工具-NUmberUtil

数字工具针对数学运算做工具性封装

新建一个 NumberUtilTest 测试类,并添加@Slf4j注解

@Slf4j
public class NumberUtilTest {}
加减乘除
add方法

 针对数字类型做加法

    @Test@DisplayName(value = "测试减法")void testSub(){BigDecimal sub = NumberUtil.sub(1, 2, 3, 4, 5);System.out.println(sub);}
sub方法

针对数字类型做减法

    @Test@DisplayName(value = "测试减法")void testSub(){BigDecimal sub = NumberUtil.sub(1, 2, 3, 4, 5);System.out.println(sub);}
mul方法

针对数字类型做乘法

    @Test@DisplayName(value = "测试乘法")void testMul(){double mul = NumberUtil.mul(3.4, 0.345);System.out.println(mul);}

div方法

针对数字类型做除法,并提供重载方法用于规定除不尽的情况下保留小数位数和舍弃方式。

    @Test@DisplayName(value = "测试除法")void testDiv(){double div = NumberUtil.div(10, 0.34);System.out.println(div);}
round方法
  • NumberUtil.round 方法主要封装BigDecimal中的方法来保留小数,返回BigDecimal,这个方法更加灵活,可以选择四舍五入或者全部舍弃等模式。

    @Test@DisplayName(value = "四舍五入保留小数点")void testRound(){Double tel1 = 12345.123456;Double tel2 = 12345.127656;Console.log(round(tel1,4)); //四舍五入,且保留小数点后四位Console.log(round(tel2,3)); //四舍五入,且保留小数点后三位}
roundStr方法
  • NumberUtil.roundStr 方法主要封装String.format方法,舍弃方式采用四舍五入。

    @Test@DisplayName(value = "另一种方法")void testRoundStr(){double te1=123456.123456;double te2=123456.128456;Console.log(roundStr(te1,2));//四舍五入,保留小数点后两位Console.log(roundStr(te2,2));//四舍五入,保留小数点后两位}
校验数字:
isNumber方法

是否为数字

    @Test@DisplayName(value = "检验是否是数字")void testIsNumber(){String  str = "899daoen";String  num = "4353";System.out.println(NumberUtil.isNumber(str));System.out.println(NumberUtil.isNumber(num));}
isInteger方法

是否为整数

    @Test@DisplayName(value = "检验是否是整数")void testIsInteger(){String i1 = "123.4";String i2 = "89424";String i3 = "89asda424";System.out.println(NumberUtil.isInteger(i1));System.out.println(NumberUtil.isInteger(i2));System.out.println(NumberUtil.isInteger(i3));}
isDouble方法

是否是浮点数

    @Test@DisplayName(value = "校验是否是浮点数")void testIsDouble(){String d1 = "12546";String d2 = "1254gfg6";String d3 = "1.234";System.out.println(NumberUtil.isDouble(d1));System.out.println(NumberUtil.isDouble(d2));System.out.println(NumberUtil.isDouble(d3));}

isPrimes方法

是否是质数

    @Test@DisplayName(value = "校验是否是质数")void testIsPrimes(){Integer p1 = 3;Integer p2 = 12;Integer p3 = 17;System.out.println(NumberUtil.isPrimes(p1));System.out.println(NumberUtil.isPrimes(p2));System.out.println(NumberUtil.isPrimes(p3));}
随机数:
generateRandomNumber方法

生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。

    @Test@DisplayName(value = "生成不重复的随机数")void testGenRandom(){int[] ints = NumberUtil.generateRandomNumber(1, 20, 19); //size范围不能超过end - begin的差System.out.println(ArrayUtil.toString(ints));}
generateBySet方法

生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。

    @Test@DisplayName(value = "生成不重复的数组")void testGenBySet(){Integer[] generate = NumberUtil.generateBySet(5, 10, 5);//size范围不能超过end - begin的差System.out.println(ArrayUtil.toString(generate));}
整数列表:
range方法

方法根据范围和步进,生成一个有序整数列表

    @Test@DisplayName(value = "生成一个有序整数数组")void testRange(){int[] range = NumberUtil.range(7);  //从 0 开始 到 7 结束System.out.println(ArrayUtil.toString(range));int[] ints = NumberUtil.range(5, 10);  //生成一个从5开始,到10结束的数组System.out.println(ArrayUtil.toString(ints));}
appendRange方法

将给定范围内的整数添加到已有集合中

    @Test@DisplayName(value = "把指定范围内的整数,添加到一个集合中")void testAppendRange(){ArrayList<Integer> list = ListUtil.toList(1, 2, 3, 4);Collection<Integer> collection = NumberUtil.appendRange(6, 9, list);collection.forEach(c -> System.out.println(c));}
compare 方法

 

    @Test@DisplayName(value = "比较两个数的大小")void testCompare(){/*** x 是第一个参数,y是第二个参数*  x > y 返回 1*  x < y 返回 -1*  x = y 返回 0*/System.out.println(NumberUtil.compare(12, 15));System.out.println(NumberUtil.compare(20, 10));System.out.println(NumberUtil.compare(25, 25));}

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

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

相关文章

vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐html数据解析&#x1f496; html字符串转为html对象&#x1f496; 深度遍历html对象内容 ⭐echarts 树图的渲染&#x1f496; 处理html内容为树状结构&#x1f496; 渲染树状图&#x1f496; inscode代码块 ⭐总结⭐结束 ⭐前言 大…

安全漏洞周报(2024.01.01-2023.01.08)

漏洞速览 ■ 用友CRM系统存在逻辑漏洞 漏洞详情 1. 用友CRM系统存在逻辑漏洞 漏洞介绍&#xff1a; 某友CRM系统是一款综合性的客户关系管理软件&#xff0c;旨在帮助企业建立和维护与客户之间的良好关系。它提供了全面的功能&#xff0c;包括销售管理、市场营销、客户服…

vagrant 用户名密码登录

正常登录后 sudo -i 切换到root权限 vim /etc/ssh/vim sshd_config 将PasswordAuthentication no设置 为yes 重启sshd.service服务 systemctl restart sshd.service

屡创佳绩!玻色量子与平安银行持续深化“量子计算+金融”创新合作

2024年1月4日&#xff0c;玻色量子凭借与平安银行联合发布的“信贷风险数据降维”量子计算真机测试优秀案例&#xff0c;成功荣登“2023年度产业数字化转型案例”之“新锐科技企业”榜单。这是双方在“量子金融”领域取得的又一重要研究成果。 2024年开年&#xff0c;玻色量子已…

超市商品管理系统设计 C++实现

超市商品管理系统设计—C实现 文章目录 超市商品管理系统设计---C实现一、内容要求大纲图 二、源代码&#xff08;包含大量注释&#xff09;1、main.cpp文件2、supermarket.h文件3、supermarket.cpp文件4、administrator.h文件5、administrator.cpp文件6、user.h文件7、user.cp…

LED智能照明控制系统应用解决方案

LED智能照明控制系统是一种集成了先进技术的照明解决方案&#xff0c;它通过智能化的控制和管理&#xff0c;能够实现节能、舒适、安全的照明效果。随着科技的不断发展&#xff0c;LED智能照明控制系统在各个领域得到了广泛的应用&#xff0c;为人们的生活和工作带来了便利和舒…

ffmpeg 视频分辨率修改 质量压缩

随着手机像素的提高&#xff0c;拍摄视频也越来越大&#xff0c;10秒的视频动辄 二三十兆&#xff0c;这给视频传输和播放都带来了 诸多不变。一般都需要 前端或或者后端 对视频进行压缩。由于我这边前端是 H5&#xff0c;所以只能后端进行压缩&#xff0c; 采用主流压缩库采用…

x-cmd pkg | llm - 用于与 OPENAI 交互的命令行工具

目录 简介首次用户功能特点进一步探索 简介 llm 是一个命令行工具和 Python 库&#xff0c;用于与大型语言模型&#xff08;Large Language Models&#xff0c;简称 LLMs&#xff09;交互&#xff0c;既可以通过远程 API 访问&#xff0c;也可以在本地机器上运行安装的模型。由…

基于Spring-boot-websocket的聊天应用开发总结

目录 1.概述 1.1 Websocket 1.2 STOMP 1.3 源码 2.Springboot集成WS 2.1 添加依赖 2.2 ws配置 2.2.1 WebSocketMessageBrokerConfigurer 2.2.2 ChatController 2.2.3 ChatInRoomController 2.2.4 ChatToUserController 2.3 前端聊天配置 2.3.1 index.html和main.j…

Linux 配置FTP服务器 + vsftpd服务安装配置 (Good篇)

CSDN 成就一亿技术人&#xff01; VSFTPD 实现客户端和服务器之间传输文件 CSDN 成就一亿技术人&#xff01; 目录 什么是VSFTPD&#xff1f; VSFTPD 的特点和功能 1. 设置和使用FTP服务器的步骤 1. 下载vsftpd包 2. 启动服务 开机自启 3. 关闭防火墙 4. 配置vsftpd服…

Java代理模式

代理&#xff1a;设计模式 代理是一种常用的设计模式&#xff0c;其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息&#xff0c;过滤消息并转发消息&#xff0c;以及进行消息被委托类执行后的后续处理。 图 1. 代理模式 图 1. 代理模式…

Unity组件开发--短连接HTTP

1.网络请求管理器 using LitJson; using Cysharp.Threading.Tasks; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Events;using System.Web; using System.Text; using Sy…

MySQL视图 索引 面试题

一. 视图 视图&#xff1a;一种虚拟存在的表&#xff0c;行和列的数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的&#xff0c;只保存了sql逻辑&#xff0c;不保存查询结果 视图语法 -- 创建 create view 视图名 as 查询语句;-- 使用 select * f…

Linux内核源码分析(强烈推荐收藏!)

前言&#xff1a;Linux内核是由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在1991年开始开发的。当时他为了得到一个可以运行UNIX操作系统的个人计算机&#xff0c;开始编写一个操作系统内核&#xff0c;并将其命名为Linux。随后&#xff0c;越来越多的开发者加入到项…

im6ull学习总结(三-4)freetype显示单个字体

矢量字体引入 使用点阵字库显示英文字母、汉字时&#xff0c;大小固定&#xff0c;如果放大缩小则会模糊甚至有锯齿出现&#xff0c;为了解决这个问题&#xff0c;引用矢量字体。 矢量字体形成分三步&#xff1a; 第1步 确定关键点&#xff0c; 第2步 使用数学曲线&#xff08…

正则表达式的语法

如果要想灵活的运用正则表达式&#xff0c;必须了解其中各种元素字符的功能&#xff0c;元字符从功能上大致分为&#xff1a; 限定符 选择匹配符 分组组合和反向引用符 特殊字符 字符匹配符 定位符 我们先说一下元字符的转义号 元字符(Metacharacter)-转义号 \\ \\ 符号…

【K8S 存储卷】K8S的存储卷+PV/PVC

目录 一、K8S的存储卷 1、概念&#xff1a; 2、挂载的方式&#xff1a; 2.1、emptyDir&#xff1a; 2.2、hostPath&#xff1a; 2.3、NFS共享存储&#xff1a; 二、PV和PVC&#xff1a; 1、概念 2、请求方式 3、静态请求流程图&#xff1a; 4、PV和PVC的生命周期 5、…

【分布式】分布式链路跟踪技术

为什么需要分布式链路追踪 提到分布式链路追踪&#xff0c;我们要先提到微服务。相信很多人都接触过微服务。微服务是一种开发软件的架构和组织方法&#xff0c;它侧重将服务解耦&#xff0c;服务之间通过API通信。使应用程序更易于扩展和更快地开发&#xff0c;从而加速新功能…

PiflowX-MysqlCdc组件

MysqlCdc组件 组件说明 MySQL CDC连接器允许从MySQL数据库读取快照数据和增量数据。 计算引擎 flink 组件分组 cdc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子hostnameHostname“”无是MySQL…

机器学习周刊 第4期:动手实战人工智能、计算机科学热门论文、免费的基于ChatGPT API的安卓端语音助手、每日数学、检索增强 (RAG) 生成技术综述

LLM开发者必读论文&#xff1a;检索增强&#xff08;RAG&#xff09;生成技术综述&#xff01; 目录&#xff1a; 1、动手实战人工智能 Hands-on Al2、huggingface的NLP、深度强化学习、语音课3、Awesome Jupyter4、计算机科学热门论文5、LLM开发者必读论文:检索增强 (RAG) 生…