String的深度剖析

String创建对象

1.如果常量池中无字符串"hello",将放入常量池;

String str1 = "hello";

在这里插入图片描述

2.通过new产生一个新的String对象,如果常量池中有字符串"hello",则引用"hello"

String str2 = new String("hello");

在这里插入图片描述3.通过new创建String对象时一定生成了新的对象,并且String源码中构造方法的形参列表value[] 会将"hello"的引用传给new String;

String、字节、字符之间的转换

1.String——字符

char[] chars = {'h','e','l','l','o'};
//将字符数组中的所有内容变为字符串
String str = new String(chars);
//从0号下标开始,选取三个数;结果为"hel"
String str2 = new String(chars, 0, 3);
//获取字符串指定索引位置的字符,索引从0开始
char ch = str.charAt(1);
//将字符串变为数组返回
char[] chars2 = str.toCharArray();

2.String——字节

byte[] bytes = {97,98,99,100};
//将字节数组转为字符串
String str1 = new String(bytes);
//将部分字节数组中的内容转变为字符串,从0号下标开始,选取三个数;结果为abc
String str2 = new String(bytes, 0,3);
//将字符串以字节数组形式返回
byte[] bytes2 = str1.getBytes();

3.何时用byte[]何时用char[]
byte[]是一个字节一个字节的处理,适合针对二进制数据操作,如 .class文件;char[]是一个字符一个字符的处理,针对文本数据,如中文文件;

字符串常见操作

字符串的比较

String str1 = "hello";
String str2 = new String("Hello");
String str3 = new String(str1);
//区分大小写的内容比较
System.out.println(str1.equals(str2));//false
//不区分大小写的内容比较
System.out.println(str1.equalsIgnoreCase(str2));//true
//比较两个字符串大小的关系
System.out.println(str1.compareTo(str2));//32   'h' - 'H' = 32;

intern()

String str1 = "hello";
String str2 = new String("hello").intern();
System.out.println(str1 == str2);//true

intern()的作用是,如果常量池中有该字符串,则直接将此引用返回出去进行赋值;

字符串查找

String str1 = "hello word";
//判断一个子字符串是否存在
System.out.println(str1.contains("llo"));//true
//从头开始查找指定字符的位置,查到返回索引,否则返回-1;
System.out.println(str1.indexOf("w"));//6
//从指定位置开始查找子字符串位置(首字符的位置)
System.out.println(str1.indexOf("heo", 0));//-1
//由后向前查找字符串的位置
System.out.println(str1.lastIndexOf("llo"));//2
//从指定x位置由后向前找(从倒数x个字符开始)
System.out.println(str1.lastIndexOf("llo", 3));//2
//判断是否以指定字符串开头
System.out.println(str1.startsWith("he"));//true
//从指定位置开始判断是否以指定字符串开头
System.out.println(str1.startsWith("llo",2));//true
//判断是否以指定字符串结尾
System.out.println(str1.endsWith("ord"));//true

字符串替换

String str1 = "hello word";
//***替换所有的指定内容,并非改变str1对象,而是返回一个新字符串***
System.out.println(str1.replace("o", "x"));//hellx wxrd
System.out.println(str1);//hello word
//替换首个内容
System.out.println(str1.replaceFirst("o", "x"));//hellx word

字符串拆分

String str1 = "hello word";
//将字符串全部拆分
String[] strings = str1.split("o");
System.out.println(Arrays.toString(strings));//[hell,  w, rd]
//将字符串部分拆分,该数组长度就是limit极限
String[] strings1 = str1.split("o", 3);
for (String s : strings1){
    System.out.println(s);//hell   w   rd
}
String str2 = "1994.5.27";
//若拆分为开头为空,原因在split的源码
String[] strings2 = str2.split("\\.", 3);//需用转义字符,
System.out.println(Arrays.toString(strings2));//

字符串截取

String str1 = "hello word";
//从指定索引截取到结尾
System.out.println(str1.substring(2));//llo word
//截取部分内容
System.out.println(str1.substring(2, 4));//ll 右边为开区间

其他操作方法

String str1 = " Hello Word 哈";
String str2 = new String(" Hello Word 哈");
//去掉字符串左右空格,保留中间空格
System.out.println(str1.trim());//Hello Word 哈
//字符串转大写
System.out.println(str1.toUpperCase());// HELLO WORD 哈
//字符串转小写
System.out.println(str1.toLowerCase());// hello word 哈
//字符串入池操作
System.out.println(str2.intern() == str1);//true
//字符串连接,等同于+不入池
System.out.println(str1.concat("喽"));// Hello Word 哈喽
//取得字符串长度
System.out.println(str1.length());//13
//判断是否为空字符串(空表示长度为0)
System.out.println(str1.isEmpty());//false

StringBuffer 和 StringBuilder

用法

StringBuffer 和 StringBuilder大部分功能相似

StringBuilder sb = new StringBuilder("hello");
sb.append(" word");
System.out.println(sb);//hello word
//对比String
String str = new String("hello");
str.concat(" word");
System.out.println(str);//hello

区别

1.String 的内容不可修改,StringBuffer 和 StringBuilder可以修改
2.StringBuffer 和 StringBuilder的大部分功能相似
3.StringBuffer采用同步处理,为线程安全操作;StringBuilder采用异步处理,属于线程不安全操作

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
String 类是 Java 中最常用的类之一,用于表示字符串对象。下面是对 String 类的源码剖析: 1. String 类的定义: ```java public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // ... } ``` String 类是 final 类,无法被继承,实现了 Serializable 接口,以支持对象的序列化操作。它还实现了 Comparable 接口,用于字符串的比较,以及 CharSequence 接口,提供了对字符序列的一般读取方法。 2. 字段: ```java private final char value[]; private final int offset; private final int count; private int hash; ``` - value: 用于存储字符串的字符数组。 - offset: 字符数组中有效字符的起始位置。 - count: 字符数组中有效字符的数量。 - hash: 字符串的哈希值,用于加速字符串比较操作。 3. 构造函数: String 类提供了多个构造函数,用于创建字符串对象。其中包括使用字符数组、字节数组、字符串、StringBuffer 等作为参数的构造函数。 4. 方法: - length(): 返回字符串的长度。 - charAt(int index): 返回指定索引位置的字符。 - substring(int beginIndex): 返回从指定索引开始到字符串末尾的子字符串。 - indexOf(int ch): 返回指定字符在字符串中第一次出现的位置。 - equals(Object anObject): 比较字符串与指定对象是否相等。 - compareTo(String anotherString): 按字典顺序比较两个字符串。 - concat(String str): 将指定字符串连接到此字符串的末尾。 - toUpperCase(): 将字符串转换为大写。 - toLowerCase(): 将字符串转换为小写。 - trim(): 返回一个去除了首尾空格的字符串。 这些只是 String 类的一部分方法,还有很多其他方法可以使用。String 类还提供了不少静态方法,如 valueOf、format 等,用于字符串的转换和格式化操作。通过这些方法,我们可以方便地操作和处理字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值