Java常用类之 String、StringBuffer、StringBuilder

news2024/12/24 2:37:57

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);//true
    System.out.println(s3 == s5);//false
    System.out.println(s3 == s6);//false
    System.out.println(s3 == s7);//false
    System.out.println(s5 == s6);//false
    System.out.println(s5 == s7);//false
    System.out.println(s6 == s7);//false

    String s8 = s7.intern();
    System.out.println(s3 == s8);//返回值得到的s8使用的常量池中已存在的"javaEEhadoop"
}

1.4、String的常用方法

***:表示很重要

  int length():返回字符串的长度: return value.length
  char charAt(int index): 返回某索引处的字符return value[index]
  boolean isEmpty():判断是否是空字符串:return value.length == 0
  String 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 值序列时,返回 true
  int 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码中的49
 byte[] 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();//20
        char ch = ' ';
        char[] temp = s.toCharArray();
        int i=0;
        int j=n-1;
        while (true){
            if (temp[i] == ch){
                i++;
            }else
                break;
        }
        //走到这里,说明已经排除前面的空格了
//        System.out.println(i);//3
        while (true){
            if (temp[j] == ch){
                j--;
            }else
                break;
        }
//        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数组转为String
        String 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;//2
        char 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
            //swap
            if (i==j){
                break;
            }else {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
            //两个指针一个往前走,一个向后走
            i++;
            j--;
        }
        String res = new String(array);
        //恢复为String
        return 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();//2
        int m = longStr.length();//22
        char[] 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应该等于n
                if (!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;
        }else
            return 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++){//遍历s1
            for (int j=0;j<n;j++){//遍历s2
                if (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()

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

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

相关文章

ipad可以使用其他品牌的手写笔吗?开学平价电容笔推荐

新学期已经来临&#xff0c;相信不少同学已经开始着手筹备新学期的该准备什么了&#xff0c;毕竟原装的苹果Pencil&#xff0c;功能强大&#xff0c;但价格昂贵&#xff0c;一般人根本买不起。那么&#xff0c;有没有像苹果原装那样的电容笔呢&#xff1f;当然是有的。国产的平…

长安链上线可视化敏捷测试工具v1.0版本

开发者对区块链底层平台进行初步的了解后&#xff0c;一项经常会涉及到的工作是对平台进行测试以考量其性能及稳定性是否符合自身使用需求。长安链推出了可视化UI操作界面的区块链敏捷测试工具v1.0版本&#xff0c;当前版本可对内置合约进行压测并生成网络拓扑图以验证组网方式…

免费开箱即用微鳄售后工单管理系统

编者按&#xff1a;本文介绍基于天翎MyApps低代码平台开发的微鳄售后工单管理系统&#xff0c; 引入低代码平台可以帮助企业快速搭建和部署售后工单管理系统&#xff0c; 以工作流作为支撑&#xff0c;在线完成各环节数据审批&#xff0c;解决售后 工单 服务的全生命周期过程管…

《2023中国氢能源行业分析报告》丨附下载_三叠云

✦ ✦✦ ✦✦ ✦✦ ✦ 1. 国内氢能政策梳理 直接涉及氢能政策&#xff1a;1&#xff09;21年以来&#xff0c;发布国家级10个、省级83个、 市县级252个&#xff1b;2&#xff09;涉及发展规划占比45%、财政支持占比 20%、项目支持占比17%、管理办法占比16%、 氢能安全和标准占…

公私钥非对称加密 生成和验证JSON Web Token (JWT)

前言 这是我在这个网站整理的笔记&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 公私钥非对称加密 生成和验证JSON Web Token 什么是JSON Web Token (JWT)Java程序中生成和验证JWT代码解析 什么是JSON Web Token (JWT) JSON Web Tok…

【C++】泛型算法(二)泛型指针Iterator(迭代器)

迭代器iterator定义 迭代器是一种检查容器内元素并遍历元素的数据类型&#xff1b;迭代器提供一个对容器对象或者string对象的访问方法&#xff0c;并定义了容器范围&#xff1b;迭代器的使用可以提高编程的效率。 其定义应该提供&#xff1a; 迭代对象&#xff08;某个容器&a…

拆贡献算总和(抓住双射)+竞赛图与连通分量相关计数:arc163_d

https://atcoder.jp/contests/arc163/tasks/arc163_d 首先竞赛图有个性质&#xff1a; 然后有了这个性质&#xff0c;我们就可以考虑计数题的经典套路&#xff0c;拆贡献算总和。 考虑假如我们成功划分成两个集合 A , B A,B A,B&#xff0c;其中一个可以为空&#xff08;我们…

Qt --- Day02

实现效果&#xff1a; 点击登录&#xff0c;检验用户密码是否正确&#xff0c;正确则弹出消息框&#xff0c;点击ok转到另一个页面 不正确跳出错误消息框&#xff0c;默认选线为Cancel&#xff0c;点击Yes继续登录 点击Cancel跳出问题消息框&#xff0c;默认选项No&#xff0c…

netty之pipeline

Netty抽象出流水线(pipeline)这一层数据结构进行处理或拦截channel相关事件。 事件分为入站事件(inBound event)和出站事件(outBound event)的ChannelHandlers列表。ChannelPipeline使用先进的Intercepting Filter模式&#xff0c;使用户可以完全控制如何处理事件以及管道中的…

全流程GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术教程

详情点击公众号链接&#xff1a;全流程GMS地下水数值模拟及溶质&#xff08;包含反应性溶质&#xff09;运移模拟技术教程 前言 GMS三维地质结构建模 GMS地下水流数值模拟 GMS溶质运移数值模拟与反应性溶质运移模 详情 1.GMS的建模数据的收集、数据预处理以及格式等&#xff…

2023/9/18 -- C++/QT

作业 完善登录框 点击登录按钮后&#xff0c;判断账号&#xff08;admin&#xff09;和密码&#xff08;123456&#xff09;是否一致&#xff0c;如果匹配失败&#xff0c;则弹出错误对话框&#xff0c;文本内容“账号密码不匹配&#xff0c;是否重新登录”&#xff0c;给定两…

《Linux运维总结:Centos7.6之OpenSSH7.4升级版本至9.4》

一、环境信息 操作系统&#xff1a;Centos7.6.1810 OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 如下图所示&#xff1a; 注意&#xff1a;升级后由于加密算法的区别&#xff0c;低版本的SSH工具可能无法连接&#xff0c;建议改用Xshell7或SecureCRT9.0以上版本。 二、注意事项 1、检…

第九章 关系查询处理和查询优化

第九章 关系查询处理和查询优化 9.1 关系数据库系统的查询处理 9.1.1 查询处理步骤 查询分析 对查询语句进行扫描、词法分析和语法分析&#xff0c; 词法分析&#xff1a;从查询语句中识别出正确的语言符号。语法分析&#xff1a;进行语法检查。 查询检查 合法性检查视图转换…

【java】【SpringBoot】【二】运维实用篇 SpringBoot工程

目录 一、打包与运行 1、程序打包与运行&#xff08;Window版&#xff09; 1.1 打包 1.2 运行 1.3 打包插件 1.4 总结 1.6 命令行启动常见问题及解决方案 2、程序运行&#xff08;Linux版&#xff09; 二、配置高级 1、临时属性设置 2、配置文件分类 3、自定义配置…

Spring Boot + Vue3前后端分离实战wiki知识库系统十三--单点登录开发二

接着https://www.cnblogs.com/webor2006/p/17608839.html继续往下。 登录功能开发&#xff1a; 接下来则来开发用户的登录功能&#xff0c;先准备后端的接口。 后端增加登录接口&#xff1a; 1、UserLoginReq&#xff1a; 先来准备用户登录的请求实体&#xff1a; package com…

07JVM_内存模型和CAS与原子类

一、内存模型 1.java内存模型 Java内存结构是JMM&#xff08;Java Memory Model&#xff09;的意思。JMM定义了一套在多线程读写共享数据&#xff08;成员变量&#xff0c;数组&#xff09;时&#xff0c;对数据的原子性&#xff0c;见性&#xff0c;有序性的规则和保障。 1…

浅谈电力电容器技术的发展及选型

安科瑞 华楠 摘要&#xff1a;介绍了我国电力电容器产品制造技术的发展现状。在与国外电力电容器产品先进水平对比的基础上,讨论了我国电力电容器产品的差距和某些对策,并对我国电力电容器技术发展趋势提出了一些看法。 关键词&#xff1a;电力电容器;制造技术;技术发展 0 引…

每日一题~最大二叉树

题目链接&#xff1a;654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数…

Logstash介绍

Logstash介绍 Logstash是一个开源数据收集引擎&#xff0c;具有实时管道功能。Logstash可以动态地将来自不同数据源的数据统一起来&#xff0c;并将数据标准化到你所选择的目的地。 集中、转换和存储你的数据 Logstash是一个开源的服务器端数据处理管道&#xff0c;可以同时从多…