十三String字符串
Posted 带刺的猬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十三String字符串相关的知识,希望对你有一定的参考价值。
1、概述
String类在 java.lang 包下,所以使用的时候不需要导包
String类代表字符串,Java程序中的所有字符串文字(例如"abc")都被实现为此类的实例。
也就是说,Java程序中所有的双引号字符串,都是String类的对象
字符串不可变,它们的值再创建后不能在更改
2、String常见构造方法
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(String original) | 根据传入的字符串内容,来创建字符串对象 |
String s = "abc"; | 直接赋值的方式创建字符串对象,内容就是abc |
3、字符串对象对比
-
问题:构造方法能创建对象,双引号也能创建字符串对象,有区别么?
-
注意:==号做比较
// 基本数据类型:比较的是具体的值 int a = 10; int b = 20; System.out.println(a == b); //引用数据类型:比较地址值 Student s1 = new Student(23); Student s2 = s1; System.out.println(s1 == s2);
3.1、“”方式的字符串
-
以 "" 方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现多少次,JVM都只会建立一个String对象,并在字符串常量池中维护
-
字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在
- 不存在:创建
- 存在:不会重新创建,而是直接复用
3.2、new方式的字符串
通过new 创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同
3.3、String 在 JVM中
4、String字符串的特点
- Java程序中所有的双引号字符串,都是String类的对象
- 字符串不可变,它们的值在创建后不能被更改
- 虽然不能被更改,但是可以被共享
5、面试题
案例1:
public class Test(){
public static void main(String[] args){
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
String s4 = "ab" + "c";
System.out.println(s1 == s3); //false
/*
当字符串(其中必须有个变量)之间使用 + 号拼接的时候,系统底层会自动创建一个【StringBuilder】对象。
然后在调用其【append方法完成拼接】。
拼接后,在调用其【toString方法转换为String类型】
*/
System.out.println(s1 == s4); //true
/*
两个 “ ” 的字符串,Java存在常量优化机制,在编译的时候,就会将 【"ab" + "c" 拼接为 "abc"】
*/
}
}
案例2:
String s = new String("abc");
方式创建对象,在内存中创建了几个对象?
- 两个:一个是堆空间中new结构;一个是char[]对应的常量池中的数据 "abc"
6、字符串的比较
使用 = 做比较
- 基本类型:比较的是数据值是否相等
- 引用类型:比较的是地址值时候相等
字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()
public boolean equals(Object anObject)
:将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串
7、String的常用方法
方法 | 说明 |
---|---|
int length() |
获取字符串的长度 |
char charAt(int index) |
获取字符串索引的字符 |
boolean isEmpty() |
字符串是否为空 |
String trim() |
忽略字符串的前和后的空白间隔 |
boolean equals(Object obj) |
比较字符串的内容是否相同 |
String concat(String str) |
将指定的字符串连接到此字符串的结尾,等价于“+” |
String substring(int deginIndex,intendIndex) |
从第几个字符开始截取(包含),到第几个字符结束(不包含) |
boolean endsWith(String suffix) |
测试此字符串是否以指定的后缀结束 |
boolean startsWith(String prefix) |
测试此字符串是否以指定的前缀开始 |
boolean startsWith(String prefix,int toffset) |
测试此字符串从指定索引开始的子字符串是否以指定前缀开始 |
boolean contains(CharSequence s) |
判断此字符串是否包含指定的字符串 |
int indexOf(String str) |
返回指定字符串在此字符串中第一次出现的索引位置,没有返回-1 |
int indexOf(String str,int fromIndex) |
从指定的索引位置开始查找, 返回指定字符串在此字符串中第一次出现的索引位置,没有返回-1 |
int lastIndexOf(String str) |
从后往前查找, 返回指定字符串在此字符串中第一次出现的索引位置,没有返回-1 |
int lastIndexOf(String str,int fromIndex) |
从指定的索引位置开始, 从后往前查找,返回指定字符串在此字符串中第一次出现的索引位置,没有返回-1 |
替换 | |
String replace(char oldChar,char newChar) |
返回一个新的字符串,newChar替换字符串中所有的oldChar |
String replace(CharSequener target,CharSequence replacement) |
新的字符串replacement替换旧的字符串target |
String replaceAll(String regex,String replacement) |
使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串 |
String replaceFirst(String regex,String replacement) |
使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串 |
匹配 | |
boolean matches(String regex) |
告知此字符串是否匹配给定的正则表达式 |
切片 | |
String[] split(String regex) |
根据给定正则表达式的匹配拆分字符串 |
String[] split(String regex,int limit) |
根据匹配的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部放到最后一个元素中 |
8、String 与 类型转换
8.1、String 与 基本数据类型、包装类之间的转换
1. 基本数据类型/包装类 ----》String类型 ***
方式一:
int num2 = 10;
String str2 = num2 + "";
方式二:
float f1 = 12.3f;
String str3 = String.valueOf(f1);
Double d1 = new Double(12.4);
String str4 = String.valueOf(d1);
2. String类型 ----》 基本数据类型/包装类 。调用包装类的 parseXxx(String s) ***
String str1 = "123";
Integer.parseInt(str1);
8.2、String 与 char[] 之间的转换
//String -> char[] 调用String的toCharArray方法
String s1 = "abc";
char[] charArray = s1.toCharArray();
//char[] -> String 调用String的构造器
char[] arr = new char[]{\'h\',\'e\',\'l\',\'l\',\'o\'};
String str = new String(arr)
8.3、String 与 byte[] 之间的转换
//String -> byte[] :调用 String 的 getBytes() 【编码】
String s1 = "abc";
byte[] bytes = s1.getBytes();//使用的是默认的字符集,进行转换
System.out.println(Arrays.toString(bytes));//[97,98,99]
byte[] bytes1 = s1.getBytes("gdk");//使用的是gdk字符集编码,中文字节不一样
System.out.println(Arrays.toString(bytes1));//[97,98,99]
//byte[] ->String : 调用String的构造器
String str = new String(bytes);//默认utf-8解码
String str = new String(bytes1);//如果是中文会乱码,因为编码集和解码集不一致
String str = new String(bytes1,"gdk");//正确
以上是关于十三String字符串的主要内容,如果未能解决你的问题,请参考以下文章