当前位置: 首页 > news >正文

Java常用类之 String、StringBuffer、StringBuilder

Java常用类

文章目录

  • 一、字符串相关的类
    • 1.1、String的 不可变性
    • 1.2、String不同实例化方式的对比
    • 1.3、String不同拼接操作的对比
    • 1.4、String的常用方法
    • 1.5、String类与其他结构之间的转换
      • 1.5.1、String 与基本数据类型、包装类之间的转换
      • 1.5.2、String 与char[]的转换
      • 1.5.3、String 与byte[]的转换
    • 1.6、常见算法题目
      • 1.6.1、模拟一个trim方法,去除字符串两端的空格
      • 1.6.2、将一个字符串进行反转
      • 1.6.3、获取一个字符串在另一个字符串中出现的次数
      • 1.6.4、获取两个字符串中最大相同子串
      • 1.6.5、对字符串中字符进行自然顺序排序
  • 二、StringBuffer、StringBuilder
    • 2.1、StringBuffer源码分析
    • 2.2、StringBuffer和StringBuilder中的常用方法

一、字符串相关的类

1.1、String的 不可变性

String:字符串,使用一对""引起来表示。

字符串在底层是用char型数组存储的

  1. String声明为final的,不可被继承

  2. String实现了Serializable接口:表示字符串是支持序列化的

    ​ 实现了Comparable接口:表示String可以比较大小

  3. String内部定义了 final char[] value 用于存储字符串数据

  4. String:代表不可变的字符序列。简称:不可变性。

    体现:1. 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
    2. 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的
    3. 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域

  5. 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中

    String s1 = "abc";//字面量,不需要new,可以直接赋值
    
  6. 字符串常量池中不会存储相同内容的字符串的。

image.png

1.2、String不同实例化方式的对比

String实例化方式:

  1. 方式一:通过字面量定义的方式
  2. 方式二:通过new + 构造器的方式

面试题:String s = new String(“abc”); 方式创建对象,在内存中创建了几个对象?

答:两个。一个是堆空间中new结构,一个是char[]对应的常量池中的数据:“abc”

1.3、String不同拼接操作的对比

  1. 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
  2. 只要其中有一个是变量,结果就在堆中
  3. 如果拼接的结果调用intern()方法,返回值就在常量池中
public void test3(){String s1 = "javaEE";//字面量方式定义的String s2 = "hadoop";String s3 = "javaEEhadoop";String s4 = "javaEE" + "hadoop";//新建了一个字符串String s5 = s1+"hadoop";String s6 = "javaEE" + s2;String s7 = s1 + s2;System.out.println(s3 == s4);//trueSystem.out.println(s3 == s5);//falseSystem.out.println(s3 == s6);//falseSystem.out.println(s3 == s7);//falseSystem.out.println(s5 == s6);//falseSystem.out.println(s5 == s7);//falseSystem.out.println(s6 == s7);//falseString s8 = s7.intern();System.out.println(s3 == s8);//返回值得到的s8使用的常量池中已存在的"javaEEhadoop"
}

1.4、String的常用方法

***:表示很重要

  int length():返回字符串的长度: return value.lengthchar charAt(int index): 返回某索引处的字符return value[index]boolean isEmpty():判断是否是空字符串:return value.length == 0String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写String trim():返回字符串的副本,忽略前导空白和尾部空白boolean equals(Object obj):比较字符串的内容是否相同boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+int compareTo(String anotherString):比较两个字符串的大小String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
  boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
  boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 trueint indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索注:indexOf和lastIndexOf方法如果未找到都是返回-1
 String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。String replaceAll(String regex, String replacement) : 使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。String replaceFirst(String regex, String replacement) : 使用给定的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
 //匹配boolean matches(String regex):告知此字符串是否匹配给定的正则表达式
 //切片String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此//字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。

1.5、String类与其他结构之间的转换

1.5.1、String 与基本数据类型、包装类之间的转换

 		String s1 = "123";//在常量池中
//        int num = (int) s1;//错误int num = Integer.parseInt(s1);System.out.println(num);int n1 = 45689;String s2 = String.valueOf(n1);System.out.println(s2);//"123"String s3 = n1+"";//也可以,在堆空间中,只要有常量参与,都在堆空间中System.out.println(s3);System.out.println(s1 == s3);System.out.println(s1 == s3.intern());

1.5.2、String 与char[]的转换

  • String —> char[]:调用String的toCharArray()
String s1 = "abc123";
for (char c : s1.toCharArray()) {System.out.print(c);System.out.print('\t');
}
  • char[] —>String: 调用String的构造器
char[] arr = new char[]{'h','e','l','l','o'};
String s2 = new String(arr);
System.out.println(s2);

1.5.3、String 与byte[]的转换

 编码:字符串-->字节   (看得懂 -->看不懂的二进制)解码:编码的逆过程,字节-->字符串    (看不懂的二进制 -->看得懂)说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码!
  • 编码:String --> byte[]: 调用String的getBytes()
//utf-8中一个汉字占3个字节String s1 = "abc123中国";//'1'相当于ASCI码中的49byte[] bytes = s1.getBytes();//使用默认的字符集,进行编码System.out.println(Arrays.toString(bytes));//[97, 98, 99, 49, 50, 51]//gbk字符集中一个汉字占2个字节byte[] gbks = s1.getBytes("gbk");//使用gbk字符集进行编码System.out.println(Arrays.toString(gbks));
  • 解码:byte[] --> String: 调用String的构造器
String s2 = new String(bytes);
System.out.println(s2);//String s3 = new String(gbks);//出现乱码。原因:编码集和解码集不一致!
String s3 = new String(gbks, "gbk");
System.out.println(s3);

1.6、常见算法题目

1.6.1、模拟一个trim方法,去除字符串两端的空格

/*** @author: Arbicoral* @Description: 模拟一个trim方法,去除字符串两端的空格*/
public class String1 {public static void main(String[] args) {String1 s1 = new String1();String s = "   abufs   dbf   fwf   ";System.out.println("原始字符串为:"+s);String res = s1.likeTrim(s);System.out.println();System.out.println("----------------");System.out.println("去除字符串两端的空格后的结果为:"+res);}public String likeTrim(String s){//1.转为char[]//2.通过 indexOf()挨个读取,是" "就去掉int n=s.length();//20char ch = ' ';char[] temp = s.toCharArray();int i=0;int j=n-1;while (true){if (temp[i] == ch){i++;}elsebreak;}//走到这里,说明已经排除前面的空格了
//        System.out.println(i);//3while (true){if (temp[j] == ch){j--;}elsebreak;}
//        System.out.println(j);//16//走到这里,说明已经排除后面的空格了char[] res = new char[j-i+1];int count = 0;for(int m=i; m<=j;m++){res[count] = temp[m];count++;}System.out.println(res.length);for (char c:res){System.out.print(c + "***");}//将res数组转为StringString result = new String(res);return result;}
}

1.6.2、将一个字符串进行反转

将字符串中指定部分进行反转。比如“abcdefg”反 转为”abfedcg”

/*** @author: Arbicoral* @Description: 将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”  cdef-->fedc* 分析:* 需要两个指针*  ① 将s1变为char[],找到第 start_index 个元素,开始向后遍历 start_index+reverseLength个长度,用一个临时char交换下标的位置*  ② 将char[]恢复为字符串,并返回即可*/
public class String2 {public static void main(String[] args) {String2 s = new String2();String s1 = "xssxcc";int start_index = 2;int reverseLength = 3;String res = s.reverseString(s1, start_index, reverseLength);//要给函数传 开始反转的下标和长度System.out.println("原始的字符串为:"+s1);System.out.println("从下标为" + start_index+ "开始,向后数反转"+ reverseLength +"个字符,得到反转后的字符串为:"+ res);}/*** 反转指定长度的函数* 方式一* @param start_index:开始反转的下标* @param reverseLength:反转的字符串的长度* @return*/public String reverseString(String s1, int start_index, int reverseLength){char[] array = s1.toCharArray();int mid = reverseLength/2;//2char temp;int i = start_index;//开始反转的位置int j=start_index + reverseLength-1;//结束反转的位置while (i < (start_index+reverseLength-mid) && j >= start_index + reverseLength - mid){//start_index + reverseLength-1=5; start_index + reverseLength - mid=3//swapif (i==j){break;}else {temp = array[i];array[i] = array[j];array[j] = temp;}//两个指针一个往前走,一个向后走i++;j--;}String res = new String(array);//恢复为Stringreturn res;}
}/*** 方式二:使用String进行拼接*/public String reverseString2(String s1, int startIndex, int endIndex){if (s1 != ""){//第一部分String res = s1.substring(0,startIndex);//第二部分:倒着遍历for (int i=endIndex; i>=startIndex; i--){res += s1.charAt(i);}//第三部分res += s1.substring(endIndex+1);return res;}return null;}/*** 方式三:在方式二的基础之上,使用StringBuffer 或者StringBuilder替换String*/public String reverseString3(String s1, int startIndex, int endIndex){if (s1 != ""){StringBuilder sb1 = new StringBuilder(s1.length());sb1.append(s1.substring(0,startIndex));for (int i=endIndex; i>=startIndex; i--){sb1.append(s1.charAt(i));}sb1.append(s1.substring(endIndex+1));return sb1.toString();}return null;}

1.6.3、获取一个字符串在另一个字符串中出现的次数

比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数


/*** @author: Arbicoral* @Description: 获取一个字符串在另一个字符串中出现的次数*/
public class String3cc {public static void main(String[] args) {String3cc s3 = new String3cc();String shortStr = "ab";String longStr = "abkkcadkabkebfkabkskab";int num = s3.countNum(shortStr, longStr);System.out.println(shortStr+"在"+longStr+"中出现的次数为:"+num);}public int countNum(String shortStr, String longStr){//int count = 0;int n = shortStr.length();//2int m = longStr.length();//22char[] ch1;ch1 = shortStr.toCharArray();char[] ch2 = longStr.toCharArray();boolean isAllEqual = false;//遍历完之后,是否全部一致int start_point_s=0; //记录ch1的起点,每一次外循环都需要归0;int start_point_l=0; //记录ch2的起点,不论本次循环是否找到都需要加1;// 外层循环while (start_point_l<=(m-n)){// 开启外循环int bianli_point_s=start_point_s; // 初始化ch1的遍历点int bianli_point_l=start_point_l; // 初始化ch2的遍历点// 内层循环while (bianli_point_s<=(n-1)){//x=0,1// 只要遇到不相等的字母,就结束内层循环,那么全部相等的情况下,bianli_point应该等于nif (!isEqual(ch1[bianli_point_s], ch2[bianli_point_l])){break;}bianli_point_s++;bianli_point_l++;}// 如果ch1都参与了比较说明,全部相等if (bianli_point_s==n){isAllEqual=true;}//if (isAllEqual){//走到这里,说明 lastFlag=true,System.out.println("出现位置起点:"+start_point_l);count++;}// 参数重设定start_point_l++;start_point_s=0;isAllEqual=false;}return count;}/*** 用于判断两个字符是否相等* @param c1* @param c2* @return true; false*/public boolean isEqual(char c1, char c2){if (c1 == c2){return true;}elsereturn false;}
}/*** 方式二:使用String的常用方法:indexOf()*/public int getNum(String shortStr, String longStr){int shortLen = shortStr.length();int longLen = longStr.length();int index = 0;int count = 0;if (longLen > shortLen){//while ((index = longStr.indexOf(shortStr, index)) != -1){count++;System.out.println("出现位置起点:"+ index);index += shortLen;}return count;}return 0;}

1.6.4、获取两个字符串中最大相同子串

比如: str1 = "abcwerthelloyuiodef“; str2 = “cvhellobnm”

提示:

① 使用动态规划来解决

② 从小的开始,在大的字符串里依次递减进行遍历


/*** @author: Arbicoral* @Description: 获取两个字符串中最大相同子串** 提示:使用动态规划解决*/
public class String4 {public static void main(String[] args) {String4 s = new String4();String s1 = "abcwerthelloyuiodef";String s2 = "cvhellobnm";
//        String s1 = "abcwert";
//        String s2 = "cvlert";String maxSubstring = s.getMaxCommonSubstring(s1, s2);System.out.println("maxSubstring = " + maxSubstring);}/*** 方式一:获取两个字符串中最大相同子串*/public String getMaxCommonSubstring(String s1, String s2){int m = s1.length();int n = s2.length();int maxLen = 0;//记录最大长度int endIndex = 0;//记录最长公共子串的终止位置int[][] arr = new int[m][n];for (int i=0;i<m; i++){//遍历s1for (int j=0;j<n;j++){//遍历s2if (s1.charAt(i) == s2.charAt(j)){if (i == 0|| j==0){arr[i][j] = 0;}else {arr[i][j] = arr[i - 1][j - 1] + 1;}}else {arr[i][j] = 0;}//获取最大长度if (arr[i][j] > maxLen){maxLen = arr[i][j];endIndex = i;}}}return s1.substring(endIndex-maxLen+1, endIndex+1);//前闭后开,所以 endIndex 要+1,不然取不到endIndex}/*** 获取两个字符串中最大相同子串:* 方法二:从小的开始,在大的字符串里依次递减进行遍历*/public String getMaxSameString(String s1, String s2){if (s1.length() != 0 && s2.length() != 0){String maxStr = (s1.length() >= s2.length() ? s1 : s2);String minStr = (s1.length() < s2.length() ? s1 : s2);int length = minStr.length();for (int i=0; i<length; i++){//遍历最短的字符串for (int x=0,y=length-i; y<=length; x++,y++){String subStr = minStr.substring(x,y);//子串if (maxStr.contains(subStr)){return subStr;}}}}return null;}
}

1.6.5、对字符串中字符进行自然顺序排序

提示:

1)字符串变成字符数组。

2)对数组排序,选择,冒泡,Arrays.sort();

3)将排序后的数组变成字符串。

import java.util.Arrays;/*** @author: Arbicoral* @Description: 对字符串中字符进行自然顺序排序** 提示:* 1)字符串变成字符数组。* 2)对数组排序,选择,冒泡,Arrays.sort();* 3)将排序后的数组变成字符串。*/
public class String5 {public static void main(String[] args) {String5 s = new String5();String s1 = "zxcvbnm";System.out.println("排序前的字符串为:"+s1);String res = s.sort(s1);System.out.println("排序后的字符串为:"+res);}/*** 对字符串中字符进行自然顺序排序* @param s1:要排序的字符串* @return*/public String sort(String s1){char[] array = s1.toCharArray();Arrays.sort(array);String res = new String(array);return res;}
}

二、StringBuffer、StringBuilder

高频面试题:String 、StringBuffer、StringBuilder三者的异同?

相同点不同点
String底层使用char[]存储不可变的字符序列
StringBuffer底层使用char[]存储可变的字符序列;线程是安全的,效率低
StringBuilder底层使用char[]存储可变的字符序列;jdk5.0新增的,线程不安全的,效率高

对比String 、StringBuffer、StringBuilder三者的的效率:

从高到低排列:StringBuilder > StringBuffer > String

2.1、StringBuffer源码分析

String str = new String();//char[] value = new char[0]
String str1 = new String("abc");//char[] value = new char[]{'a', 'b', 'c'}StringBuffer sb1 = new StirngBuffer();//char[] value = new char[16];底层创建了一个长度是16的char数组
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';
sb1.append('c');//value[2] = 'c';StringBuffer sb2 = new StirngBuffer("abc");//char[] value = new char["abc",length() + 16]//问题1:System.out.println(sb2.length())//3
//问题2:扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。//默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。//指导意义:开发中建议使用StringBuffer(int capacity) 或 StringBuilder(int capacity)

2.2、StringBuffer和StringBuilder中的常用方法

* StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
* StringBuffer delete(int start,int end):删除指定位置的内容
* StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
* StringBuffer insert(int offset, xxx):在指定位置插入xxx
* StringBuffer reverse() :把当前字符序列逆转
public int indexOf(String str)
public String substring(int start,int end)
public int length()
public char charAt(int n )
public void setCharAt(int n ,char ch)

重点关注:

增:append(xxx) //方法链的原理:一直append
删:delete(int start,int end)
改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
查:charAt(int n )
插:insert(int offset, xxx):在指定位置插入xxx
长度:length()
遍历:for()+ charAt() / toString()

相关文章:

Java常用类之 String、StringBuffer、StringBuilder

Java常用类 文章目录 一、字符串相关的类1.1、String的 不可变性1.2、String不同实例化方式的对比1.3、String不同拼接操作的对比1.4、String的常用方法1.5、String类与其他结构之间的转换1.5.1、String 与基本数据类型、包装类之间的转换1.5.2、String 与char[]的转换1.5.3、…...

linux在所有文件中查找某一个字符串

linux在所有文件中查找某一个字符串 有时候我们需要在大量文件中查找某一个字符串&#xff0c;手工一个一个打开文件查找非常耗时&#xff0c;我们可以使用 find 和 xargs 两个命令来实现查找指定字符串。 命令详解 find <directory> -type f -name "*.c" |…...

WebSocket vs SSE: 实时数据推送到前端的选择与实现(详细)

Websocket和Server-Sent Events 对比推送数据给前端及各自的实现 二者对比WebSocket&#xff1a;Server-Sent Events (SSE)&#xff1a;选择 WebSocket 还是 SSE&#xff1a; Websocket 实现使用原生 WebSocket API&#xff1a;使用 Netty 创建 WebSocket&#xff1a;总结和选择…...

Redis从入门到精通(二:数据类型)

数据存储类型介绍 Redis 数据类型&#xff08;5种常用&#xff09; string hash list set sorted_set/zset&#xff08;应用性较低&#xff09; redis 数据存储格式 redis 自身是一个 Map&#xff0c;其中所有的数据都是采用 key : value 的形式存储 数据类型指的是存储的数据…...

基于SSM的珠宝首饰交易平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

4款视频号数据分析平台!

很多人在做视频号的时候就会有创作参考的需求&#xff0c;那么你们知道视频号中有哪些数据平台&#xff1f;今天就和大家来分享一下 接下来就总结一下视频号数据平台有哪些&#xff1f;排名不分前后。 1&#xff1a;视频号助手&#xff08;channels.weixin.qq.com&#xff09…...

【系统架构】什么是集群?为什么要使用集群架构?

什么是集群&#xff1f;为什么要使用集群架构&#xff1f; 1.什么是集群&#xff1f;2.为什么要使用集群&#xff1f;2.1 高性能2.2 价格有效性2.3 可伸缩性2.4 高可用性2.5 透明性2.6 可管理性2.7 可编程性 3.集群的常见分类3.1 负载均衡集群3.2 高可用性集群3.3 高性能计算集…...

Java手写拓扑排序和拓扑排序应用拓展案例

Java手写拓扑排序和拓扑排序应用拓展案例 1. 算法思维导图 #mermaid-svg-o8KpEXzxukfDM8c9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-o8KpEXzxukfDM8c9 .error-icon{fill:#552222;}#mermaid-svg-o8KpEXzxukfD…...

练习:使用servlet显示试卷页面

试卷页面代码 在浏览器输入如下地址&#xff1a; http://localhost/examPageServlet 效果如下&#xff1a;...

视频监控系统/视频云存储EasyCVR接入国标GB28181设备无法播放设备录像,是什么原因?

安防视频监控平台EasyCVR支持将部署在监控现场的前端设备进行统一集中接入&#xff0c;可兼容多协议、多类型设备&#xff0c;管理员可选择任意一路或多路视频实时观看&#xff0c;视频画面支持单画面、多画面显示&#xff0c;视频窗口数量有1、4、9、16个可选&#xff0c;还能…...

四叶草clover配置工具:Clover Configurator for Mac

Clover Configurator是一款Mac上的工具&#xff0c;用于配置和优化Clover引导加载器。Clover引导加载器是一种用于启动macOS的开源引导加载器。它允许用户在启动时选择操作系统和配置启动选项。 Clover Configurator提供了一个可视化的界面&#xff0c;让用户可以轻松地编辑和…...

计算机网络第四章——网络层(中)

提示&#xff1a;待到山花烂漫时&#xff0c;她在丛中笑。 文章目录 需要加头加尾&#xff0c;其中头部最重要的就是加了IP地址和MAC地址&#xff08;也就是逻辑地址和物理地址&#xff09;集线器物理层设备&#xff0c;交换机是物理链路层的设备&#xff0c;如上图路由器左边就…...

时序分解 | MATLAB实现基于小波分解信号分解分量可视化

时序分解 | MATLAB实现基于小波分解信号分解分量可视化 目录 时序分解 | MATLAB实现基于小波分解信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于小波分解的分量可视化&#xff0c;MATLAB编程程序&#xff0c;用于将信号分解成不同尺度和频率的子信…...

VMware虚拟化环境搭建

虚拟化环境搭建 1. 什么是虚拟化环境&#xff1f;未来工作中在何处使用&#xff1f; 在网络安全中&#xff0c;虚拟化环境是一种技术&#xff0c;它将一个物理计算机系统划分成多个独立、可管理的虚拟环境。这种虚拟环境技术允许多个完全不同的操作系统、显示装置和软件在同一…...

Jenkins :添加node权限获取凭据、执行命令

拥有Jenkins agent权限的账号可以对node节点进行操作&#xff0c;通过添加不同的node可以让流水线项目在不同的节点上运行&#xff0c;安装Jenkins的主机默认作为master节点。 1.Jenkins 添加node获取明文凭据 通过添加node节点&#xff0c;本地监听ssh认证&#xff0c;选则凭…...

如何实现不同MongoDB实例间的数据复制?

作为一种Schema Free文档数据库&#xff0c;MongoDB因其灵活的数据模型&#xff0c;支撑业务快速迭代研发&#xff0c;广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中&#xff0c;会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整…...

微服务保护-隔离

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…...

报错:appium AttributeError: ‘NoneType‘ object has no attribute ‘to_capabilities‘

报错如下 Traceback (most recent call last):File "C:\Users\wlb\Desktop\test\python\2.py", line 16, in <module>driver webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)File "D:\software\python3\lib\site-packages\appium\we…...

MFC - 一文带你从小白到项目应用(全套1)

文章篇幅可能会比较长&#xff0c;从入门到基本能上项目的全部内容。建议观看的过程中&#xff0c;用电脑跟着学习案例。 持续输出优质文章是作者的追求&#xff0c;因为热爱&#xff0c;所以热爱。 最近看动漫被一句鸡汤感动到了&#xff0c;也送给各位朋友&#xff1a; 只要有…...

(2596. 检查骑士巡视方案leetcode,经典深搜)-------------------Java实现

&#xff08;2596. 检查骑士巡视方案leetcode,经典深搜&#xff09;-------------------Java实现 题目表述 骑士在一张 n x n 的棋盘上巡视。在 有效 的巡视方案中&#xff0c;骑士会从棋盘的 左上角 出发&#xff0c;并且访问棋盘上的每个格子 恰好一次 。 给你一个 n x n …...

Docker 部署 Bitwarden RS 服务

Bitwarden RS 服务是官方 Bitwarden server API 的 Rust 重构版。因为 Bitwarden RS 必须要通过 https 才能访问, 所以在开始下面的步骤之前, 建议先参考 《Ubuntu Nginx 配置 SSL 证书》 配置好域名和 https 访问。 部署 Bitwarden RS 拉取最新版本的 docker.io/vaultwarden…...

python与mongodb交互-->pymongo

from pymongo import MongoClient# 创建数据库连接对象 client=MongoClient(ip,27017)# 选择一个数据库 db=client[admin]db.authenticate(python,python)# 选择一个集合 col=client[pydata][test]col.insert({"class":"python"})col.find() for data in c…...

【网络】计算机网络基础

Linux网络 对网络的理解 在网络传输中存在的问题&#xff1a; 找到我们所需要传输的主机解决远距离数据传输丢失的问题怎么进行数据转发&#xff0c;路径选择的问题 有问题&#xff0c;就有解决方案&#xff1b; 我们把相同性质的问题放在一起&#xff0c;做出解决方案 解…...

(1)输入输出函数:cin和cout(2)数学函数:sqrt、pow、sin、cos、tan等

输入输出函数&#xff1a;cin 和 cout 在C编程语言中&#xff0c;为了与用户进行交互和显示程序的结果&#xff0c;我们使用了两个非常重要的函数&#xff1a;cin 和 cout。这两个函数分别用于输入和输出。 cin是C中的标准输入流对象&#xff0c;它用于从键盘接收用户的输入。…...

ArmSom-W3开发板之PCIE的开发指南(一)

1. 简介 RK3588从入门到精通本⽂介绍RK平台配置pcie的方法开发板&#xff1a;ArmSoM-W3 2、PCIE接口概述 PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;是一种用于连接计算机内部组件的高速接口标准。以下是关于PCIe接口的简要介绍&#xff1a; …...

Android 13.0 framework修改AlertDialog对话框的button样式

1.概述 在13.0系统产品开发中 在AlertDialog 系统对话框原生的确定和取消 两个button 按钮中,由于产品觉得字体默认颜色的不太好看,由于产品的需求修改button字体的颜色,所以需要找到AlertDialog的字体样式然后修改就可以了 2.framework修改AlertDialog 对话框的button样式…...

如何使用ArcGIS Pro提取河网水系

DEM数据除了可以看三维地图和生成等高线之外&#xff0c;还可以用于水文分析&#xff0c;这里给大家介绍一下如何使用ArcGIS Pro通过水文分析提取河网水系&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&a…...

python pytesseract 中文文字批量识别

用pytesseract 来批量把图片转成文字 1、安装好 pytesseract 包 2、下载安装OCR https://download.csdn.net/download/m0_37622302/88348824https://download.csdn.net/download/m0_37622302/88348824 Index of /tesseracthttps://digi.bib.uni-mannheim.de/tesseract/ 我是…...

Python 之plt.plot()的介绍以及使用

文章目录 介绍代码实例 介绍 plt.plot() 是Matplotlib库中用于绘制线图&#xff08;折线图&#xff09;的主要函数之一。它的作用是将一组数据点连接起来&#xff0c;以可视化数据的趋势、关系或模式。以下是 plt.plot() 的详细介绍&#xff1a; plt.plot(x, y, fmt, **kwarg…...

自动化生成代码:MyBatis 的 Generator与MyBatis-Plus 的 AutoGenerator

文章目录 Mybatis Generator自动化生成代码MyBatis Generator概述使用Java代码形式1. 在 Maven 或 Gradle 中添加 MyBatis Generator 的依赖&#xff1a;2. 编写配置文件 GeneratorConfig.xml&#xff0c;配置需要生成的数据库表和对应的生成器&#xff1a;3. 在命令行中使用 M…...

网站建设服务器篇/教育培训班

String的hashcode()方法 public int hashCode() {int h hash;if (h 0 && value.length > 0) {char val[] value;for (int i 0; i < value.length; i) {h 31 * h val[i];}hash h;}return h;}​ 选择31是因为可以用移位和减法运算来代替乘法&#xff0c;从而…...

汕头市住建局/seo外包软件

比较明显的网络流最小割模型&#xff0c;对于这种模型我们需要先求获利的和&#xff0c;然后减去代价即可。 我们对于第i个人来说&#xff0c; 如果选他&#xff0c;会耗费A[I]的代价&#xff0c;那么(source,i,a[i])代表选他之后的代价&#xff0c;如果不选他&#xff0c;我们…...

asp伪静态网站如何做筛选/网站标题seo外包优化

承接上文&#xff1a; Docker进阶篇教程&#xff0c;docker-compose, docker swarm, 弹性、扩缩容 Docker进阶篇教程9. 体会swarm弹性、扩缩容9.1 理解扩缩容9.2 docker service命令9.3 理解灰度发布9.4 replicas 3个副本测试9.5 replicas 10个副本测试9.6 scale命令扩缩容1…...

做ppt的兼职网站/汕头网站建设方案外包

技术面&#xff1a;自我介绍项目介绍xml的使用多线程的使用&#xff0c;使用场景sleep和wait的区别servlet和cgi的区别索引的实现内存结构跟别人比&#xff0c;你的优势综合面&#xff1a;略。。。转载于:https://blog.51cto.com/12159803/1916431...

哪个网站做脚本/抖音seo关键词优化怎么做

chown (change owner) 更改所有者 查看系统所有用户 这里面都是系统默认的用户 [rootevan-01 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x…...

wordpress stheme/免费的个人网页

1.先搞清微信小程序的生命周期和页面生命周期的关系 微信小程序的生命周期包括App生命周期和页面生命周期。App生命周期指的是小程序从启动到退出的整个过程&#xff0c;而页面生命周期则是指小程序中每个页面从创建到销毁的过程。 在小程序中&#xff0c;当用户打开小程序时&a…...