零基础学Java第四节(字符串相关类)

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信 添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。 阅读详情

优快云话题挑战赛第1期
活动详情地址:https://marketing.youkuaiyun.com/p/bb5081d88a77db8d6ef45bb7b6ef3d7f
参赛话题:Java学习记录
话题描述:零基础学习Java字符串相关类
————————————————
版权声明:本文为优快云博主「Code_ForYou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

String

在Java中,我们经常使用字符串,所有的字符串值的类型均为String,它不属于基本类型,它的全名为java.lang.String,我们有必要在这里学习掌握一些它的基本使用方法。

  • 字符串常量:在Java中所有的字符串常量均是以双引号括起来的,比如: "abc"等。因为它的类型是String类型,自然,每个字符串常量均为String的对象,也自然可以调用String中的public(所谓public就是全部开放给程序员使用的方法、属性或者类)方法。比如:"abc".indexof('b'),它的意义就是在"abc"中,'a'第一次出现的位置(从0开始),它的结果就是1。

  • 字符串比较:

    • ==和!=在比较引用类型的数据时是比较引用是不是相同,而不是比较对象中的内容。比如:"abc" == "abc"结果是什么?答案是true,这意味着什么?意味着==左右的这两个常量其实是同一个对象,并不是两个不同的具有相同字符组合的对象。所以,在你的程序中,不管你写多少个"abc",这些"abc"都是同一个字符串。

    • 那么如何比较两个字符串的内容是否一样呢?我们使用String中equals()方法,比如:比较"abc"和"abd"的内容,我们可以这么写:

      "abc".equals("abd") 或者 "abd".equals("abc")
      
  • 字符串变量的初始化:所谓初始化就是获得第一个值。因为String类的构造方法有好几个,所以字符串变量的初始化也会有相应的几个形式,我们这里只了解常用的方式,其他方式,大家自己查看JDK说明书进行了解。

    • 第一种形式:

        String s = "asdf";
      

      我们在学习Java的时候,一定要知道原理,不要只知其一不知其二。这条语句的含义是什么呢?我们知道字符串常量也是对象,所以它的意义就是把"asdf"的引用放入s这个变量中,那么 s == "asdf" 的结果呢?自然也是true。

    • 第二种形式:

        String s = new String("asdf");
      

      大家可以看到这种形式是标准的生成类对象的形式,那么这条语句执行以后,s == "asdf" 的结果呢?此时,就不再是true,而是false,它说明s引用的"asdf"和作为参数传递给String构造方法的"asdf"是两个不同的字符串了。这条语句的含义就是以"asdf"为模板,再创建一个内容为asdf的字符串对象。但是,s.equals("asdf")的值呢?因为这两个字符串的字符序列是一致的,所以,结果为true。

  • 常用方法表

方法首部方法功能可能抛出的异常
public char charAt(int index)返回指定索引处的 char 值。索引范围为从 0 到 length() - 1。序列的第一个 char 值位于索引 0 处,第二个位于索引 1 处,依此类推,这类似于数组索引。index的值如果不在字符串长度范围内,会产生IndexOutOfBoundsException,该异常可以不进行捕获。
public boolean contains(CharSequence s)当且仅当此字符串包含指定的s字符序列时,返回 true。NullPointerException - 如果 s 为 null,该异常可以不进行捕获
public boolean equals(Object anObject)将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。无
public boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。无
public int compareTo(String anotherString)如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。无
public int compareToIgnoreCase(String str)按字典顺序比较两个字符串,不考虑大小写。根据指定 String 大于、等于还是小于此 String(不考虑大小写),分别返回一个负整数、0 或一个正整数。无
public int indexOf(int ch)在此对象表示的字符序列中第一次出现该字符的索引;如果未出现该字符,则返回 -1。无
public int indexOf(int ch,int fromIndex)从指定的索引(含)开始搜索,返回在此字符串中第一次出现指定字符处的索引,否则返回 -1。无
public int indexOf(String str)如果字符串参数作为一个子字符串在此对象中出现,则返回第一个这种子字符串的第一个字符的索引;如果它不作为一个子字符串出现,则返回 -1。无
public int indexOf(String str,int fromIndex)从指定的索引开始,返回指定子字符串在此字符串中第一次出现处的索引,否则返回 -1。无
public boolean isEmpty()如果 length() 为 0,则返回 true;否则返回 false。无
public int lastIndexOf(int ch)在此字符序列中最后一次出现该字符的索引;如果未出现该字符,则返回 -1。无
public int lastIndexOf(int ch,int fromIndex)从指定的索引处开始进行反向搜索,返回指定字符在此字符串中最后一次出现处的索引。如果在该点之前未出现该字符,则返回 -1。无
public int lastIndexOf(String str)如果字符串参数作为一个子字符串在此对象中出现一次或多次,则返回最后一个这种子字符串的第一个字符。如果它不作为一个子字符串出现,则返回 -1。无
public int lastIndexOf(String str,int fromIndex)返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。如果在该点之前未出现该字符串,则返回 -1。无
public int length()返回此字符串的长度。无
public String replace(char oldChar,char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。无
public String replace(CharSequence target,CharSequence replacement)使用指定的replacement替换此字符串所有匹配target的子字符串。该替换从字符串的开头朝末尾执行,例如,用 “b” 替换字符串 “aaa” 中的 “aa” 将生成 “ba” 而不是 “ab”。NullPointerException - 如果 target 或 replacement 为 null。。该异常不必捕获。
public String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处(含)的字符开始,直到此字符串末尾。示例: “unhappy”.substring(2) 返回 “happy”IndexOutOfBoundsException - 如果 beginIndex 为负或大于此 String 对象的长度。该异常不必捕获。
public String substring(int beginIndex,int endIndex)返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。示例: “hamburger”.substring(4, 8) returns “urge”IndexOutOfBoundsException - 如果 beginIndex 为负,或 endIndex 大于此 String 对象的长度,或 beginIndex 大于 endIndex。该异常不必捕获。
public String toLowerCase()使用默认语言环境的规则将此 String 中的所有字符都转换为小写。无
public String toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写。无
public String trim()返回字符串的副本,忽略前导空白和尾部空白。无
public static String valueOf(boolean b)如果参数为 true,则返回一个等于 “true” 的字符串;否则,返回一个等于 “false” 的字符串。无
public static String valueOf(char c)返回 char 参数的字符串表示形式。例如:String.valueOf(‘a’)的值为"a"无
public static String valueOf(char[] data)一个新分配的字符串,它表示包含在字符数组参数中的相同字符序列。无
public static String valueOf(char[] data,int offset,int count)返回由data数组中从offset开始的count个数组元素组成字符串IndexOutOfBoundsException - 如果 offset 为负,count 为负,或者 offset+count 大于 data.length。该异常可以不捕获。
public static String valueOf(double d)返回 double 参数的字符串表示形式。同单参数的 Double.toString 方法返回的结果一致。无
public static String valueOf(float f)返回 float 参数的字符串表示形式。 同单参数的 Float.toString 方法返回的结果一致。无
public static String valueOf(int i)返回 int 参数的字符串表示形式。 同单参数的 Integer.toString 方法返回的结果一致。无
public static String valueOf(long l)返回 long 参数的字符串表示形式。 同单参数的 Long.toString 方法返回的结果一致。无
public static String valueOf(Object obj)如果参数为 null,则字符串等于 “null”;否则,返回 obj.toString() 的值。无
  • 补充解释
    • 从上面的方法列表,我们看到有些方法名字相同,但是参数不同的情况,这种情况为方法的重载(overload),比如valueOf方法。所谓重载,是在同一个类中,同名但参数表不同的方法的多次定义,这些重载的方法在被调用时,Java会根据实参的不同而决定调用不同的重载方法。Java是根据什么区分不同的参数的呢?是根据对应位置参数的类型来区分的。
    • 有些方法的前面带有static这个修饰词,那么这种方法,我们称之为静态方法,这种方法是通过类名直接调用,而不必通过对象来调用。例如上表中valueOf这个方法,调用的时候,形如:String.valueOf(123) 。
    • 前表中,我们看到所有的方法前面都有个public,类对外提供服务的方法,都是通过public这个修饰词进行标识的。我们在定义类的方法时,不是所有的方法都是public的,有些方法只供类(或包内、或子类可用)内部使用,这就好比大家在超市结账的时候,只需要把货物和钱款交给收银员就行了,至于收银员在随后如何盘存,都是超市内部的机制,我们无需关注一样。
    • 有些方法,如:charAt可能会抛出异常,但是这些异常在程序中又不必捕获,也不必声明,这是什么情况?我们可以看看这些异常都继承自哪个类:java.lang.RuntimeException 。我们这里说:凡继承自这个类的异常子类在你的程序中可以不进行捕获,也不进行声明,但是一旦发生这种类型的异常,你的程序会被毫不犹豫的中断,由系统对该异常进行处理,而系统处理的很简单,只是打印出出错栈信息,然后中断掉你的程序。所以,如果从你的程序的健壮性考虑,我们最好还是进行捕获并进行处理。

StringBuffer和StringBuilder

String对象一旦创建,它的内容是不能改变的,大家可能说String的replace方法不是在替换子字符串吗?我们要明确,replace得到的是一个新的字符串,对原字符串没有任何影响。有时候,我们需要在原有字符串的基础上操作,这个时候就需要使用StringBuffer或者StringBuilder了。

StringBuffer用于多线程环境,StringBuilder用于单线程环境。这两个类中提供public方法是一致的。在这两个类上的主要操作是 append 和 insert 方法,这两个方法以各种类型重载,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。其他还有一些方法,大家可以参考JDk说明书。

我们在生成这两种类的对象时,如果不带参数,比如:StringBuffer sb = new StringBuffer(),它会构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。 但是如果使用的是带参数构造方法,比如:StringBuffer sb = new StringBuffer("abc");它会构造一个字符串缓冲区,并将其内容初始化为 abc 。该字符串的初始容量为 16 加上字符串参数的长度,既是19。也可以在创建对象的时候,通过传递一个数值来设置字符串缓冲区的大小,比如:StringBuffer sb = new StringBuffer(20);,这里20就是字符串缓冲区的大小。

数组概念

一个数组就是一组数据的序列,该序列中每个元素的类型相同,可以是基本类型,也可以是引用类型。如果是基本类型,每个数组元素所在的内存空间中存放的是基本类型的数值;如果是引用类型,每个数组元素所在的内存空间中存放的是引用。如图:

  • 数组的定义形式(两种):

    • int[] a1; 这种形式表明a1这个变量是数组变量,它的数组元素类型为int类型
    • int a1[]; 这种形式表明a1[]数组元素的类型为int类型,a1是数组变量

    不管哪种形式,我们在定义的时候都不能像C语言一样指定数组的大小,我们通过下面的这个例子,来进一步说明它们之间的区别:

    int[] a, b, c; 这里我们可以知道a、b、c这三个变量均为数组变量
    int a[], b, c; 这里我们知道只有a是数组变量,而b、c均为一般变量,而非数组变量
    
  • 数组变量的意义:数组变量是引用类型的变量,这意味着,数组变量中存放的是数组的引用,而非数组本身,数组的存储空间是在初始化的时候在堆(所谓堆,大家可以理解做一个大仓库)中分配的,这一点同C语言有很大区别,这也成为Java数组的一个优势,数组的大小可以在运行的时候确定,而不必在定义的时候就确定下来。

  • 数组的初始化:数组的初始化像其他类型的变量一样,既可以在定义的同时初始化,也可以在定义以后,在第一次使用的使用初始化。初始化的形式用两种:

    • int a[] = new int[10]; 这种形式,在堆中分配一段能够放下10个int类型数据的存储空间,并将其引用放在a这个数组变量中;
    • int a [] = { 1, 2, 3, 4, 5 }; 这种形式其实是把数组{ 1, 2, 3, 4, 5 }的引用放入了a中,而且这种形式只能在定义数组的同时进行。
      • 如果数组元素为引用类型,有两种使用大括号的对数组初始化的形式:
      public class ArrayInit {
      	public static void main(String[] args) {
      		Integer[] a = {
      				new Integer(1),
      				new Integer(2),
      				new Integer(3),
      		};
      		Integer[] b = new Integer[] {
      				new Integer(1),
      				new Integer(2),
      				new Integer(3),
      		};
      	}
      }
      
  • 数组元素的引用:数组元素的引用也是通过下标进行的,下标可以是一个int类型的表达式,但是值的范围必须在0至数组大小-1这个范围内。数组元素的类型既是定义数组时所指定的类型。

多维数组

二维以上的数组就看作多维数组,数组在Java中的实现是采用链式存储实现的,如图:

多维数组的定义和初始化原则同一维是一样的,如下:

  • 第一种形式,
    int[][] a1 = {
    	{ 1, 2, 3},
    	{ 4, 5, 6},
    	{ 7, 8, 9}
    };  //每个向量用大括号括起来。
    
  • 使用new定义a2的大小:
    int[][][] a2 = new int[2][2][4];
    

由于在Java中采用链式存储数组,数组中向量的大小不必相同,比如:

int[][] a1 = {
		{ 1, 2},
		{ 3, 4, 5, 6},
		{ 7, 8, 9}
	};

甚至还可以如下例:

int b[][]; //定义一个二维数组
b = new int[ 2 ][ ]; // b引用一个具有两个子数组的数组 
b[ 0 ] = new int[ 5 ]; // b[0]引用一个具有5个元素的数组 
b[ 1 ] = new int[ 3 ]; // b[1]引用一个具有3个元素的数组 

数组作为方法的参数

方法的参数可以是数组,在使用数组参数时需要注意以下事项:

  • 在形参表中,数组名后的方括号不能省略,方括号个数和数组的维数相等
  • 实参表中,数组名后不需括号
  • 参数是数组时,形参和实参传递的是引用

示例:

class A{
	void f(int va[]){
		for(int i = 0; i < va.length; i++)//va.length为va这个数组的大小
			va[i]++;
	}

	public static void main(String args[]){

		int[] aa = new int[10];
		A ta = new A();

		for(int i = 0; i < aa.length; i++) 
			aa[i] = i;

		System.out.println("执行f()之前");
		for(int i = 0; i < aa.length; i++) 
			System.out.print(aa[i] + " ");

		//把aa作为实参传递给f方法
		ta.f(aa); //f这个方法的调用必须使用对象,因为它是一个非静态方法
 
		System.out.println("\n执行f()之后");
		for(int i = 0; i < aa.length; i++) 
			System.out.print(aa[i] + " ");
	}
}

数组的复制

把一个数组中的内容复制到另一个数组不能使用赋值语句a = b,这种形式使得a引用和b相同的数组。如果需要复制数组,我们可以使用System类中的 arraycopy方法,它的方法首部如下:

public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)

从指定源数组src中复制一个数组,从指定位置srcPos开始,srcPos 到 srcPos+length-1 之间的length个数组元素,到目标数组dest的指定位置destPos开始,destPos 到 destPos+length-1 位置。

如果参数 src 和 dest 引用相同的数组对象,则复制的执行过程就好像首先将 srcPos 到 srcPos+length-1 位置的元素复制到一个有 length 个元素的临时数组,然后再将此临时数组的内容复制到目标数组的 destPos 到 destPos+length-1 位置一样。

以下三种情况会抛出异常:

  • 如果 src或者dest 为 null,则抛出 NullPointerException 异常。

  • 只要下列任何情况为真,则抛出 ArrayStoreException 异常并且不会修改目标数组:

    • src 参数不是数组对象。
    • dest 参数不是数组对象。
    • src 和 dest 引用的数组元素的类型是不一致的基本类型。
    • src 和 dest参数引用的数组的元素为一个为基本类型,另一个为引用类型
  • 如果源数组中 srcPos 到 srcPos+length-1 位置上的实际元素通过分配转换并不能全部转换成目标数组的元素类型,则抛出 ArrayStoreException 异常。在这种情况下,假设复制过程已经进行到k个(k < length)这么多,此时抛出异常,从 srcPos 到 srcPos+k-1 位置上的源数组元素已经被复制到目标数组中的 destPos 到 destPos+k-1 位置,而目标数组中的其他位置不会被修改。

  • 只要下列任何情况为真,则抛出 IndexOutOfBoundsException 异常,并且不会修改目标数组:

    • srcPos、destPos、length 参数为负。
    • srcPos+length 大于 src.length,即源数组的长度。
    • destPos+length 大于 dest.length,即目标数组的长度

String与字符数组

在Java中字符数组不能当作字符串来看待,但是我们可以使用字符数组作为模板来创建字符串,如下:

char data[] = {'a', 'b', 'c'}; //这里data不能当作字符串
String str = new String(data); //str引用的既是字符串 "abc"

对数组的操作

对数组遍历

所谓遍历(Traversal),是指按照某种方式,依次对某种数据结构中的每个元素做一次且仅做一次的访问。对数组进行遍历通常可以使用循环语句,这里我们再介绍一个专门针对遍历的foreach语句,它的语法格式如下:

//这里type为被遍历结构中元素的类型名,x为结构中的元素,collection为被遍历的结构对象
for(type x : collection){ 
	...//循环体
}

如下例:

int[] a = new int[10];
//这里为一般的for循环
for(int i = 0; i < a.length; i++) a[i] = i;
//这里为foreach语句
for(int x : a){//foreach语句中无法使用下标
	System.out.print(x + " ");
}

对数组的排序

对数组的排序,我们当然可以自己写出各种标准的排序算法,这里介绍一个工具类java.util.Arrays(注意是复数)。此类包含用来操作数组(比如排序和搜索)的各种方法。除非特别注明,否则如果该类中的方法的数组参数引用值为 null,则会抛出 NullPointerException。

升序排序

该类中有一系列对数组进行排序的方法,方法名为sort,它的一系列重载实现,可以针对各种数组元素类型的数组进行升序排序。典型的,我们看下面的方法首部:

public static void sort(int[] a)

该方法对传入的 int 型数组a按数字升序进行排序。该排序算法是一个经过调优的快速排序算法。

我们也可以只对数组中的某一部分进行排序,方法首部如下:

public static void sort(int[] a,
                        int fromIndex,
                        int toIndex)

该方法对传入的 int 型数组a中从fromIndex到toIndex-1的元素按数字升序进行排序。同样,它也是一个经过调优的快速排序算法。
该方法可能会抛出下面的异常:

  • IllegalArgumentException - 如果 fromIndex > toIndex
  • ArrayIndexOutOfBoundsException - 如果 fromIndex < 0 或 toIndex > a.length

上面的两个方法,经过重载,第一个参数可以是其他各种类型,包括基本类型和引用类型。

大家可能注意到了,上述的sort只能进行升序的排序,如果是其他复杂的排序方式,则就不适用了。

带有 Comparator的排序

JDK为我们提供了强大的排序支持,因为涉及到一些我们尚未接触的知识,这里我先只做了解。

public static <T> void sort(T[] a, Comparator<? super T> c)
与
public static <T> void sort(T[] a,
                            int fromIndex,
                            int toIndex,
                            Comparator<? super T> c)

这两个的区别在于第一个对整个数组进行排序,第二个可以选择排序范围。

数组元素的查找

对数组中元素进行查找,我们最简单但是效率可能最低下的方法就是对数组进行遍历。同样工具类java.util.Arrays也为我们提供了可以直接使用的查找方法binarySearch,该方法也有一系列的重载。使用该方法的前提,该数组必须是通过sort进行过排序的。它的方法首部如下:

public static int binarySearch(int[] a, int key)
或者
public static int binarySearch(int[] a,
                               int fromIndex,
                               int toIndex,
                               int key)

这两个的区别在于第一个对整个数组进行排序,第二个可以选择排序范围。经过重载,第一个参数可以是其他各种类型,包括基本类型和引用类型。

方法中a为被查找数组,key是需要在此数组中查找的键值,fromIndex为起始位置,toIndex-1为终止位置。

如果key值包含在数组中,则返回它的索引值;否则返回 (-(插入点) - 1)。插入点 被定义为将键插入数组的那一点:即第一个大于此键的元素索引,如果数组中的所有元素都小于指定的键,则为 a.length或者toIndex,这保证了当且仅当此键被找到时,返回的值将 >= 0,否则为负值。

同样,该方法也有二个带有Comparator的方法重载,这里不再赘述。

关于工具类java.util.Arrays中的其他方法,大家可以查看JDK说明书。

问题

用筛法求1000以内的素数,并按每行10个输出出来。

TI LP87745-Q1汽车雷达PMIC评估:从硬件设计到性能测试全解析 在汽车电子和高级驾驶辅助系统(ADAS)中,电源管理单元(PMIC)是确保传感器稳定可靠运行的核心。其工作原理在于集成多路高效电源转换器(如Buck、Boost)和精密监控电路,通过数字接口实现灵活配置与实时诊断。这项技术的核心价值在于为毫米波雷达等关键负载提供低噪声、高精度、满足严格时序与功能安全(ASIL)要求的供电方案,从而提升整个感知系统的信噪比与可靠性。其典型应用场景包括自动驾驶域控制器、车载传感器融合模块等。本文以德州仪器(TI)的LP87745-Q1专用PMIC及其评估模块(EVM)为例,深入 阅读详情

相关推荐

从零配置华为S5720交换机VLAN:Web界面与命令行双模式详解(附拓扑图)

本文详细解析华为S5720交换机VLAN配置的全过程,涵盖Web界面与命令行(CLI)双模式操作指南。从基础环境准备到多交换机环境配置同步,特别针对S5720-52X系列交换机的VLANif接口、端口分配策略及交换机堆叠技术进行深入讲解,并附实用拓扑图与配置示例,助力企业网络管理员高效完成VLAN部署。

happy2的博客 1374

零基础学 Java ——字符串相关类

本篇文章是《零基础学 Java》专栏的来写,文章采用通俗易懂的文字、图示及代码实战,从零基础开始带大家走上高薪之路! String 在 Java 中,我们经常使用字符串,所有的字符串值的类型均为String,它不属于基本类型,它的全名为java.lang.String,我们有必要在这里学习掌握一些它的基本使用方法。 字符串常量:在 Java 中所有的字符串常量均是以双引号括起来的,比如:"abc"等。因为它的类型是String类型,自然,每个字符串常量均为String的对象,也自然可以调用S.

ayouki123456的博客 183

MATLAB信号处理实战:VMD分解参数调优全指南(附避坑技巧)

本文深入探讨了MATLAB中变分模态分解(VMD)的核心参数调优实战技巧。针对模态数K和惩罚系数α的选择难题,提供了从经验估计、可视化观察到量化指标辅助的渐进式调优框架,并分享了避免过分解与欠分解的实用避坑指南,旨在帮助工程师高效处理非平稳信号,提取清晰的物理特征。

weixin_29079671的博客 146

【JAVA】字符串相关类的底层原理

在所有的编程语言中,字符串是应用最广泛的一种数据类型,它是由一系列字符(如字母、数字、符号)组成的一种数据类型。在Java中,字符串一旦创建就不能修改,每次操作都会产生一个新的字符串。那么这些特性背后的内存原理是怎样的?这就是我今天要分享的主题:字符串在java内存中的底层原理。

2302_79323248的博客 1758

头歌工程实训答案-机器学习篇之手写体识别篇

第2关:激活函数'''x:负无穷到正无穷的实数'''if x<=0:return 0else:return x#***第3关:反向传播算法import os。

m0_71537260的博客 2520

model_optimizer将pi05端到端延时进一步优化到68.13ms了

目前在保持灵活性和性能之间找到一个较好的平衡。vit, llm仍然使用onnx->trt_engine的路径,量化可以通过https://github.com/NVIDIA/Model-Optimizer.git支持。同时支持通过cutedsl手写算子进行进一步优化denoise因为步数多,kernel launch多,因此完全通过手写融合算子实现,将所有steps进行一次大的cuda graph capture.

happyAnger6的专栏 61

Java字符串相关的类详解

目录一.String类1.初识String2.String的特性3.String对象的创建(以Java 8为例)4.String对象的存储解析5. 一.String类 1.初识String String:字符串,使用一对""引起来表示。 1.String声明为final的,不可被继承 2.String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小 3.String内部定义了final

MrYushiwen的博客 1047

RK3568驱动 SPI主/从 配置

RK3568 SPI 配置指南 内核配置:启用用户空间驱动(主)和从模式协议支持。 主模式:设备树设置status="okay"、max-freq及引脚复用,子节点compatible="rockchip,spidev"。 从模式:需添加spi-slave属性,子节点命名以slave@X开头。 编译烧写:修改设备树后编译内核或全量镜像,验证/dev/spidevX.Y节点。 测试:使用spidev_test工具,主模式可环回测试,从模式需与主设备通信。 (关键:从模式强制spi-slave和命名规则,频率匹

文石_2009的博客 1149

【LeetCode算法成长之路】Java字符串相关类总结与经典题目分析

本文小新为大家带来 Java字符串相关类总结与经典题目分析 相关知识,具体内容包括不可变字符序列String介绍(包括:String 的特性,构造器,String 与其他结构间的转换,基本常用方法,查找方法,字符串截取方法,开头与结尾判断方法,替换方法),可变字符序列StringBuffer与StringBuilder(包括:StringBuffer 与 StringBuilder 的理解,StringBuilder,StringBuffer 的 API)及相关经典题目进行详尽介绍~

小新要变强的博客 3168

【ComfyUI】Animate 保留原视频背景角色替换视频生成

本文介绍了智能创作与视频生成的工作流设计,强调其作为围绕业务目标、数据流转和模型能力的有机整体。工作流由数据输入、模型处理、结果合成和输出展示构成,通过节点化连接实现高效复用与扩展。文章重点解析了核心模型(如CLIP Vision、WanVideo等)的功能和协作方式,以及各类节点(输入、处理、控制、输出)的作用。最后展示了工作流在视频角色替换、虚拟试衣等场景的应用价值,并提供了相关开发资源链接。该设计通过模块化实现了灵活适配不同业务需求的能力。

Mr数据杨 1871

基于simulink的软开关技术的三相逆变器仿真

三相逆变器中的软开关技术(Soft Switching Techniques)旨在减少开关损耗,提高效率,并降低电磁干扰(EMI)。实现软开关通常涉及使用谐振电路或准谐振电路来确保开关器件在零电压(Zero Voltage Switching, ZVS)或零电流(Zero Current Switching, ZCS)条件下进行切换。下面将详细介绍如何在Simulink中进行基于软开关技术的三相逆变器仿真设计。

xiaoheshang_123的博客 168

【Java】字符串相关类的底层原理

默认创建一个长度为16的字节数组添加的内容长度小于16,直接存添加的内容大于16会扩容(扩容机制为:原来容量 * 2 + 2)如果扩容之后还不够,以实际长度为准添加的内容长度小于16,直接存// 容量:最多装多少// 长度:已经装了多少// 16// 0// 16// 3添加的内容大于16会扩容(扩容机制为:原来容量 * 2 + 2)// 容量:最多装多少// 长度:已经装了多少// 16// 0// 26 个英文字母// 34// 26。

qq_39921135的博客 1876

YOLOv11低光照检测性能优化:基于Retinexformer主干网络的深度改进实践

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!@[TOC]在自动驾驶、安防监控、遥感探测等关键领域,目标检测系统必须保证24小时全天候的可靠工作。然而,现有最先进的目标检测模型,包括YOLOv11,其训练数据大多源于光照良好的场景。当环境光照条件急剧下降时,图像会出现严重的噪声、低对比度、颜色失真和细节丢失,直接导致模型性能断崖式下跌。常规的解决方案如图像直方图均衡化或简单的伽马校正,往往收效甚微,甚至可能放大噪声,进一步干扰检测。

m0_71589036的博客 190

【Java】第二讲:字符串String相关类

a.在Java中所有字符串的定义都在中,在使用String定义字符串时应先导包。//导包//定义b.字符串参与的所有运算都属于字符串的拼接操作。由于字符串的内容自创建之后就不能改变,所以每次执行字符串的拼接操作时都会在内存中重新申请空间储存拼接后的字符串。//执行结果:abc123在执行上面的代码时一共产生了三个字符串,分别是s1("abc")、s2("123")以及拼接后新产生的字符串"abc123"。s1="三连+关注";//执行结果:三连+关注c.

zwznzje的博客 5127

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java字符串相关的类

Java字符串相关的类字符串相关的类String的特性String常用方法1String常用方法2String常用方法3String与字符数组转换 字符串相关的类 String的特性 String类:代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。 String是一个final类,代表不可变的字符序列 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改 String对象的字符内容是存储在一个字符数组value[]中的。 String实现了Seria

asdfghsadg的博客 308

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA 字符串 12 字符串相关类的底层原理

如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果会复用串池中的字符串。如果有变量参与每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。如果很多字符串变量拼接,不要直接+。在底层会创建多个对象,浪费时间,浪费性能。所有要拼接的内容都会往 StringBuilder 中放,不会创建很多无用的空间,节约内存默认创建一个长度为16的字节数组添加的内容长度小于16,直接存添加的内容大于16会扩容(原来的容量*2+2)如果扩容之后还不够,以后都会以实际长度为准。

qq_56808981的博客 839

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java 字符串相关类总结

之前整理了 Java 集合类相关内容。结果今天刷题的时候,又碰到了 String 类的内容。的确,String、StringBuffer 和 StringBuilder 也是相当常见、常用的内容。因此,本文对 Java String 相关类进行了整理。参考内容在文末给出。 BlueStragglers 共享技术成长的快乐 目录1. 字符串相关类2. String 类3. StringBuffer 类4. StringBuilder 类参考内容 1. 字符串相关类 Java 中,字符串相关类主要包括: St

qq_38522564的博客 247

Java 字符串相关类

String类 String是一个final类,代表不可变的字符序列。 String对象的字符内容是存储在一个字符数组value[]中的。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is u...

zhaoliang831214的专栏 403

【Java基础】字符串相关的类

字符串相关API:String类、 StringBuffer类 、StringBuilder类

DUMG 289

字符串相关的类

字符串相关类的基础知识 String的特性: 字符串的创建方式: 常量池: 对象中的字符串是怎么储存的 String使用陷阱: String常用方法: String相关算法题与面试题: StringBuffer与StringBuilder: 面试题:对比String、StringBuffer、StringBuilder:

qq_45865991的博客 1174

零坤础学Java—— String字符串

使用+运算符进行字符串拼接时,会创建新的字符串对象,因此可能会影响性能。需要注意的是,equals()方法用于比较两个字符串的内容是否相同,而compareTo()方法则用于按字典顺序比较两个字符串。• replace(char oldChar, char newChar):返回一个新的字符串,它是通过 用newChar替换此字符串中出现的所有oldChar得到的。• substring(int beginIndex):返回一个新的字符串,该字符串是此字符串的一个子字符串。

hx66688的博客 1467

小白学JAVA之十六——可变字符串类和日期相关类

小白学JAVA之十六——可变字符串类和日期相关类 一. 可变字符串类 1.1 基本概念 由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间的浪费。 为了解决上述问题,可以使用java.lang.StringBuilder类和java.lang.StringBuffer类来描述字符序列可以改变的字符串,如:“ab”。 StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。 StringBui

weixin_43722962的博客 176

Java基础之Java常用类--Object类,字符串相关类,包装类,日期相关类,数字相关类...

  Java是一种面向对象的语言,也就是将万事万物可以描述为对象,特点如下: 1.面向对象是常见的一种思考习惯,符合人们的思考习惯。2.面向对象的出现,将复杂的事情简单化。3.面向对象的出现,将之前过程中的执行者变成指挥者。(以前我在做动作。现在是命令冰箱做动作)。   包(package)是Java提供的一种区别类的名字空间的机制,是类的组织方式,是一组相关类和接口的集合,它提供了...

banshanhuo7689的博客 206

java实用类 字符串相关的类:String类

1、字符串相关的类:String 文章目录1、字符串相关的类:String1.1、String的特性1.2、 通过字面量的方式(区别于new)给一个字符串赋值1.3、String的实例化方式**1、什么是实例化?****2、String的实例化方式:****3、字符串对象是如何存储的?**1.5、String类的常用方法:1、求字符串长度 length()**2、字符串比较****3、忽略大小写的字符串比较的语法格式如下:****4、改变字符串中字符的大小写。****5、字符串的连接****6、字符串的提

施莱的博客 499

【Java】String类的理解及字符串常量池

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。Java的String类在lang包里,java.lang.String是java字符串类,包含了字符串的值和实现字符串相关操作的一些方法;java.lang包里面的类都不需要手动导入,是由程序自动导入。String表示字符串类型,属于引用数据类型, 内部并不存储字符串本身;Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。.........

trong_ 的烂笔头 2629

JAVA零基础学习3(Scanner类,字符串,StringBuilder,StringJoinder,ArrayList成员方法)

JAVA零基础学习3(Scanner类,字符串,StringBuilder,StringJoinder,ArrayList成员方法)

qq_51752841的博客 1423
上一篇: 零基础学Java第三节(基本输入输出)
下一篇: 零基础学Java第一节(语法格式、数据类型)
Code_ForYou
博客等级 码龄5年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值