我们都知道 创建一个字符串最简单的方式是
String meaasge ="java资讯";
当然还可以用构造来创建 (不推荐,开发中不要用)
String str2=new String("java资讯");
这两种创建最主要的区别在于,一个在公共池中,一个在堆内存中,不用想new 出来的都在内存中,代码的高效能节省很多成本,尽量不要让堆内存有压力,后面我们会知道,JVM 的优化都是在 堆内存中。。
要想了解String ,我们先来学习它的API,看看官方给我们提供了什么样的方法来操作String
这里列举一些工作中最常见的:
1. 拼接字符串
拼接字符串,这里有两种方法,concat 和 +
先来看concat 方法
String msg1 ="java";
String msg2 ="资讯";
String resultMsg = msg1.concat(msg2);
System.out.println(resultMsg);
输出结果:
再来看 + 号 ,这里+ 是拼接的意思
String msg1 ="java";
String msg2 ="资讯";
String resultMsg = msg1+msg2;
System.out.println(resultMsg);
输出结果:
2. 获取字符串长度
String message = "java资讯";
int length = message.length();
System.out.println(length);
输出结果:
3. 字符串查询
在字符串中,每个字符的位置是从 0 开始
现在有一个字符串
String message = "java资讯"
- 查询第一个字母a出现的位置
String message = "java资讯";
int index = message.indexOf("a");
System.out.println(index);
输出结果:1
- 查询最后一个字母a出现的位置
String message = "java资讯";
int a = message.lastIndexOf('a');
System.out.println(a);
输出结果:3
4.字符串包含
- 判断字符串中是否包含a
String message = "java资讯";
boolean a = message.contains("a");
System.out.println(a);
输出结果:true
- 判断字符串中是否包含 b
String message = "java资讯";
boolean b = message.contains("b");
System.out.println(b);
输出结果:false
4.字符串比较(面试常问,开发常用)
- compareTo
compateTo 比较的是unicode值的大小,在java中,每一个字符都对应着他的unicode
前者大于后者 返回正数
前者等于后者 返回 0
前者小于后者 返回负数
例如:
String msg1 = "a";
String msg2 = "b";
String msg3 = "A";
String msg4 = "a";
int i = msg1.compareTo(msg2);
System.out.println(i);
int i1 = msg1.compareTo(msg3);
System.out.println(i1);
int i2 = msg1.compareTo(msg4);
System.out.println(i2);
输出结果(顺序从上至下):
扩展:
compareToIgnoreCase 这个是不区分大小写的比较,比较结果返回原则跟
compareTo 一样
String msg1 = "a";
String msg2 = "A";
int i = msg1.compareToIgnoreCase(msg2);
System.out.println(i);
输出结果:
- equals
equals 比较的是字符串内容是否相同 ,相同返回ture ,不同false
String msg1 = "java资讯";
String msg2 = "java";
String msg3 = "java资讯";
boolean flag1 = msg1.equals(msg2);
System.out.println(flag1);
boolean flag2 = msg1.equals(msg3);
System.out.println(flag2);
输出结果:
==
== 比较的是内存地址,相同返回true,不同false
String msg1 = "java资讯";
String msg2 = "java资讯";
String msg3 =new String ("java资讯");
String msg4 = new String("java资讯");
boolean flag1 = msg1 == msg2;
boolean flag2 = msg1 == msg3;
boolean flag3 = msg3 == msg4;
System.out.println(flag1);
System.out.println(flag2);
System.out.println(flag3);
输出结果:
解析:
代码从上至下执行,会先在公共区创建 "java资讯” 并且 将msg1指向这个对象
接着执行第二行代码,会在公共区找有没有“java资讯” 这个对象,有就直接拿来用 ,所以msg1跟 msg2 内存地址相同,返回true
msg3 new String (“java资讯”); 是在堆内存中重新开辟一块新的空间,因此msg1跟msg3不是同一个内存地址,返回false
msg4 new String (“java资讯”); 这在堆内存中又开辟了一个新的空间,所以两个内存地址不同,返回 false
从这里也可以看出,为什么不建议 用 new String (“java资讯”); String 的构造函数来创建字符串对象了,耗内存,效率低
- 字符串匹配 matches
matches 用来正则匹配,java进阶 会进行正则相关介绍,先记着有这么个方法 (可略过这个方法,用的比较少,几乎不用)
String str = "123456789";
boolean matches = str.matches("[0-9]*");
System.out.println(matches);
输出结果:true
- 字符串截取
substring(int beginIndex) :从指定位置(包括指定位置)开始到字符串末尾
String msg1 = "java资讯";
String substring = msg1.substring(4);
System.out.println(substring);
输出结果:
substring(int beginIndex, int endIndex):从指定位置(包括),截取到指定位置(不包括)
String msg1 = "java资讯";
String substring = msg1.substring(0,4);
System.out.println(substring);
输出结果:
最后我们来一个经典案例:
正式开发中我们都会有一个需求,截取文件字符串,获取文件名等等
String msg1 = “http://www.javazixun.com:8080/upload/2020-04-15-截取字符串文件.docx”;
//获取最后一个 / 出现的位置
int index = msg1.lastIndexOf(“/”);
//获取文件名带后缀
String substring1 = msg1.substring(index+1);
System.out.println(substring1);
//获取文件名不带后缀
//获取最后一个. 出现位置
int index1 = msg1.lastIndexOf(".");
String substring = msg1.substring(index + 1, index1);
System.out.println(substring);
【写在最后】
以上就是本期String字符串的常用api了