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

【0基础学Java第十课】-- 认识String类

10. 认识String类

  • 10.1 String类的重要性
  • 10.2 常用方法
    • 10.2.1 字符串构造
    • 10.2.2 String对象的比较
    • 10.2.3 字符串查找
    • 10.2.4 转化
    • 10.2.5 字符串替换
    • 10.2.6 字符串拆分
    • 10.2.7 字符串截取
    • 10.2.8 字符串的不可变性
    • 10.2.9 字符串修改
  • 10.3 StringBuilder和StringBuffer
    • 10.3.1 StringBuilder的介绍
    • 10.3.2 面试题:
  • 10.4 String类oj

10.1 String类的重要性

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类
另外在开发和校招笔试中,字符串也是常客,比如:

  • 字符串转整形数字
  • 字符串相加

而在面试中经常被提问:
String、StringBuff和StringBuilder之间的区别等。

10.2 常用方法

10.2.1 字符串构造

常用的三种构造方法:

    public static void main(String[] args) {//使用常量串构造String str = "hello";System.out.println(str); // 调用println中print里面再调用write方法来打印//直接newString对象String str2 = new String("world");System.out.println(str2);//使用字符数组进行构造char[] array = {'h','e','l','l','o'};String str3 = new String(array);System.out.println(str3);}

其他方法需要使用可以去查看Java在线文档:链接: String官方文档

注意:

  1. String是引用类型,内部并不存储字符串本身,比如在String类的是实现源码,String类实例变量如下:
    在这里插入图片描述
    字符串实际保存在char类型的数组,即value去引用里面的数组内容,而s3这个引用 指向了s1这个引用 指向的对象如下:
    在这里插入图片描述
    public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("world");String s3 = s1;System.out.println(s3);}
  1. 在Java中 “” 引起来也是String类型对象,如:
    public static void main(String[] args) {String str4 = "";System.out.println("输出:"+str4);System.out.println(str4.length());System.out.println(str4.isEmpty());//为空 则为true,但这里的空不是nullString str5 = null;System.out.println(str5.isEmpty());//报错:NullPointerException 所以null 和 ""不一样}

10.2.2 String对象的比较

字符串的比较是常见操作之一,比如:字符串排序。Java中总共提供了4中方式:

  1. == 比较是否引用同一个对象
    注意对于内置类型,双等号比较的是变量中的值;对于引用类型,==比较的是引用中的地址。
    public static void main(String[] args) {int a = 10;int b = 20;int c = 10;// 对于基本类型变量,==比较两个变量中存储的值是否相同System.out.println(a == b); // falseSystem.out.println(a == c); // true// 对于引用类型变量,==比较两个引用中的地址String s1 = new String("hello");String s2 = new String("hello");String s3 = new String("world");String s4 = s1;System.out.println(s1 == s2); // falseSystem.out.println(s2 == s3); // falseSystem.out.println(s1 == s4); // true}
  1. boolean equals(Object anObject) 方法:按照字典序比较
    字典序:字符大小的顺序
    String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照
    如下规则进行比较,比如: s1.equals(s2)
    public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("world");System.out.println(s1.equals(s2)); //String类重写了父类Object中equals方法}

而父类Object中equals方法如下:

    public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}

另外:

    public static void main(String[] args) {String s3 = "hello";String s4 = "hello";System.out.println(s3==s4); // trueSystem.out.println(s3.equals(s4)); // true}

在这里插入图片描述

  1. int compareTo(String s) 方法
public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("abc");String s4 = new String("abcdef");System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1System.out.println(s1.compareTo(s3)); // 相同输出 0System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3
}

与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:

  • 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  • 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
  1. int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较:
public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("ABc");String s4 = new String("abcdef");System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
}

10.2.3 字符串查找

字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:

    public static void main(String[] args) {String s1 = new String("hello");//返回字符串对应下标的字符char ch = s1.charAt(1);System.out.println(ch); //e//返回对应字符出现的下标位置 从头开始一个一个找 没有返回-1int index = s1.indexOf('l');System.out.println(index); //2// 从指定位置(3)开始找某个字符出现的位置   没有返回-1int index2 = s1.indexOf('l',3);System.out.println(index2); //3// 字符串查找 从一个字符串找另一个字符串   没有返回-1int index3 = s1.indexOf("llo");System.out.println(index3); //2int index4 = s1.indexOf("llo",3);System.out.println(index4); //-1//从后往前找,返回ch第一次出现的位置,没有返回-1int index5 = s1.lastIndexOf('l');System.out.println(index5); //3// 从指定位置开始找,从后往前找ch第一次出现的位置,没有返回-1int index6 = s1.lastIndexOf('l',2);System.out.println(index6); // 2// 字符串也可以从后往前同理}

10.2.4 转化

结论:字符串的改变 都是产生了新的对象
1.数值和字符串转化:String.valueOf()方法,里面可以是整数,double,boolean等:
在这里插入图片描述

    public static void main(String[] args) {//把整数  转化为  字符串String str = String.valueOf(123);System.out.println(str); //这个过程  可以理解为序列化String str1 = String.valueOf(new Student("张三",12));System.out.println(str1); //上面重写一下toString方法来变成想要的形式  姓名:张三  年龄:12//包装类:首先是一个类 其次 类中拥有更多的方法 使用起来非常方便//把字符串变成整型int a = Integer.parseInt("123");System.out.println(a);  //123//变成double  变成什么类型就是 该包装类.parse类型double d = Double.parseDouble("99.99");System.out.println(d);  //99.99}

2.大小写转换:toUpperCase(),变小:toLowerCase()

    public static void main(String[] args) {//结论:字符串的改变 都是产生了新的对象//转化成大写的时候,产生了一个新的对象String str = "hello";String ret = str.toUpperCase();System.out.println(ret);  //HELLOSystem.out.println(str);String str2 = "HELLO";String ret2 = str2.toLowerCase();System.out.println(ret2); // hello}

3.字符串转数组

    public static void main(String[] args) {String str = "hello";char[] chars = str.toCharArray();for (char ch:chars) {System.out.println(ch);}

4.格式化

    public static void main(String[] args) {String s = String.format("%d-%d-%d",2019,9,14);System.out.println(s); //2019-9-14}

10.2.5 字符串替换

    public static void main(String[] args) {String str = "abcdabcddef";// 字符替换 把a替换成AString ret = str.replace('a','A');System.out.println(ret);// 字符串替换  把ab替换成AB String ret2 = str.replace("ab","AB");System.out.println(ret2);}

10.2.6 字符串拆分

.split(“切割符”,限制数) 拆分为几部分的数组接收:

    public static void main(String[] args) {String str = "name=zhagnsan&age=10";String[] ret = str.split("&");for (int i = 0; i < ret.length; i++) {System.out.println(ret[i]);//name=zhagnsan//age=10}//可以加限制分割为几部分String str2 = "hello world hello bit";String[] ret2 = str2.split(" ",2);for (int i = 0; i < ret2.length; i++) {System.out.println(ret2[i]);    //hello//world hello bit}String str3 = "192.168.1.1";String[] ret3 = str3.split("\\.");for (int i = 0; i < ret3.length; i++) {System.out.println(ret3[i]);//192//168//1//1}

注意

  1. 字符"|“,”*“,”+“都得加上转义字符,前面加上”\" .
  2. 而如果是"" ,那么就得写成"\\" .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
    public static void main(String[] args) {//正则表达式的分割String str = "192\\168\\1\\1";String[] ret = str.split("\\\\");for (int i = 0; i < ret.length; i++) {System.out.println(ret[i]);//192//168//1//1}// 俩个分割符String str2 = "name=zhagnsan&age=10";String[] ret2 = str2.split("=|&");for (int i = 0; i < ret2.length; i++) {System.out.println(ret2[i]);//name//zhagnsan//age//10}
  1. 多次拆分:
    public static void main(String[] args) {//实现多次分割String str = "name=zhagnsan&age=10";String[] ret = str.split("&");// [0] name=zhagnsan  [1]  age=10for (String x:ret) {String[] s = x.split("=");for (String ss:s) {System.out.println(ss);//name//zhagnsan//age//10}}}

10.2.7 字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:
String substring(int beginIndex) 从指定索引截取到结尾
String substring(int beginIndex, int endIndex) 截取部分内容
trim() 截取字符串两边的空格 保留中间空格

    public static void main(String[] args) {String str = "abcdef";//从指定截取到结尾String ret = str.substring(3);System.out.println(ret);   //def//截取部分内容  [a,b) 在Java中一般是左闭有开String ret2 = str.substring(2,5);   //cdeSystem.out.println(ret2);//trim() 截取字符串两边的空格  保留中间空格String str3 = "    abcde fefef  f     ";String ret3 = str3.trim();System.out.println(ret3);   //abcde fefef  f}

10.2.8 字符串的不可变性

String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,对字符串的改变操作都会产生新的对象。

在被private修饰封装起来的value[] 拿不到value里面的内容,而且也没有提供get 和set方法。
在这里插入图片描述

    public static void main15(String[] args) {final char[] value = {'a','b','c','d'};value[0] = 'g';//修改对象 0 下标内容//value = new char[10];//指向新的对象}

final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内
容是可以修改的。

public static void main(String[] args) {final int array[] = {1,2,3,4,5};array[0] = 100;System.out.println(Arrays.toString(array));// array = new int[]{4,5,6}; // 编译报错: 无法为最终变量array分配值//可以修改值但是不能修改数组的指向
}

为什么 String 要设计成不可变的?(不可变对象的好处是什么?)

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.

10.2.9 字符串修改

注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率
非常低下。

    public static void main15(String[] args) {//String s = "hello";//s += " world";  // s指向了新的指向//System.out.println(s); // 输出:hello world//相当于下面:String s = "hello";StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(s);s = stringBuilder.toString();System.out.println(s);System.out.println(stringBuilder);}

在这里插入图片描述

但是这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。

    public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("abcdef");stringBuilder.reverse();System.out.println(stringBuilder);}public static void main17(String[] args) {long start = System.currentTimeMillis();StringBuffer sbf = new StringBuffer("");for(int i = 0; i < 100000; ++i){sbf.append(i);}long end = System.currentTimeMillis();System.out.println(end - start);start = System.currentTimeMillis();StringBuilder sbd = new StringBuilder();for(int i = 0; i < 100000; ++i){sbd.append(i);}end = System.currentTimeMillis();System.out.println(end - start);start = System.currentTimeMillis();//获取当前系统的时间戳String s = "";for(int i = 0; i < 100000; ++i){//以后不能在循环当中 这样去拼接字符串s += i;}end = System.currentTimeMillis();System.out.println(end - start);}

10.3 StringBuilder和StringBuffer

10.3.1 StringBuilder的介绍

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大
部分功能是相同的,这里介绍 StringBuilder常用的一些方法,其他可以点击链接: stringBuilder在线文档

    public static void main(String[] args) {//StringBuilder StringBuffer 是一个可变的对象 返回的是this 也就是当前对象// 使用多线程情况下 synchronized 执行一个append方法时得先执行完才能执行其他方法// 但是频繁得上锁 和 解锁是需要耗费系统的资源StringBuffer stringBuffer = new StringBuffer("aaaa");stringBuffer.append("111");System.out.println(stringBuffer); //aaaa111StringBuilder stringBuilder = new StringBuilder("abcdef");stringBuilder.append("123");stringBuilder.append("456").append("789");stringBuilder.reverse(); // 逆置字符串System.out.println(stringBuilder);  //987654321fedcba}
  • StringBuff append(String str) ----- 在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量
  • char charAt(int index) ----- 获取index位置的字符
  • int length() ----- 获取字符串的长度
  • int capacity() ----- 获取底层保存字符串空间总的大小
  • void ensureCapacity(int mininmumCapacity) ----- 扩容
  • void setCharAt(int index,char ch) ----- 将index位置的字符设置为ch
  • int indexOf(String str) 返回str第一次出现的位置
  • int indexOf(String str, int fromIndex) ----- 从fromIndex位置开始查找str第一次出现的位置
  • int lastIndexOf(String str) ----- 返回最后一次出现str的位置
  • int lastIndexOf(String str, int fromIndex) ----- 从fromIndex位置开始找str最后一次出现的位置
  • StringBuff insert(int offset, String str) ----- 在offset位置插入:八种基类类型 & String类型 & Object类型数据
  • StringBuffer deleteCharAt(int index) ----- 删除index位置字符
  • StringBuffer delete(int start, int end) ----- 删除[start, end)区间内的字符
  • StringBuffer replace(int start, int end, String str) ----- 将[start, end)位置的字符替换为str
  • String substring(int start) ----- 从start开始一直到末尾的字符以String的方式返回
  • String substring(int start,int end) ----- 将[start, end)范围内的字符以String的方式返回
  • StringBuffer reverse() ----- 反转字符串
  • String toString() ----- 将所有字符按照String的方式返回
    public static void main(String[] args) {StringBuilder sb1 = new StringBuilder("hello");StringBuilder sb2 = sb1;// 追加:即尾插-->字符、字符串、整形数字sb1.append(' '); // hellosb1.append("world"); // hello worldsb1.append(123); // hello world123System.out.println(sb1); // hello world123System.out.println(sb1 == sb2); // trueSystem.out.println(sb1.charAt(0)); // 获取0号位上的字符 hSystem.out.println(sb1.length()); // 获取字符串的有效长度14System.out.println(sb1.capacity()); // 获取底层数组的总大小sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123System.out.println(sb1);System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置sb1.deleteCharAt(0); // 删除首字符sb1.delete(0,5); // 删除[0, 5)范围内的字符String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回System.out.println(str);sb1.reverse(); // 字符串逆转str = sb1.toString(); // 将StringBuffer以String的方式返回System.out.println(str);}

总结:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可
以修改
频繁修改字符串的情况考虑使用StringBuilder
注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

  • String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
  • StringBuilder变为String: 调用toString()方法。

10.3.2 面试题:

  1. String、StringBuffer、StringBuilder的区别
  • String的内容不可修改,StringBuffer和StringBuilder的内容可以修改
  • StringBuffer和StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于多线程安全操作;而StringBuilder未采用同步操作,属于线程不安全操作
  1. 以下总共创建了多少个String对象【前提不考虑常量池之前是否存在】

10.4 String类oj

  1. 链接: 第一个只出现一次的字符
    public int firstUniqChar(String s) {//1.定义一个计数数组int[] count = new int[26];//2.遍历字符串 记录次数for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);count[ch-'a']++;}//3.再次遍历原字符串for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);if (count[ch -'a'] == 1) {return i;}}return -1;}
  1. 链接: 字符串最后一个单词的长度
  • 使用split方法分割空格后的字符串
    public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString s = in.nextLine();String[] ret = s.split(" ");System.out.println(ret[ret.length-1].length());}}
  • 使用lastIndexOf方法找到空格的位置,然后substring截取空格+1之后的字符串
    public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString s = in.nextLine();int index = s.lastIndexOf(" ");String str = s.substring(index+1);int len = str.length();System.out.println(len);}}
  1. 链接: 检测字符串是否为回文
    public boolean isPalindrome(String s) {s = s.toLowerCase();int left = 0;int right = s.length()-1;while(left < right) {//1.left走到合法字符底下while(left<right && !isCharacterNum(s.charAt(left))) {left++;}//2.right走到合法字符底下while(left<right && !isCharacterNum(s.charAt(right))) {right--;}if(s.charAt(left) == s.charAt(right)) {left++;right--;} else {return false;}}return true;}private boolean isCharacterNum(char ch) {// if(ch >= 'a' && ch <= 'z' || ch >='0' && ch <= '9') {//     return true;// }// return false;if(Character.isDigit(ch) || Character.isLetter(ch)) {return true;}return false;}

相关文章:

【0基础学Java第十课】-- 认识String类

10. 认识String类 10.1 String类的重要性10.2 常用方法10.2.1 字符串构造10.2.2 String对象的比较10.2.3 字符串查找10.2.4 转化10.2.5 字符串替换10.2.6 字符串拆分10.2.7 字符串截取10.2.8 字符串的不可变性10.2.9 字符串修改 10.3 StringBuilder和StringBuffer10.3.1 String…...

lxml基本使用

lxml是python的一个解析库&#xff0c;支持HTML和XML的解析&#xff0c;支持XPath解析方式&#xff0c;而且解析效率非常高 XPath&#xff0c;全称XML Path Language&#xff0c;即XML路径语言&#xff0c;它是一门在XML文档中查找信息的语言&#xff0c;它最初是用来搜寻XML文…...

【数据结构初阶】链表OJ

链表OJ 题目一&#xff1a;移除链表元素题目二&#xff1a;反转链表题目三&#xff1a;链表的中间节点题目四&#xff1a;链表中倒数第k个结点题目五&#xff1a;合并两个有序链表题目六&#xff1a;链表分割题目七&#xff1a;链表的回文结构题目八&#xff1a;相交链表题目九…...

【Vue渲染】 条件渲染 | v-if | v-show | 列表渲染 | v-for

目录 前言 v-if和v-show的区别和联系 v-show和v-if如何选择 条件渲染|v-if|v-show v-if v-if v-else v-if v-else-if v-else template v-show 列表渲染|v-for v-for 前言 本文介绍Vue渲染&#xff0c;包含条件渲染v-if和v-show的区别和联系以及列表渲染v-for v-if和…...

开源网安解决方案荣获四川数实融合创新实践优秀案例

​11月16日&#xff0c;2023天府数字经济峰会在成都圆满举行。本次峰会由四川省发展和改革委员会、中共四川省委网络安全和信息化委员会办公室、四川省经济和信息化厅等部门联合指导&#xff0c;聚焦数字经济与实体经济深度融合、数字赋能经济社会转型发展等话题展开交流研讨。…...

debian/ubuntu/linux如何快速安装vscode

前言 这里写一篇简短的文字用来记录如何在Linux发行版上快速安装VScode&#xff0c;主要使用的一个软件snap&#xff0c;做一个简单介绍&#xff1a; Snap Store 是 Ubuntu、Debian、Fedora 和其他几个 Linux 发行版中的一个应用商店&#xff0c;提供了数千个应用程序和工具的…...

Python3语法总结-数据转换②

Python3语法总结-数据转换② Python3语法总结二.Python数据类型转换隐式类型转换显示类型转换 Python3语法总结 二.Python数据类型转换 有时候我们&#xff0c;需要对数据内置的类型进行转换&#xff0c;数据类型的转换。 Python 数据类型转换可以分为两种&#xff1a; 隐式类…...

【火炬之光-魔灵装备】

文章目录 装备天赋追忆石板技能魂烛刷图策略 装备 头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注盾牌其余的装备要么是召唤物生命&#xff0c;要么是技能等级&#xff0c;鞋子的闪电技能等级加2不是核心&#xff0c;腰带的话主要是要冷却有冷却暗影的技能是不会断的&#xff…...

javascript选择器的封装,只需要写元素名或css类及id都可以选择到元素

//模仿jquery选择器样式&#xff0c;只需要写元素名或css类及id都可以选择到元素 <html><head><meta http-equiv"Content-Type:text/html;charsetutf8"/><link rel"shortcut icon" href"#"/><title>封装选择器&l…...

机器学习第7天:逻辑回归

文章目录 介绍 概率计算 逻辑回归的损失函数 单个实例的成本函数 整个训练集的成本函数 鸢尾花数据集上的逻辑回归 Softmax回归 Softmax回归数学公式 Softmax回归损失函数 调用代码 参数说明 结语 介绍 作用&#xff1a;使用回归算法进行分类任务 思想&#xff1a;…...

努力奋斗,遇上对的人

...

基于单片机音乐弹奏播放DS1302万年历显示及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS1302计时显示年月日时分秒。 3、按键可以弹奏以及播放音乐&#xff0c;内置16首音乐。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /时钟显示**/ void init_1602_ds1302() { write…...

ceph学习笔记

ceph ceph osd lspoolsrbd ls -p testpool#查看 ceph 集群中有多少个 pool,并且每个 pool 容量及利 用情况 rados dfceph -sceph osd tree ceph dfceph versionsceph osd pool lsceph osd crush rule dumpceph auth print-key client.adminceph orch host lsceph crash lsceph…...

SQLSERVER 遍历循环的两种方式很详细有源码(2)

2.游标循环 Create table WS_Student ( [Id] int primary key not null, [My_Cocode] [int], [My_SCocode] [int], [userId] [bigint], [SetCName] [varchar](50) NULL, [SetEName] [varchar](50) NULL, [SetPcode] [varchar](50) NULL, [Se…...

flutter背景图片设置

本地图片设置 1、在配置文件pubspec.yaml中&#xff0c;设置以下代码 assets:- assets/- assets/test/2、如果目录中没有assets文件夹&#xff0c;则创建一个文件夹&#xff0c;并且取名为assets&#xff0c;在此文件夹中存放图片资源即可&#xff0c;如果想分文件夹管理&…...

【运维 监控】Grafana + Prometheus,监控Linux

安装和配置Grafana与Prometheus需要一些步骤&#xff0c;下面是一个简单的指南&#xff1a; 安装 Prometheus&#xff1a; 使用包管理器安装 Prometheus。在 Debian/Ubuntu 上&#xff0c;可以使用以下命令&#xff1a; sudo apt-get update sudo apt-get install prometheus在…...

Sentinel底层原理(下)

1、概述 Sentinel的核心原理&#xff0c;也就是前面提到暗流涌动的SphU.entry(…)这行代码背后的逻辑。 Sentinel会为每个资源创建一个处理链条&#xff0c;就是一个责任链&#xff0c;第一次访问这个资源的时候创建&#xff0c;之后就一直复用&#xff0c;所以这个处理链条每…...

竞赛选题 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…...

macos 配置ndk环境

选择Android Studio下默认的ndk环境 mac电脑的ndk默认路径一般是 /Users/user_name/Library/Android/sdk/ndk/version_code 其中user_name为自己电脑的用户名&#xff0c;version_code为自己ndk安装的版本号&#xff0c;比如我这里电脑的ndk路径就是 /Users/zhangsan/Libra…...

【linux】进行间通信——共享内存+消息队列+信号量

共享内存消息队列信号量 1.共享内存1.1共享内存的原理1.2共享内存的概念1.3接口的认识1.4实操comm.hppservice.cc &#xff08;写&#xff09;clint.cc &#xff08;读&#xff09; 1.5共享内存的总结1.6共享内存的内核结构 2.消息队列2.1原理2.2接口 3.信号量3.1信号量是什么3…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...