一、String介绍
1.特点:
-
a. java.lang.String 构建字符串对象 “aa” “12” “中文” 字符串常量
String str = "java";//常量池中一个对象
-
b. 字符串是常量;它们的值在创建之后不能更改 private final char value[];
String str = "java";//常量池中一个对象 str = "C++";//此时并不是将"java"改为了"C++",而是让str1 = new String("C++");
-
c. String类提供了很多非常好用的方法 (一会在下面讲解)
-
d. 字符串可以使用+进行连接
String str1 = "hello"; String str2 = "world"; String str3 = str1 + str2;//此时str3的内容为"helloworld"
-
e. 字符串String类型本身是final声明的,意味着我们不能继承String
-
f. 字符串的对象也是不可变对象,意味着一旦进行修改,就会产生新对象
String str1 = "hello"; String str2 = "world"; str1 += str2;//此时相当于str1 = new String(str1+str2);
-
g. String对象内部是用字符数组进行保存的
private final char value[];//String的源码中使用一个char类型的value[]数组来储存的
-
h. 字符串常量存储在常量池
- 常量池在内存的那个区域呢?
- 如果细致的划分:
- (1)JDK1.6及其之前:方法区
- (2)JDK1.7:堆
- (3)JDK1.8:元空间
2. String类对象的创建方式
- a. String str=“java”;
- b. String类的构造器
- new String();//创建一个空串对象 this.value="".value
- new String(“html5”);//创建一个指定字符串内容对象 this.value=“html5”.value
- == 不能判断new的String对象但可以判断使用常量储存的
String str1 = "java"; String str2 = "java"; String str3 = new String("java"); System.out.println(str1 == str2);//true System.out.println(str1 == str3);//false /*解释: 此时str1和str2都是直接指向常量池中(常量池在元空间中)的"java", ==符合对于引用类型比较的是地址,此时str1和str2指向同一个地址,所以结果为true 而str3 new了对象,此时str3指向的是堆中它所对应的字符串数组,字符串数组在指向常量池的"java" 所以这里用==判断str1和str3是不相等的 */
- new String(char[] c);//将char数组中全部字符构架字符串对象
- new String(char[] c,int offset,int count); 将char数组中部分字符构架字符串对象
- offset 起始索引值位置
- count 字符个数
- new String(byte[] b); 将byte数组中的数据构建成字符串对象 (ASCII) 默认采用平台字符集
- new String(byte[] b,int offset,int length); 将byte数组中部分字符构架字符串对象
- offset 起始索引值位置
- length 字节个数
- new String(byte[] b,Charset charset); 指定字符集进行处理
- c. 静态方法
- valueOf(); 将 基本数据类型 变为String
int i=10; String valueOf = String.valueOf(i); System.out.println(valueOf);//10
- valueOf(); 将 基本数据类型 变为String
- d. “”+对象|基本数据类型
int i=10; String str= new String(); str = "java" + 10; System.out.println(str);//java10 int[] a = {1,2,3}; //此时是默认调用a的toString()方法,然后与""相加 str = a + ""; System.out.println(str1);//[I@5d6f64b1
- 如果不了解数组的toString()方法,可以点击该链接跳转查看Object常用方法
3. 字符串对象的个数
- String str1=“java”;//常量池中一个对象
- String str2=new String(“python”);//堆内存中有一个String类的对象,在常量池中有一个"python"对象
4. 字符串拼接内存存储位置
- 常量+常量 结果在常量池
- 变量+变量 结果在堆内存
- 变量+常量 结果在堆内存
- 如果调用intern方法,结果就会在常量池中
二、String类的常用方法
1. String字符串的对比
- a. equals方法 来自于对Object中equals方法的重写
- 对比字符串的内容是否一致
- 例子:str1.equals(str2)
//String.equals()方法源码 //以str1.equals(str2)为例讲解 public boolean equals(Object anObject) { //如果str1和str2地址相等,那么内容一定相等 if (this == anObject) { return true; } //判断str2是否属于String类,这里的equals是有str1调用的,所以str1肯定是String类型,在这里只需判断str2 if (anObject instanceof String) { //str2属于String,但有可能是String的子类,这里我们对str2进行向上转型 String anotherString = (String)anObject; int n = value.length; //判断str1的长度和str2的长度是否相等 if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; //判断str1的具体内容是否和str2完全相等 while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
- b. equalsIgnoreCase() 忽略大小写对比字符串的内容是否一致
- 例子:str1.equalsIgnoreCase(str2)
String str1 = "java"; String str2 = "JAVA"; System.out.println(str1.equalsIgnoreCase(str2)); //true
- c. compareTo() String类实现了Comparable接口
- 比较两个字符串的大小 正数(this大) 0(相等) 负数(参数大)
String str1 = "java"; String str2 = "Java"; System.out.println(str1.compareTo(str2)); //32
- d. compareToIgnoreCase() 忽略大小写比较两个字符串的大小
String str1 = "java"; String str2 = "Java"; System.out.println(str1.compareTo(str2)); //0 String str1 = "java"; String str2 = "Jbva"; System.out.println(str1.compareTo(str2)); //-1
2. String方法
系列1
- (1)boolean isEmpty():字符串是否为空
-
if(str.isEmpty()) System.out.println("通过isEmpty判断-str是空串");
-
- (2)int length():返回字符串的长度
-
String str = "ab"; System.out.println(str.length());//2
-
- (3)String concat(xx):拼接,等价于+
- 结果都在堆内存
-
String str1 = "java"; String str2 = "bigdata"; String str3 = str2.concat(str1); System.out.println(str3);//javabigdata
- (4)boolean equals(Object obj):比较字符串是否相等,区分大小写
-
String str1 = "java"; String str2 = "java"; String str3 = "Java"; System.out.println(str1.equals(str2));//true System.out.println(str1.equals(str3));//false
-
- (5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写
-
String str1 = "java"; String str2 = "java"; String str3 = "Java"; System.out.println(str1.equals(str2));//true System.out.println(str1.equals(str3));//true
-
- (6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
-
String str1 = "java"; String str2 = "java"; String str3 = "Java"; System.out.println(str1.compareTo(str2));//0 System.out.println(str1.compareTo(str3));//32
-
- (7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
-
String str1 = "java"; String str2 = "java"; String str3 = "Java"; System.out.println(str1.compareTo(str2));//0 System.out.println(str1.compareTo(str3));//0
-
- (8)String toLowerCase():将字符串中大写字母转为小写
-
String str1 = "JAva"; System.out.println(str1.toLowerCase());//java
-
- (9)String toUpperCase():将字符串中小写字母转为大写
-
String str1 = "JAva"; System.out.println(str1.toUpperCase());//JAVA
-
- (10)String trim():去掉字符串前后空白符
-
String str1 = " java "; System.out.println(str1.trim());//java
-
- 判断字符串是否为空
if(str.length() == 0) System.out.println("通过length判断-str是空串"); if(str.equals("")) System.out.println("通过equals判断-str是空串"); if(str.isEmpty()) System.out.println("通过isEmpty判断-str是空串");
系列2 查找
- str1.contains(str2) 判断字符串中是否包含另一个字符串,返回值为boolean类型
-
String str1 = "java"; String str2 = "javaweb"; System.out.println(str2.contains(str1));//true
-
- indexOf(String str) 查找str在指定字符串第一次出现的索引位置,找不到返回-1
-
String str1 = "java"; String str2 = "ajavaweb"; System.out.println(str2.indexOf(str1));//1
-
- lastIndexOf(String str)查找str在指定字符串最后一次出现的索引位置,找不到返回-1
-
String str1 = "java"; String str2 = "ajavawebjava"; System.out.println(str2.lastIndexOf(str1));//8
-
系列3 字符串截取
- substring(int startIndex) 从指定下标截取到字符串末尾 (包含指定下标位置的字符)
-
String str = "ajavawebjava"; System.out.println(str.substring(5));//webjava
-
- substring(int startIndex,int endIndex) 从开始索引值截取至结束索引值 (左闭右开)
-
String str = "ajavawebjava"; System.out.println(str.substring(5,8));//web
-
系列4 和字符相关
- char charAt(int index) 获得字符串索引位置的字符
-
String str = "ajavawebjava"; System.out.println(str.charAt(1));//j
-
- toCharArray() 将字符串转为char数组
-
String str = "ajavawebjava"; char[] chars = str.toCharArray(); System.out.println(Arrays.toString(chars));//[a, j, a, v, a, w, e, b, j, a, v, a]
-
系列5 和字节相关
-
String --> byte[]
-
getBytes() 将字符串转为byte数组 默认采用平台的字符集
-
getBytes(String charsetname) 将字符串转为byte数组 设置的字符集
-
String str="你好"; byte[] bytes = str.getBytes("gbk"); for (int i = 0; i < bytes.length; i++) { System.out.print(bytes[i]+ "\t");//-60 -29 -70 -61 }
-
-
byte[] --> String
-
new String(byte[] b,String charset);
-
String str=new String("你好".getBytes()); String str1=new String("你好".getBytes("utf-8"),"utf-8");
- 乱码产生的原因
- a. 编码格式不支持中文
- b. 编码格式和解码格式不一致
-
系列6 开头和结尾
- (1)startsWith(String str) 判断是否以指定字符串开头
- (2) endsWith(String str) 判断是否以指定字符串结尾
系列7 正则匹配 : 用于验证数据的格式是否正确
- (1) matches(String 正则表达式); 验证字符串是否符合整合表达式的要求 (java这一端比较少用正则)
- 常用正则表达式:
- 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
- Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
- 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
- 15位身份证号:^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$
- 18位身份证号:^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
- 只能输入由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
系列8:替换
- replace(char oldChar, char newChar); 用新字符替换字符串中所有的旧字符
-
String str="java"; String replace = str.replace('a', 'b'); System.out.println(str);//jbvb
-
- 支持正则表达式:replaceAll(String regex/String oldString, String newString) 用新字符串替换字符串中所有的旧字符串
-
String str="java,mysql,oracle,java,sqlserver"; String replaceAll = str.replaceAll("^j[a-z]*", "python"); System.out.println(replaceAll); //python,mysql,oracle,java,sqlserver String replaceAll2 = str.replaceAll("java", "python"); System.out.println(replaceAll2); //python,mysql,oracle,python,sqlserver
-
- 支持正则表达式:replaceFirst(String regex/String oldString, String newString);用新字符串替换字符串中第一个的旧字符串
-
String str="java,mysql,oracle,java,sqlserver"; String replaceFirst = str.replaceFirst("java", "linux"); System.out.println(replaceFirst); //linux,mysql,oracle,java,sqlserver
-
系列9:拆分
- split(String str)以str为分割点,拆分字符串
-
String str="mysql_java_oracle_java_sqlserver"; String[] split = str.split("_"); System.out.println(Arrays.toString(split));//[mysql, java, oracle, java, sqlserver]
-