当前位置: 首页 > 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…...

PlantUML基础使用教程

环境搭建 IDEA插件下载 打开IEDA系列IDE&#xff0c;从FIle–>Settings–>Plugins–>Marketplace 进入到插件下载界面&#xff0c;搜索PlantUML&#xff0c;安装PlantUML Integration和PlantUML Parser两个插件&#xff0c;并重启IDE 安装和配置Graphviz 进入官网…...

Redis:新的3种数据类型Bitmaps、HyperLoglog、Geographic

目录 Bitmaps简介常用命令bitmaps与set比较 HyperLoglog简介命令 Geographic简介命令 Bitmaps 简介 位操作字符串。 现代计算机使用二进制&#xff08;位&#xff09;作为信息的基本单位&#xff0c;1个字节等于8位&#xff0c;例如“abc”字符串是有3个字节组成&#xff0c…...

promise时效架构升级方案的实施及落地 | 京东物流技术团队

一、项目背景 为什么需要架构升级 promise时效包含两个子系统&#xff1a;内核时效计算系统&#xff08;系统核心是时效计算&#xff09;和组件化时效系统&#xff08;系统核心是复杂业务处理以及多种时效业务聚合&#xff0c;承接结算下单黄金流程流量&#xff09;&#xff…...

es的使用方法以及概念

Elasticsearch&#xff08;简称为ES&#xff09;是一个开源的搜索引擎&#xff0c;它构建在Lucene搜索引擎之上。它提供了一个分布式、多租户的全文搜索引擎&#xff0c;具有强大的实时分析能力。以下是关于Elasticsearch的一些基本概念和使用方法&#xff1a; 基本概念&#…...

WPF xaml Command用法介绍

WPF (Windows Presentation Foundation) 中的命令设计模式是一种用于分离用户界面逻辑和业务逻辑的方法。在WPF中&#xff0c;这种模式通过命令接口&#xff08;如 ICommand&#xff09;实现&#xff0c;使得用户界面组件&#xff08;如按钮、菜单项等&#xff09;可以触发不直…...

微信小程序动态生成表单来啦!你再也不需要手写表单了!

dc-vant-form 由于我们在小程序上涉及到数据采集业务&#xff0c;需要经常使用表单&#xff0c;微信小程序的表单使用起来非常麻烦&#xff0c;数据和表单是分离的&#xff0c;每个输入框都需要做数据处理才能实现响应式数据&#xff0c;所以我开发了dc-vant-form&#xff0c;…...

顺序表(数据结构与算法)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…...

【大连民族大学C语言CG题库练习题】——判断一个矩阵是另一个矩阵的子矩阵

【问题描述】 从标准输入中输入一个N&#xff08;N<9&#xff09;阶矩阵和一个M&#xff08;M<N&#xff09;阶矩阵&#xff0c;判断矩阵M是否是N的子矩阵&#xff0c;若是则输出M在N中的起始位置&#xff0c;若不是则输出-1。若矩阵M能与N中某一区域完全相等&#xff0…...

C#WPF控制模板实例

一、控制模板 ControlTemplate(控件模板)不仅是用于来定义控件的外观、样式, 还可通过控件模板的触发器(ControlTemplate.Triggers)修改控件的行为、响应动画等。 控件模板定义控件的视觉外观,所有的 UI 元素都具有某种外观和行为,例如,Button 具有外观和行为。单击事件或…...

MATLAB Simulink和S7-1200PLC MOBUSTCP通信

MATLAB Simulink和SMART PLC OPC通信详细配置请查看下面文章链接: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读749次,点赞26次,收藏2次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的…...

五、函数的介绍

1、为什么需要函数 (1)当程序足够简单时&#xff0c;一个main函数就可以实现所有功能。随着程序功能的增加、复杂化&#xff0c;超出人的大脑的承受范围&#xff0c;这时一个main函数可能就逻辑不清了。这是就需要把一个大程序分成许多小的模块来组织&#xff0c;于是乎出现了…...

【广州华锐互动VRAR】VR元宇宙技术在气象卫星知识科普中的应用

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;和元宇宙等技术正逐渐走进我们的生活。这些技术为我们提供了一个全新的互动平台&#xff0c;使我们能够以更加直观和生动的方式了解和学习各种知识。在气象天文领域&#xff0c;VR元宇宙技术的应用也日益显现…...

F. Alex‘s whims Codeforces Round 909 (Div. 3) 1899F

Problem - F - Codeforces 题目大意&#xff1a;有q次询问&#xff0c;每次询问给出一个数x&#xff0c;要求构造一棵n个点的树&#xff0c;使得对于每次询问&#xff0c;树上都有一条简单路径的长度等于x&#xff0c;同时每次询问前可以对树进行一次操作&#xff0c;即将一个…...

面试题-5

1.用递归的时候有没有遇到什么问题&#xff1f; 如果一个函数内可以调用函数本身,那么这个就是递归函数 函数内部调用自己 特别注意:写递归必须要有退出条件return 2.如何实现一个深拷贝 深拷贝就是完全拷贝一份新的对象,会在堆内存中开辟新的空间,拷贝的对象被修改后&…...

车载以太网-ARP

文章目录 车载以太网ARP协议ARP协议帧格式ARP报文示例ARP报文完整流程ARP流程报文示例ARP协议测试 车载以太网ARP协议 车载以太网ARP协议是指在车载以太网中使用的ARP协议。ARP&#xff08;Address Resolution Protocol&#xff09;是一种用于将IP地址解析为MAC地址的协议。在…...

Kafka学习笔记(三)

目录 第5章 Kafka监控&#xff08;Kafka Eagle&#xff09;5.2 修改kafka启动命令5.2 上传压缩包5.3 解压到本地5.4 进入刚才解压的目录5.5 将kafka-eagle-web-1.3.7-bin.tar.gz解压至/opt/module5.6 修改名称5.7 给启动文件执行权限5.8 修改配置文件5.9 添加环境变量5.10 启动…...

JVM-HotSpot虚拟机对象探秘

目录 一、对象的实例化 &#xff08;一&#xff09;创建对象的方式 &#xff08;二&#xff09;创建对象的步骤 二、对象的内存布局 &#xff08;一&#xff09;对象头 &#xff08;二&#xff09;实例数据 &#xff08;三&#xff09;对齐填充 三、 对象的访问定位 &…...

大模型技术的发展:开源和闭源,究竟谁强谁弱又该何去何从?

一、开源和闭源的优劣势比较 开源和闭源软件都有各自的优劣势&#xff0c;具体比较如下&#xff1a; 安全性&#xff1a;闭源软件的安全性相对较高&#xff0c;因为其源代码不公开&#xff0c;攻击者难以找到漏洞进行攻击。而开源软件由于源代码公开&#xff0c;容易被攻击者发…...

Python学习笔记--自定义元类

四、自定义元类 到现在&#xff0c;我们已经知道元类是什么鬼东西了。 那么&#xff0c;从始至终我们还不知道元类到底有啥用。 只是了解了一下元类。 在了解它有啥用的时候&#xff0c;我们先来了解下怎么自定义元类。 因为只有了解了怎么自定义才能更好的理解它的作用。…...

软件测试 —— 常见的自动化测试架构!

一个自动化测试架构就是一个集成体系&#xff0c;其中定义了一个特殊软件产品的自动化测试规则。这一体系中包含测试功能函数库、测试数据源、测试对象识别标准&#xff0c;以及各种可重用的模块。这些组件作为小的构建模块&#xff0c;被组合起来代表某种商业流程。自动化测试…...

Python 的 @lru_cache() 装饰器

在 Python 标准库的 functools 模块中&#xff0c;有个 lru_cache 装饰器&#xff0c;用于为一个函数添加缓存系统&#xff1a; 存储函数的输入和对应的输出当函数被调用&#xff0c;并且给出了已经缓存过的输入&#xff0c;那么函数不会再运行&#xff0c;而是直接从缓存中获…...

Swift制作打包framework

新建framework项目 设置生成fat包&#xff0c;包括模拟器x86_64和arm64 Buliding Settings -> Architectures -> Build Active Architecture Only 设置为NO 设置打包环境&#xff0c;选择release edit Scheme -> run -> Build configuration 设置为 Release 设置…...

无线WiFi安全渗透与攻防(N.2)WPA渗透-使用airolib-ng创建彩虹表加速

WPA渗透-使用airolib-ng创建彩虹表加速 WPA渗透-使用airolib-ng创建彩虹表加速1.什么是彩虹表?2.渗透wifi1.创建数据库名2.将字典导入数据库3.生成渗透wifi密码的PMK4.生成需要渗透wifi的彩虹表5.渗透wifiWPA渗透-使用airolib-ng创建彩虹表加速 1.什么是彩虹表? 彩虹表是一…...

整形数据和浮点型数据在内存中的存储差别

愿所有美好如期而遇 我们先来看代码&#xff0c;猜猜结果是什么呢&#xff1f; int main() {//以整型数据的方式存储int n 10;float* m (float*)&n;//以整型数据的方式读取printf("%d\n", n);//以浮点型数据的方式2读取printf("%f\n", *m);printf(&…...

【Python基础篇】运算符

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 Python中的运算符二 算术运算符1 Python所有算术运算符的说明2 Python算术运算符的所有操作…...

开启数据库审计 db,extended级别或os级别)并将审计文件存放到/opt/oracle/audit/下

文章目录 1、登录到数据库2、查看审计状态3、创建审计目录4、启用审计5、设置审计文件路径6、再次查看结果 1、登录到数据库 使用SQL*Plus或者其他Oracle数据库客户端登录到数据库。 sqlplus / as sysdba;2、查看审计状态 show parameter audit;目前是DB状态&#xff0c;并且…...

02.webpack中多文件打包

1.module,chunk,bundle的区别 moudle - 各个源码文件&#xff0c;webpack中一切皆是模块chunk - 多模块合并成的&#xff0c;如entry, import(), splitChunkbundle - 最终的输出文件 2.多文件打包配置 2.1 webpack.common.js const path require(path) const HtmlWebpackPl…...

IEEE Standard for SystemVerilog Chapter 22. Compiler directives

22.1 General 此子句描述以下编译器指令&#xff08;按字母顺序列出&#xff09;&#xff1a; __FILE__ [22.13] __LINE__ [22.13] begin_keywords [22.14] celldefine [22.10] default_net…...

机器学习中的独立和同分布 (IID):假设和影响

一、介绍 在机器学习中&#xff0c;独立和同分布 &#xff08;IID&#xff09; 的概念在数据分析、模型训练和评估的各个方面都起着至关重要的作用。IID 假设是确保许多机器学习算法和统计技术的可靠性和有效性的基础。本文探讨了 IID 在机器学习中的重要性、其假设及其对模型开…...

PTP软硬件时间戳

软硬件时间戳 抄袭来源&#xff1a;http://www.bdtime.com.cn/pinlv/4296.html PTP 是一种网络协议&#xff0c;用于在计算机网络中进行时钟校准和时间同步。硬件时间戳和软件时间戳是在实现 PTP 时常见的两种方式&#xff0c;它们在精度、可靠性、实时性以及资源消耗等方面存…...