资讯详情

Java基础学习Day09--字符串

Java基础学习Day09--字符串

  • 一、简介:
  • 二、String类字符串
  • 三、String存储字符串的原理
  • 四、字符串常用方法
    • 1.equals()方法
    • 2.搜索字符串
    • 3.截取子字符串
    • 4.去除头尾空白字符串
    • 5.替换字符串
    • 6.分割字符串
    • 7.拼接字符串
    • 8.格式化字符串
    • 9.类型转换
    • 10.转换为char[]字符数组
  • 五、StringBuffer与StringBuilder
    • 1.StringBuffer对象
    • 2.StringBuilder对象
    • 3.总结


今天解决了昨天留下的问题 今天,我学习了与字符串相关的内容


一、简介:

字符串(String)有限序列由一对双引号包含的零个或多个字符组成。Java字符串作为对象处理。

可分为两类: (1)String类别:字符串常量创建后不会修改或更改; (2)StringBuffer类别:创建后允许更改和更改字符串变量。 串最基本的两种存储方式是顺序存储和链接存储。

二、String类字符串

字符串变量必须赋值才能使用,称为字符串对象的初始化。

创建和赋值字符串有三种方式

(1)String 字符串变量名; 字符串变量名="字符串常量"; String username=""; username="Tom" (2)String 字符串变量名="字符串常量"; String SayHello="Hello world";  (3)String studentName=new String("周杰杰") 

三、String存储字符串的原理

(1)String表示字符串类型,属于引用数据类型。 (2)在java双引号的随机使用包括在内String对象。 例如:“abc”, “def”, “hello world”,这是3个字符串对象。 (3)java双引号中包含的字符串是不可改变的,final修饰,从出生到销毁都是不可改变的。 (4)在JDK双引号中包含的字符串,如:abc”, "xyz"都是直接存储在“方法区”的“字符串常量池”当中的。 (5)为什么SUN公司在字符串常量池中存储字符串? 由于字符串在实际开发中使用过于频繁,为了提高执行效率,将字符串放入方法区的字符串常量池中。

样例:

public class Test01 { 
             public static void main(String[] args) { 
                 ///以下两行代码在常量池中创建了三个字符串对象         String s1 = "abcdef";  ///在字符串常量池中"abcdef"对象         String s2 = "abcdef"   "xy";  //因为已经有了"abcdef"对象,不需要再创建,而是创建"xy"对象,然后拼接计算,创建"abcdefxy"对象          String s3 = new String("xy");         //使用了这个代码new关键字。代码中的"xy"它是从哪里来的?         //new关键词是实例对象,存在于堆内存中,而"xy"在方法区字符串常量池中         //所以,栈中main()栈帧中局部变量的方法s3保存是一堆内存的地址,堆中对象保存的是常量池"xy"的内存地址
        //凡是双引号括起来的都在常量池当中,凡是new实例化的对象都在堆内存当中

    }
}

在这里插入图片描述

总结: (1)双引号括起来的字符串,如:“abc”, "xyz"都是直接存储在“方法区”的“字符串常量池”当中的。 (2)new关键字实例化的对象都存在堆当中。

四、字符串常用方法

1.equals()方法

常用于比较两个字符串是否相等,返回值类型是boolean,参数是Object类

public class test { 
        
	public static void main(String[] args) { 
        
		String n1 = "saf";
		String n2 = "saf";
		System.out.println(n1.equals(n2)); // true
	}
}

2.字符串的搜索

①indexOf()方法:使用indexOf方法可以从字符串的首部进行搜索,当前字符串中指定子字符串的下标位置,返回值为int类型,如果存在,则返回子字符串的下标位置。如果不存在,则返回-1。 “Hello”.indexOf(“l”); // 2 ②lastIndexOf()方法:lastIndexOf()方法是从字符串的尾部进行搜索,返回值与indexOf()方法一致 “Hello”.lastIndexOf(“l”); // 3 ③startsWith()方法:用于判断字符串是否以指定字符串开头,返回值为boolean类型 “Hello”.startsWith(“He”); // true ④endWith()方法:用于判断字符串是否以指定字符串结尾,返回值为boolean类型 “Hello”.endsWith(“lo”); // true ⑤contains()方法:用于查找当前字符串中是否存在指定子字符串,返回值为boolean类型 “Hello”.contains(“lo”); // true

3.截取子字符串

①substring()方法:使用substring()方法可以从当前字符串中,截取指定下标区间的子字符串,参数是int,返回值是String类型 “大漠孤烟直”.substring(2); // 孤烟直 “大漠孤烟直”.substring(0,2); // 大漠

4.去除首尾空白字符串

①trim()方法:trim()方法可以移除字符串首尾空白字符,空白字符包括空格,\t,\n,\r.无参数,返回值类型是 String。 " \tHello\r\n ".trim(); // 返回 “Hello”

5.替换字符串

①replace()方法:根据字符或字符串替换

String s = "hello";
s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'
s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~"

②replaceAll()方法:通过正则表达式,把匹配的子字符串统一替换

String s = "A,,B;C ,D";
s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D"

6.分割字符串

①split()方法:通过正则表达式传入值,参数值为字符串类型,返回值类型是字符串数组

String s = "A,B,C,D";
String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}

7.拼接字符串

①join()方法:拼接字符串使用静态方法join(),他用指定的字符串连接字符串数组

String[] arr = { 
        "A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"

8.格式化字符串

①format()方法:fomat()静态方法,可以传入其他参数,替换占位符,然后生成新的字符串。参数是字符串和动态参数,返回值是字符串类型

String s = "Hi %s, your score is %d!";
System.out.println(s.format("Alice", 80)); // 字符串对象调用
System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5)); // 字符串类调用

9.类型转换

①valueOf()方法:是静态方法,可以把任意基本类型或引用类型转换为字符串,这是一个重载方法,编译器会根据参数自动选择合适的方法。返回值是String类型

String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@636be97c

②parseInt()方法:把字符串转为int类型,参数是String类型,返回值是int类型

int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255

③parseBoolean()方法:把字符串转为boolean类型,参数是int类型,返回值是boolean类型

boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false

10.转换为char[]字符数组

①String和char[]类型可以互相转化,方法是

char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String

②修改char[]的时候,String里面的值不会变,因为new String() 的时候指向了一个新的内存空间

char[] cs = "Hello".toCharArray();
String s = new String(cs);
System.out.println(s);
cs[0] = 'X';

五、StringBuffer与StringBuilder

由于 String存放字符的数组是被final修饰的,只能被赋值一次,不能修改,因此String字符串在每次连接时都需要构建新的String对象,既费时又浪费空间;在需要多次进行字符串拼接时,使用 StringBuffer 或 StringBuilder 类更为合适一些;

1.StringBuffer对象

代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个,用来保证线程安全。

2.StringBuilder对象

StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

3.总结

效率 :StringBuilder > StringBuffer 安全 :StringBuffer > StringBuilder 在更改次数较少时考虑使用 String; 在单线程大量操作数据时,考虑使用 StringBuilder ; 在多线程大量操作数据时,考虑使用 StringBuffer ;


明天会更好

标签: 02重载连接器he

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台