目录
一、初识String类
在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种数据和操作方法分离开的方式不适合面向对象的思想,而字符串的应用十分广泛,因此Java语言中有专门的的String类。在开发和校招笔试中都是十分常见的。
二、String类常用方法
(1)字符串构造
1.构造方式
a.使用字符串的常量直接赋值
b.通过字符串常量的构造方法
c.通过字符数组来产生对象
d.通过字符串的静态方法(调用valueOf方法)来产生对象
public class StringProduce {
public static void main(String[] args) {
//1.使用字符串的常量直接赋值
String str="hello";
//2.通过字符串常量的构造方法
String str1=new String("HELLO");
//3.通过字符数组来产生对象
char []arr=new char[]{'h','e','l'};
//4.通过字符串的静态方法(调用valueOf方法)来产生对象
String str2=String.valueOf("hello");
//字符串长度
System.out.println(str.length());
//字符串长度是否为0
System.out.println(str.isEmpty());
}
}
2.String源码保存方式
String是引用数据类型,因此String str只是保存了字符串对象的的地址。
在所有高级语言中,字符串类型,本质都是字符数组,字符串就是由一个个的字符来组成。Java中使用String类型来包装字符数组,提供了非常多的内置方法,让字符串变得更加好用。
观察其源码,发现String类是被final修饰,没有子类,限制了String类被扩展或者修改的可能性。这样,对于String类就不存在多态,保证所有使用jdk的用户,接触到的String类都是相同版本,使用方法也一样。
3.注意小贴士
a.空格也算字符串长度
public class StringProduce {
public static void main(String[] args) {
String str=" ";
System.out.println(str.length());
}
}
b.问题若字符串的引用为null。编译出错,null值“.”操作成员方法,一律是空指针(空指针异常)
public class StringProduce {
public static void main(String[] args) {
String str=null;
System.out.println(str.isEmpty());//空指针异常
}
}
c." "括起来的都是字符串的字面量,都是字符串对象
public class StringProduce {
public static void main(String[] args) {
String str="hello";
System.out.println("hello".equals(str));
}
}
(2)字符串比较
1.四种比较方式
a.通过==比较(比较的是两个字符串的地址,不看内容)
b.通过equals()方法来比较两个字符串对象的内容是否相等(大小写敏感,返回boolean)
c.通过equalsIgnoreCase()比较两个字符串对象的内容是否相等(大小写不敏感,返回boolean)
d.通过compareTo()方法来比较两个字符串对象的大小关系(方式一:首先按照两个字符字典序比较大小,如出现两个大小不一样的字符,返回字符差值;方式二:如果前k个字符相等,k是两个字符串长度最小值,返回长度差)
2.实例演示
public class StringCompare {
public static void main(String[] args) {
String str1=new String("hello");
String str2=new String("hello");
String str3=new String("Hello");
String str4=str1;
String str5="hello123";
//false 通过==比较(比较的是两个字符串的地址,不看内容)
System.out.println(str1==str2);
//true
System.out.println(str1==str4);
//ture 通过equals方法来比较两个字符对象的内容是否相等(大小写敏感)
System.out.println(str1.equals(str2));
//false
System.out.println(str1.equals(str3));
//true 通过equalsIgnoreCase方法来比较两个字符对象的内容是否相等(大小写不敏感)
System.out.println(str1.equalsIgnoreCase(str3));
//32
//首先按照两个字符串字典序比较大小,如出现两个大小不一样的字符,返回字符差值 'h'-'H'=32
System.out.println(str1.compareTo(str3));
//如果前k个字符相等(k是两个字符串长度最小值),返回长度差 5-8=-3
System.out.println(str1.compareTo(str5));
}
}
(3)字符串查找
1.indexOf()和lastIndexOf()
第一二两个查找单个字符;第三四个查找字符串
int indexOf(int ch) | 返回ch第一次出现的位置,没有的返回-1 |
int indexOf(int ch,int fromIndex) | 从fromIndex位置开始找ch第一次出现的位置,没有返回-1 |
int indexOf(String str) | 返回str第一次出现的位置,没有返回-1 |
int indexOf(String str,int fromIndex) | 从fromIndex位置开始找str第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch) | 从后往前找,返回ch第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch,int fromIndex) | 从fromIndexOf位置开始找,从后往前找ch第一次出现的位置,没有返回-1 |
int lastIndexOf(String str) | 从后往前找,返回str第一次出现的位置,没有返回-1 |
int lastIndexOf(String str,int fromIndex) | 从fromIndexOf位置开始找,从后往前找str第一次出现的位置,没有返回-1 |
实例演示
public class StringFind {
public static void main(String[] args) {
String str="hello world";
//indexOf()四种用法
//查找第一个出现'l'的位置
System.out.println(str.indexOf('l'));
System.out.println(str.indexOf("llo"));
//从5索引开始查找第一个出现'l'的位置
System.out.println(str.indexOf('l',5));
System.out.println(str.indexOf("llo",5));//找不到返回-1
}
}
public class StringFind {
public static void main(String[] args) {
String str="hello world";
//lastIndexOf()四种用法
//查找最后一个出现'l'的位置
System.out.println(str.lastIndexOf('l'));
System.out.println(str.lastIndexOf("llo"));
//从5索引开始查找最后一个出现'l'的位置
System.out.println(str.lastIndexOf('l',5));
System.out.println(str.lastIndexOf("llo",5));//找不到返回-1
}
}
2.charAt(int index)
在字符串中查找指定的字符。
实例演示
public class StringFind {
public static void main(String[] args) {
String str="hello world";
//注意越界问题
char c=str.charAt(4);
System.out.println(c);
}
}
3.contains()
判断字符串中是否包含某个字符串,大小写敏感
实例演示
public class StringFind {
public static void main(String[] args) {
String str="hello world";
System.out.println(str.contains("world"));
System.out.println(str.contains("World"));
}
}
(4)字符串转化
1.其他类型转字符串对象
valueOf() 转化成字符串,可以是任何数据类型、对象。
public class StringRevert {
public static void main(String[] args) throws UnsupportedEncodingException {
String s1=String.valueOf(123);
String s2=String.valueOf(12.34);
String s3=String.valueOf(true);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
2.大小写转化
toUpperCase()大写转化; toLowerCase()小写转化
public class StringRevert {
public static void main(String[] args) throws UnsupportedEncodingException {
String str="hello";
String str1=str.toUpperCase();
System.out.println(str1);
String str2=str1.toLowerCase();
System.out.println(str2);
}
}
3.字符串转数组
char[]date=str.toCharArray();字符串转为字符数组
byte[]date1=str.getBytes();字符串转为字节数组
byte[]date2=str.getBytes("GBK");英文字符无差,但中文字符不一样
public class StringRevert {
public static void main(String[] args) throws UnsupportedEncodingException {
String str="你好";
//转为字符数组
char[]date=str.toCharArray();
str.toUpperCase();
System.out.println(Arrays.toString(date));
//转为字节数组,文件传输和网络编程
byte[]date1=str.getBytes();
byte[]date2=str.getBytes("GBK");//英文字符无差,但中文字符不一样
System.out.println(Arrays.toString(date1));
System.out.println(Arrays.toString(date2));
}
}
public class StringRevert {
public static void main(String[] args) throws UnsupportedEncodingException {
String str="hello";
//转为字符数组
char[]date=str.toCharArray();
str.toUpperCase();
System.out.println(Arrays.toString(date));
//转为字节数组,文件传输和网络编程
byte[]date1=str.getBytes();
byte[]date2=str.getBytes("GBK");//英文字符无差,但中文字符不一样
System.out.println(Arrays.toString(date1));
System.out.println(Arrays.toString(date2));
}
}
4.格式化字符串
String.format(**)类似于c中printf,但支持正则表达式。格式化字符串
public class StringRevert {
public static void main(String[] args) throws UnsupportedEncodingException {
String str1=String.format("%d-%d-%d",2020,12,28);
System.out.println(str1);
}
}
(5)字符串替换
1.replaceAll()和replaceFirst()
String replaceAll(String regex,String replacement)替换所有
String replaceFirst(String regex,String replacement)替换首个
实例演示
public class StringReplace {
public static void main(String[] args) {
String str="hello";
System.out.println(str.replaceAll("l","_"));
System.out.println(str.replaceFirst("l","-"));
}
}
(6)字符串拆分
1.split()
String[] split(String regex) ;将字符串全部拆分,拆分后的字符串长度,已指定格式能拆出几个就是几个
String[] split(String regex,int limit) ;将字符串已指定的格式,拆分为limit组
遇到特殊字符(.)等等无法拆分时,需要用到转义字符\\.
public class StringSplit {
public static void main(String[] args) {
String str="192.34.293.98";
System.out.println(Arrays.toString(str.split("\\.")));
System.out.println(Arrays.toString(str.split("\\.",2)));//按指定字符串,拆分成几组
}
}
错误
(7)字符串截取
1.String substring()
String substring(int beginIndex);从指定开始到结尾
String substring(int beginIndex,int endIndex);从指定开始到指定结尾,左闭右开
public class StringSub {
public static void main(String[] args) {
String str="hello world nihao";
System.out.println(str.substring(5,9));//左闭右开
System.out.println(str.substring(5));
}
}
(8)字符串其他用法
1.trim()
trim()把字符串左右两端空格去掉(制表符、换行符),中间保留
public class StringSub {
public static void main(String[] args) {
String str=" hello world ";
System.out.println(str.trim());
}
}