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

JavaSE day16笔记 - string

第十六天课堂笔记

  • 学习任务

image-20240330094805994

Comparable接口★★★★

  • 接口 : 功能的封装 => 一组操作规范

    • 一个抽象方法 -> 某一个功能的封装
    • 多个抽象方法 -> 一组操作规范
  • 接口与抽象类的区别

    • 1本质不同
      • 接口是功能的封装 , 具有什么功能 => 对象能干什么
      • 抽象类是事物本质的抽象 => 对象是什么
    • 2定义方式不同
      • 抽象类 : abstract
      • 接口 : interface
    • 3内容不同
      • 抽象类 => 普通类内容 + 抽象方法
      • 接口 => 抽象方法 + 常量 + static方法 + default 方法
    • 4使用方式不同
      • 抽象类 -> 单继承
      • 接口: 多继承 , 多实现
  • Comparable<T>接口 : 封装了 两个对象 比较大小的功能

    • <T> : 泛型 : 参数传递的数据类型

      image-20240330100619129

    • 实现接口, 重写int compareTo(T o)方法

      • this : 当前对象
      • o : 表示待比较的对象
      • 返回类型int : return 对象2.比较实例变量 - this.比较实例对象;
        • this > o : return 正数
        • this < o : return 负数
        • this = o: return 0
    • 通过 Arrays.sort(对象数组 , 0 , 对象个数); 调用进行排序 , 该方法内会调用重写了的compareTo方法

二维数组★

  • 一维数组 : int[] arrs = {1,3,2} ; : 存储整数类型的数组

  • int[] [] 数组名 = {一维数组 , …}; : 存储一维数组类型的数组 => 数组的数组 => 二维数组的静态初始化形式

    • 二位数组中的每个一维数组, 存储的是一维数组的引用值 => 将二维数组看作对象数组

      image-20240330111856039

  • 二维数组的定义格式

    • 动态初始化 :数据类型[] [] 数组名= new 数据类型[二维数组长度][一维数组长度];
      • 当没给一维数组长度输入值 -> 那么系统不会给一维数组初始化, 即默认初始化为null -> 调用的话, 就会Null Pointer Exception
  • 二维数组的遍历

    • 两层for循环
    • 两层foreach循环

Java常用类

image-20240330113952591

String字符串★★★

  • 创建String对象

    • 赋值字符串创建 : String s = “fasfe”;

    • 根据构造方法创建对象 :

      • 根据字节数组创建

        • String(byte[] bytes) 可以把bytes数组中所有字节以默认的字符编码解析为字符串
        • String(byte[] bytes, int offset, int length)可以把bytes数组中从offset开始的length个字节以默认的字符编码解析为字符串
        • String(byte[] bytes, String charsetName)可以把bytes数组中所有字节以指定的字符编码解析为字符串
        • 用处: 从文件中读取若干字节保存到字节数组中 , 将字节数组 转换为 字符串 => 转换需要用到字符编码
        • 字符编码就是字符与一串01二进制之间映射
          • 常用的字符编码 : UTF-8 , UTF-16 , GBK/GB2312 , ASCII , ISO8859-1
            • utf-8 : Unicode编码 ,
              • 一个英文字符-> 1 byte字节的二进制 ,
              • 一个汉字字符 -> 3 byte字节的二进制
            • utf-16: Unicode编码 -> 2 byte字节的二进制 , => char类型数据默认编码
            • GBK/GB 2312 : 中文编码 , GB 2312包含的字符数量多
              • 一个英文字符-> 1 byte字节的二进制 ,
              • 一个汉字字符 -> 2 byte字节的二进制
            • ASCII : 美国信息交换码, 只有英文 -> 1 byte
            • ISO8859-1 : 西欧编码,(Latin编码) 兼容ASCII => tomcat服务器默认编码

        image-20240330115250542

      • 根据字符数组创建

        • String(char[] value) 把value数组中所有的字符连接为字符串.
        • String(char[] value, int offset, int count) 把value数组中从offset开始的count个字符连接为字符串
  • 字符串数据存储 到 字符串常量池当中

  • 字符串的字面值

    • 字符串保存在字符串常量池中, 采用的是 享元模式
    • 字符串对象声明赋值 : 先看 常量池是否有该数据 , 有则引用值, 无则创建
    • 如果字符串重新赋值: 不是在常量池中覆盖替换 , 而是在常量池中重新创建一个字符串对象, 将对象引用赋值

    image-20240330163325661

    • ==javac编译器会 在编译过程中 对字符串 常量的连接 进行优化 , 在.Java -> .class的这个过程中优化

    • 代码如下:

      public static void main(String[] args) {// 定义两个字符串// "helloworld" 会存储到堆区中的常量池中,将索引值赋值给s1String s1 = "helloworld";// "helloworld"已经存在常量池中, 不会再重新创建, 将索引值给s2String s2 = "helloworld";System.out.println("s1 == s2 = " + (s1 == s2));System.out.println(s1 == s2); // 故判断结果为 true// 定义字符串String s3 = "hello";  //"hello"在常量池中不存在, 故重新创建, 并将索引值给s3String s4 = s3 + "world"; // s3是变量, 无法用到编译优化 , "world"不在常量池中,故需要创建 ,使用+号对string连接 , 会在 堆区 创建一个 新的字符串对象 , 故会是一个新的引用值 给 s4System.out.println(s1 == s4);  // 故 s1 和 s4 的码值不同 falseString s5 = "hello" + "world"; // javac编译器会对字符串 常量的连接 进行优化 , 在.Java -> .class的这个过程中优化,故 s5 其实就是 s5 = "helloworld"System.out.println(s1 == s5);  // trueSystem.out.println(s4 == s5);  // false// final 常量final String s6 = "hello"; // "hello"在常量池中已经存在, 故直接引用值 赋给 s6String s7 = s6 + "world";   // "world"已经在常量池中, 不需要创建,只需要调用,  因为s6是个常量 , 故javac编译器会对字符串 进行优化 => 即 s6 + "world" == "helloworld" , 然后又发现"helloworld"在常量池中已经存在 , 故直接将 引用值 赋 给 s7System.out.println("s1 == s7 = " + (s1 == s7));  // true
      

    image-20240330172617108

    • ​ 面试题: 以下两个共创建了几个String字符串对象 ??

              // 问题: 以下两个共创建了几个String字符串对象 ??String s8 = new String("girlfriend");String s9 = new String("girl" + "friend");/* 共三个首先 : "girlfriend" 在常量池中不存在, 故创建一个字符串对象其次 : new String("girlfriend") : 表示new 了一个字符串对象然而 : "girl" + "friend" 由于是两个常量使用+号拼接, 在javac编译时, 会自动进行调优, 使得"girl" + "friend" == "girlfriend" , 而"girlfriend" 在常量池中已经存在, 故只需要引用赋值, 不需要创建新的最后 : new String("girl" + "friend") : 表示new 了一个字符串对象综上所述 : 共创建了3个字符串对象*/
      
  • string对象的不可变性

    • 创建string对象后, string字符串对象的字符序列,就无法修改
    • string提供的方法: toUppercase() , trim() , replace() 都是返回一个新的字符串对象, 原来的字符串不变
    • string类底层使用private final byte[] value 字节数组 来保存字符串的每个字符 ,
      • 该数组是private 私有的, 我们没有权限修改 value数组的元素
      • string类 也没有相应的方法修改 value 数组元素
    • 使用 + 进行字符串连接时 , 会创建新的string对象
  • 问题 : 因为string字符串是不可变的 , 创建string字符串对象后 , 他的字符序列 就不能修改了 , 使用加号(+) 对string 变量进行连接时, 会创建新的string对象

    • 当频繁使用字符串连接时 , 会出现多次创建string的情况 ,
    • 故 频繁字符串操作 时建议使用 可变字符串来进行操作
stringBuilder&stringBuffer
  • 可变字符串 => 字符序列可以修改

    • stringBuffer : 是线程安全的
    • stringBuilder : 是线程不安全的 , 但是执行效率更高
  • 线程安全

    • 多个线程 同时操作 一个共享数据 的时候, 可能会存在数据紊乱
  • 创建对象常用构造方法

    • new StringBuilder() 创建空字符串, 底层数组默认长度为16
    • new StringBuilder( 1000000 ) 创建空字符串, 指定底层数组的大小, 避免数组频繁扩容
    • StringBuilder(CharSequence seq) 根据其他字符串创建
  • 常用操作

    • StringBuilder append(String str) 在当前字符串后面连接str
    • StringBuilder delete(int start, int end) 删除字符串中[start, end)范围内的字符
    • StringBuilder insert(int offset , String str) : 在当前字符串的offset位置插入 str
    • StringBuilder replace(int start, int end, String str) 把当前字符串[start, end)范围内的字符替换为str
    • StringBuilder reverse() 把字符串中的字符序列逆序
    • String toString()
      • 因为字符串方法返回值类型都是字符串对象,故可以使用连缀操作
  • 代码如下:

        public static void main(String[] args) {// new一个可变字符串StringBuilder stringBuilder = new StringBuilder();// 空串, 底层数组长度为16StringBuilder stringBuilder1 = new StringBuilder(2000); // 空串, 底层数组长度为capacity : 2000StringBuffer stringBuffer = new StringBuffer(); // 'StringBuffer stringBuffer' may be declared as 'StringBuilder' : 都可以声明为StringBuilder// append() : 字符串的连接for (int i = 0; i < 10; i++) {stringBuffer.append(i);}System.out.println("stringBuffer = " + stringBuffer);// delete() : 删除stringBuffer.delete(3, 8); // 删除[3 , 8)范围内数字System.out.println("删完后stringBuffer = " + stringBuffer);  //删完后stringBuffer = 01289// insert() : 插入stringBuffer.insert(3, "flower"); // 在索引为3的位置上插入个数,后面的数顺延System.out.println("插入后stringBuffer = " + stringBuffer);  //插入后stringBuffer = 012flower89// replace() 替换stringBuffer.replace(0, 3, "double");System.out.println("替换后stringBuffer = " + stringBuffer); // 把[0 , 3)的值替换成str   // 替换后stringBuffer = doubleflower89// reverse() : 反转stringBuffer.reverse();System.out.println("反转后stringBuffer = " + stringBuffer);  //反转后stringBuffer = 98rewolfelbuod// 因为字符串方法返回值类型都是字符串对象,故可以使用连缀操作String string = stringBuffer.reverse().replace(0, 5, "hejiabei").toString();System.out.println("string = " + string); // string = hejiabeieflower89}
    
string常用的方法
  • char charAt(int index); : 返回字符串中 index 位置的字符

  • int length(); : 字符串中字符的数量

    • string字符串由若干字符组成,

      • jdk8之前 : 底层定义 private final char value[] 字符数组来保存字符串的每个字符

      • jdk9 开始 : 底层定义 private final byte[] value 字节数组来保存字符串的每个字符

        • 目的 : 节省空间
        • 在存储等操作时, 先判断字符编码,
          • 如果是Latin编码则使用一个字节存储一个字符
          • 如果是utf16编码 ,则使用2个字节存储一个字符
      • 底层源码:

        public int compareTo(String anotherString) {byte v1[] = value;byte v2[] = anotherString.value;byte coder = coder();if (coder == anotherString.coder()) {return coder == LATIN1 ? StringLatin1.compareTo(v1, v2): StringUTF16.compareTo(v1, v2);}return coder == LATIN1 ? StringLatin1.compareToUTF16(v1, v2): StringUTF16.compareToLatin1(v1, v2);}@IntrinsicCandidatepublic static int compareTo(byte[] value, byte[] other) {int len1 = value.length;int len2 = other.length;return compareTo(value, other, len1, len2);}public static int compareTo(byte[] value, byte[] other, int len1, int len2) {int lim = Math.min(len1, len2);for (int k = 0; k < lim; k++) {if (value[k] != other[k]) {return getChar(value, k) - getChar(other, k);}}return len1 - len2;}
        
  • 代码如下:

            // 定义一个字符串String s = "繁荣昌盛,国泰民安";// 获取字符串长度System.out.println("s.length() = " + s.length());for (int i = 0; i < s.length(); i++) {System.out.print(s.charAt(i) + " ");}System.out.println();
    
  • int compareTo(String anotherString) : 比较两个字符大小

    • string类型实现了comparable接口, 重写了comparaTo方法,

    • 定义比较大小的规则: 区分大小写 , 逐个比较字符串的每个字符 , 遇到了第一个不一样的字符 字符相减 , 如果都一样 , 再比较字符串长度 .

    • 底层代码:

      public int compareTo(String anotherString) {byte v1[] = value;byte v2[] = anotherString.value;byte coder = coder();if (coder == anotherString.coder()) {return coder == LATIN1 ? StringLatin1.compareTo(v1, v2): StringUTF16.compareTo(v1, v2);}return coder == LATIN1 ? StringLatin1.compareToUTF16(v1, v2): StringUTF16.compareToLatin1(v1, v2);}private static int compareToUTF16Values(byte[] value, byte[] other, int len1, int len2) {int lim = Math.min(len1, len2);for (int k = 0; k < lim; k++) {char c1 = getChar(value, k);char c2 = StringUTF16.getChar(other, k);if (c1 != c2) {return c1 - c2;}}return len1 - len2;}
      
  • int compareToIgnoreCase(String str); 忽略大小写, 比较字符大小

    • 代码如下:
            // 比较两个字符串大小System.out.println("\"hello\".compareTo(\"hella\") = " + "hello".compareTo("hella"));System.out.println("\"hello\".compareTo(\"w\") = " + "hello".compareTo("w"));System.out.println("\"繁荣昌盛\".compareTo(s) = " + "繁荣昌盛".compareTo(s));System.out.println("\"hello\".compareTo(\"HELLO\") = " + "hello".compareTo("HELLO"));System.out.println("\"hello\".compareToIgnoreCase(\"HELLO\") = " + "hello".compareToIgnoreCase("HELLO"));
    
  • boolean contains(CharSequence s) : 判断当前字符串是否包含s字符串

    • CharSequence 是一个接口 ,
      • 在调用方法时 , 方法实参为 CharSequence 接口的 实现类对象或者 匿名内部类对象
      • CharSequence接口 的实现类有 : string , string builder , string buffer
    • 代码如下:
            // 包含System.out.println("s.contains(\"国\") = " + s.contains("国")); // trueSystem.out.println("s.contains(\"中\") = " + s.contains("中")); // fase
    
  • boolean endsWith(String suffix) : 判断字符串是否以suffix结尾

  • boolean startsWith(String prefix) : 判断字符串是否以 prefix 开头

  • boolean equals(Object anjObject) : 判断两个字符串是否一样

  • boolean equalsIgnoreCase(String anotherString) : 忽略大小写, 判断是否一样

    • 代码如下
            // 判断字符System.out.println("s.startsWith(\"繁\") = " + s.startsWith("繁"));  //trueSystem.out.println("s.endsWith(\"强\") = " + s.endsWith("强"));  // falseSystem.out.println("s.equals(\"繁荣昌盛,国泰民安\") = " + s.equals("繁荣昌盛,国泰民安"));  //s.equals("繁荣昌盛,国泰民安") = trueSystem.out.println("\"hello\".equalsIgnoreCase(\"HELLO\") = " + "hello".equalsIgnoreCase("HELLO"));  //"hello".equalsIgnoreCase("HELLO") = true
    
  • byte[] getBytes() : 返回当前字符串 在默认编码下 对应的字节数组 :

    • utf-8编码中 , 一个英文字符对应一个byte字节, 一个汉字对应 3个 byte 字节
  • byte[] getBytes(String charsetName) : 返回当前字符串 在指定的编码 下对应的字节数组

    • 报出异常 unhandled exception
    • 代码如下:
            // 返回 编码对应的字节数组byte[] bytes = s.getBytes();System.out.println("Arrays.toString(bytes) = " + Arrays.toString(bytes));  //Arrays.toString(bytes) = [-25, -71, -127, -24, -115, -93, -26, -104, -116, -25, -101, -101, 44, -27, -101, -67, -26, -77, -80, -26, -80, -111, -27, -82, -119]// 将字节数组 转为字符串: 通过创建string来实现String s1 = new String(bytes);System.out.println("s1 = " + s1);  //s1 = 繁荣昌盛,国泰民安// 指定编码 返回对应的字节数组byte[] gbks = s.getBytes("GBK"); //Unhandled exception: java.io.UnsupportedEncodingExceptionSystem.out.println("Arrays.toString(gbks) = " + Arrays.toString(gbks));  //Arrays.toString(gbks) = [-73, -79, -56, -39, -78, -3, -54, -94, 44, -71, -6, -52, -87, -61, -15, -80, -78]// 将字节数组重新合成字符串String s2 = new String(gbks);System.out.println("s2 = " + s2);  //s2 = ���ٲ�ʢ,��̩��String gbk = new String(gbks, "GBK");System.out.println("gbk = " + gbk);  //gbk = 繁荣昌盛,国泰民安
    
  • int indexOf(String str) : 返回str在当前字符串中第一次出现的索引值

  • int lastIndexOf(String str) : 返回最后一次出现的索引值

  • String substring(int beginIndex) : 返回当前字符串 从 begin Index位置 开始的子串

  • String substring(int beginIndex, int endIndex) : 返回[beginIndex , endIndex ) 范围的子串

  • 代码如下:

            // 查字符String path = "E:\\course\\02Project\\javaSEProject\\day16\\src\\cn\\hejiabei\\string\\StringMethod.java";// 获取文件名 以及 文件类型int slash = path.lastIndexOf("\\");  // 获取最后一个小标int dot = path.lastIndexOf('.');// 获取字符串一段的值String fileName = path.substring(slash + 1, dot);System.out.println("fileName = " + fileName); // fileName = StringMethodString suffix = path.substring(dot);System.out.println("suffix = " + suffix); // suffix = .java
    
  • String replace(CharSequence target, CharSequence replacement) : 将target 替换为 replacement, 返回一个新字符串 , 原字符串不变

  • 代码如下:

            // 字符替换replaceString s3 = "xiaoming666xiaohua666";String s4 = s3.replace('6', '*');System.out.println("原来是s3 = " + s3);   //原来是s3 = xiaoming666xiaohua666System.out.println("替换后s4 = " + s4);  //s4 = xiaoming***xiaohua***
    
  • String[] split(String regex) : 将字符串 通过regex 拆分成 数组

    • regex = “”: 使用""空串 对字符串拆分 , => 即拆分成字符数组 ==> 相当于toCharArray方法
  • 代码如下:

            // 拆分String s5 = " 东临碣石,以观沧海,水何澹澹,山岛竦峙,树木丛生,百草丰茂,秋风萧瑟,洪波涌起,日月之行,若出其中,星汉灿烂,若出其里,幸甚至哉,歌以咏志";System.out.println(s5); // 东临碣石,以观沧海,水何澹澹,山岛竦峙,树木丛生,百草丰茂,秋风萧瑟,洪波涌起,日月之行,若出其中,星汉灿烂,若出其里,幸甚至哉,歌以咏志String[] split = s5.split(",");System.out.println("Arrays.toString(split) = " + Arrays.toString(split));  //Arrays.toString(split) = [ 东临碣石, 以观沧海, 水何澹澹, 山岛竦峙, 树木丛生, 百草丰茂, 秋风萧瑟, 洪波涌起, 日月之行, 若出其中, 星汉灿烂, 若出其里, 幸甚至哉, 歌以咏志]// 也可以使用""空字符进行拆分String[] split1 = s5.split("");System.out.println("Arrays.toString(split1) = " + Arrays.toString(split1));  //Arrays.toString(split1) = [ , 东, 临, 碣, 石, ,, 以, 观, 沧, 海, ,, 水, 何, 澹, 澹, ,, 山, 岛, 竦, 峙, ,, 树, 木, 丛, 生, ,, 百, 草, 丰, 茂, ,, 秋, 风, 萧, 瑟, ,, 洪, 波, 涌, 起, ,, 日, 月, 之, 行, ,, 若, 出, 其, 中, ,, 星, 汉, 灿, 烂, ,, 若, 出, 其, 里, ,, 幸, 甚, 至, 哉, ,, 歌, 以, 咏, 志]
    
  • char[] toCharArray(); : 将字符串转成 字符数组

  • 代码如下:

            // 字符串 转换成 字符数组String s6 = "hello , world";char[] charArray = s6.toCharArray();System.out.println("Arrays.toString(charArray) = " + Arrays.toString(charArray));  //Arrays.toString(charArray) = [h, e, l, l, o,  , ,,  , w, o, r, l, d]
    
  • String toLowerCase(); : 大写转小写

  • String toUpperCase(); : 小写转大写

  • 代码如下:

            // 大小写转化String s7 = "Good Good Study";String upperCase = s7.toUpperCase();System.out.println("upperCase = " + upperCase);  //upperCase = GOOD GOOD STUDYString lowerCase = s7.toLowerCase();System.out.println("lowerCase = " + lowerCase);  //lowerCase = good good study
    
  • String trim(); : 去掉字符串前后空格符

  • 代码如下:

            // 去掉两边空白字符String s8 = "    Good    Good     Study   ";System.out.println("s8 = " + s8);  //s8 =     Good    Good     Study// 去掉两边空白String trim = s8.trim();System.out.println("trim = " + trim);  //trim = Good    Good     Study
    
  • static String valueOf(int i) : 把其他类型的数据转换为字符串

    • 底层调用stu对象的toString()对象 , Student类没有重写toString()对象, 调用object类继承来的toString()方法 , 返回: 全限定类名 + “@” + 哈希码的十六进制
  • static String valueOf(Object obj) : 把对象转为字符串

  • 代码如下:

            // 将 数据类型 转换为 字符串 valueofint num = 2523;String s9 = String.valueOf(num);System.out.println("s9 = " + s9);  // // s9 = 2523// object转换Student student = new Student("张三");String s10 = String.valueOf(student);System.out.println("s10 = " + s10);  //s10 = cn.hejiabei.string.StringMethod$Studenfd0d5ae
    

调用object类继承来的toString()方法 , 返回: 全限定类名 + “@” + 哈希码的十六进制

  • static String valueOf(Object obj) : 把对象转为字符串

  • 代码如下:

            // 将 数据类型 转换为 字符串 valueofint num = 2523;String s9 = String.valueOf(num);System.out.println("s9 = " + s9);  // // s9 = 2523// object转换Student student = new Student("张三");String s10 = String.valueOf(student);System.out.println("s10 = " + s10);  //s10 = cn.hejiabei.string.StringMethod$Studenfd0d5ae
    

相关文章:

JavaSE day16笔记 - string

第十六天课堂笔记 学习任务 Comparable接口★★★★ 接口 : 功能的封装 > 一组操作规范 一个抽象方法 -> 某一个功能的封装多个抽象方法 -> 一组操作规范 接口与抽象类的区别 1本质不同 接口是功能的封装 , 具有什么功能 > 对象能干什么抽象类是事物本质的抽象 &…...

java将文件转成流文件返回给前端

环境&#xff1a;jdk1.8&#xff0c;springboot2.5.3,项目端口号&#xff1a;9100 1.待转换的文件 一、路径 二、文件内容 2.controller中代码 package com.example.pdf.controller;import com.example.pdf.service.GetFileStreamService; import org.springframework.web.b…...

使用Node.js常用命令提高开发效率

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;广泛用于构建服务器端应用程序和命令行工具。Node.js提供了丰富的命令和工具&#xff0c;可以帮助开发者更高效地开发应用程序。在日常开发中&#xff0c;除了Node.js本身的核心功能外&#xff0c;npm&#x…...

百度资源平台链接提交

百度资源平台是百度搜索引擎提供的一个重要工具&#xff0c;用于帮助网站主将自己的网站链接提交给百度搜索引擎&#xff0c;以便更快地被收录和展示在搜索结果中。以下将就百度资源平台链接提交的概念、操作方法以及其对网站收录和曝光的影响进行探讨&#xff1a; 什么是百度资…...

力扣爆刷第108天之CodeTop100五连刷26-30

力扣爆刷第108天之CodeTop100五连刷26-30 文章目录 力扣爆刷第108天之CodeTop100五连刷26-30一、15. 字符串相加二、300. 最长递增子序列三、42. 接雨水四、43. 重排链表五、142. 环形链表 II 一、15. 字符串相加 题目链接&#xff1a;https://leetcode.cn/problems/add-strin…...

Android裁剪图片为波浪形或者曲线形的ImageView

如果需要做一个自定义的波浪效果的进度条&#xff0c;裁剪图片&#xff0c;对ImageView的图片进行裁剪&#xff0c;比如下面2张图&#xff0c;如何实现&#xff1f; 先看下面的效果&#xff0c;看到其实只需要对第一张高亮的图片进行处理即可&#xff0c;灰色状态的作为背景图。…...

Linux课程____shell脚本应用

:一、认识shell 常用解释器 Bash , ksh , csh 登陆后默认使用shell&#xff0c;一般为/bin/bash&#xff0c;不同的指令&#xff0c;运行的环境也不同 二、 编写简单脚本并使用 # vim /frist.sh //编写脚本文件&#xff0c;简单内容 #&#xff01;/bin/bash …...

设计模式12--组合模式

定义 案例一 案例二 优缺点...

【微服务】软件架构的演变之路

目录 单体式架构的时代单体式架构(Monolithic)优点缺点适用场景单体式架构面临诸多问题1.宽带提速&#xff0c;网民增多2.Web2.0时代的特点问题描述优化方向 集群优点缺点适用场景搭建集群后面临诸多问题用户请求问题用户的登录信息数据查询 改进后的架构 垂直架构优点缺点 分布…...

安全算法 - 加密算法

加密算法是一种在信息安全领域中广泛应用的算法&#xff0c;能够将数据进行加密转换&#xff0c;以保证数据的保密性和安全性。 它具有保密性、对称加密和非对称加密、密钥管理、数据完整性和认证等重要特点和应用。 加密算法可以分为对称加密和非对称加密两种类型&#xff1…...

安全算法 - 国密算法

国密算法是中国自主研发的密码算法体系&#xff0c;包括对称加密算法、非对称加密算法和哈希算法。其中&#xff0c;国密算法采用SM4作为对称加密算法&#xff0c;SM2作为非对称加密算法&#xff0c;以及SM3作为哈希算法。国密算法在信息安全领域具有重要意义和广泛应用&#x…...

蓝桥杯2014年第十三届省赛真题-武功秘籍

一、题目 武功秘籍 小明到X山洞探险&#xff0c;捡到一本有破损的武功秘籍&#xff08;2000多页&#xff01;当然是伪造的&#xff09;。他注意到&#xff1a;书的第10页和第11页在同一张纸上&#xff0c;但第11页和第12页不在同一张纸上。 小明只想练习该书的第81页到第92页的…...

Could not initialize class java.awt.Font

项目场景&#xff1a; 项目场景&#xff1a;java项目在web端导出Excel、Word、PDF等文档 问题描述 在Windows系统中开发以及运行文件导出正常&#xff0c;单机部署到Linux中或者使用docker部署后&#xff0c;导出报错。 异常&#xff1a; eleasing transactional SqlSession…...

Mysql or与in的区别

创建一个表格 内涵一千万条数据 这张表中&#xff0c;只有id有建立索引&#xff0c;且其余都没有 测试1&#xff1a;使用or的情况下&#xff0c;根据主键进行查询 可以看到根据主键id进行or查询 花费了30-114毫秒&#xff0c;后面30多毫秒可能是因为Mysql的Buffer Pool缓冲池的…...

STM32——USART

一、通信 1.1通信是什么&#xff1b; 通信是将一个设备的数据发送到另一个设备中&#xff0c;从而实现硬件的扩展&#xff1b; 1.2通信的目的是什么&#xff1b; 实现硬件的扩展-在STM32中集成了很多功能&#xff0c;例如PWM输出&#xff0c;AD采集&#xff0c;定时器等&am…...

WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具

关于WebCopilot WebCopilot是一款功能强大的子域名枚举和安全漏洞扫描工具&#xff0c;该工具能够枚举目标域名下的子域名&#xff0c;并使用不同的开源工具检测目标存在的安全漏洞。 工具运行机制 WebCopilot首先会使用assetsfinder、submaster、subfinder、accumt、finddom…...

HarmonyOS实战开发-如何实现一个支持加减乘除混合运算的计算器。

介绍 本篇Codelab基于基础组件、容器组件&#xff0c;实现一个支持加减乘除混合运算的计算器。 说明&#xff1a; 由于数字都是双精度浮点数&#xff0c;在计算机中是二进制存储数据的&#xff0c;因此小数和非安全整数&#xff08;超过整数的安全范围[-Math.pow(2, 53)&#…...

每日OJ题_子序列dp⑥_力扣873. 最长的斐波那契子序列的长度

目录 力扣873. 最长的斐波那契子序列的长度 解析代码 力扣873. 最长的斐波那契子序列的长度 873. 最长的斐波那契子序列的长度 难度 中等 如果序列 X_1, X_2, ..., X_n 满足下列条件&#xff0c;就说它是 斐波那契式 的&#xff1a; n > 3对于所有 i 2 < n&#x…...

病毒循环Viral Loop是什么?为何能实现指数增长

一、什么是病毒循环&#xff08;Viral Loop&#xff09;&#xff1f; 病毒循环&#xff08;Viral Loop&#xff09;是一种机制&#xff0c;它推动连续的推荐以实现持续增长。 它会促使你现有的客户推荐其他人&#xff0c;去认识你的品牌&#xff0c;然后让这些新客户进一步告诉…...

下载huggingface中数据集/模型(保存到本地指定路径)

一. snapshot_download # 1.安装huggingface_hub # pip install huggingface_hubimport osfrom huggingface_hub import snapshot_downloadprint(downloading entire files...) # 注意&#xff0c;这种方式仍然保存在cache_dir中 snapshot_download(repo_id"ibrahimhamam…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...