string类详解

String类

  1. String位于java.lang包中,Java程序默认导入java.lang包下的所有类。
  2. "+"把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。
    在这里插入图片描述
  3. 当"+"运算符两侧的操作数中只要有一个是字符串类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
    在这里插入图片描述
  4. String对象被称为“不可变对象” ,String 类对象代表不可变的Unicode字符序列,对象内部的成员变量的值无法再改变;字符串的内容全部存储在value[]数组中,而value是用final修饰的,也就是常量只能被赋值一次,一旦赋值则不能被改变
    在这里插入图片描述
String类中常用的方法
方法名作用
length:字符串字符数
equals:字符串是否相同
valueOf:其他类型转字符串
substring:截取字符串
toLowerCase:字符串转小写
toUpperCase:字符串转大写
replace:字符串替换
replaceAll:带正则字符串替换
replaceFirst:替换第一个出现的目标字符串
contains:是否包含目标字符串
startsWith:是否以目标字符串开头
endsWith:是否以目标字符串结束
isEmpty:字符串长度是否为0
charAt:获取指定下标位置的字符
getBytes:获取字符串的字节数组
getChars:获取字符串的指定长度字符数组
toCharArray:获取字符串的字符数组
String对象之间比较

在进行字符串比较时,最好是使用equals方法;使用==是用来判断两个对象是否是相同的

	public static void main(String[] args) {
		String string1 = "hello" + " world"; //相当于hello world;
		String string2 = "hello world";
		//编译器做了优化,直接在编译的时候将字符串进行了拼接,所以string1与string2相同
		System.out.println(string1 == string2);
		String string3 = "hello";
		String string4 =  "world";
		String string5 = string3 + string4;
		//编译的时候不知道变量中存储的是什么,没办法在编译时直接进行优化
		System.out.println(string1 == string5);
		System.out.println(string2 == string5);
		System.out.println(string1.equals(string5));
	}

StringBulider和StringBuffer

StringBuffer和StringBuilder非常类似,均代表可变的字符序列。 这两个类都是抽象类AbstractStringBuilder的子类,在AbstractStringBuilde中字符串的内容全部存储在value[]数组中,而value并没有用final修饰的,也就是常量是可以被修改的,所以为可变字符序列。
在这里插入图片描述
StringBuilder线程不安全,效率高
StringBuffer线程安全,效率低

	//StringBuulder为可变字符序列,可指定改变某个字符,改变后哈希编码地址不变
  public static void main(String[] args) {
        StringBuilder sBuilder = new StringBuilder("hollo");
        System.out.println(Integer.toHexString(sBuilder.hashCode()));
        System.out.println(sBuilder);
        sBuilder.setCharAt(1, 'e');
        System.out.println(Integer.toHexString(sBuilder.hashCode()));
        System.out.println(sBuilder);
    }

StringBuilder的常用方法

方法作用
重载的public StringBuilder append(…)方法可以为该StringBuilder 对象添加字符序列,仍然返回自身对象。
public StringBuilder delete(int start,int end)可以删除从start开始到end-1为止的一段字符序列,仍然返回自身对象。
public StringBuilder deleteCharAt(int index)移除此序列指定位置上的 char,仍然返回自身对象。
重载的public StringBuilder insert(…)方法可以为该StringBuilder 对象在指定位置插入字符序列,仍然返回自身对象。
public StringBuilder reverse()用于将字符序列逆序,仍然返回自身对象。
public String toString()返回此序列中数据的字符串表示形式。
 public static void main(String[] args) {
        StringBuilder sBuilder = new StringBuilder();
        //循环输出26个字母
        for (int i = 0; i < 26; i++) {
			sBuilder.append((char)('a' + i)); //为sBuilder添加字符系列,然后返回自身对象
		}
        System.out.println(sBuilder);
        sBuilder.delete(0, 5); //删除从a到e为止的一段字符序列,然后返回自身对象
        System.out.println(sBuilder);
        sBuilder.deleteCharAt(6); //移除此序列中第六个位置的字符,然后返回自身对象
        System.out.println(sBuilder);
        sBuilder.insert(6, 'l'); //在第六个位置插入l字符,仍然返回自身对象
        System.out.println(sBuilder);
        sBuilder.insert(3, '2').insert(8, '5');//链式调用insert方法,该方法调用了return this,返回自身对象
        System.out.println(sBuilder);
        sBuilder.reverse();//将字符序列逆序,仍然返回自身对象
        System.out.println(sBuilder);
        sBuilder.toString();//返回此序列中数据的字符串表示形式。
        System.out.println(sBuilder);
    }

在这里插入图片描述

可变字符序列和不可变字符序列

String对象称为不可变对象,经过初始化后就不可再改变,对String字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。 如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。

public static void main(String[] args) {
		String string = "9"; 
		for (int i = 0; i < 10; i++) {
			string = string + i;//使用string进行字符串的拼接时,系统对产生20个新的对象
		}
		System.out.println(string);
	}

StringBuilder和StringBuffer代表可变字符序列,是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。

	public static void main(String[] args) {
		StringBuilder sBuilder = new StringBuilder("9"); 
		for (int i = 0; i < 10; i++) {
			sBuilder.append(i); //使用StringBuilder直接再字符串后面拼接,返回自身对象,不占多余的内存
		}
		System.out.println(sBuilder);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值