String类型
目录:
文章目录
1.常用方法
在java中,字符串是一种引用类型,String类中有着很多方法方便我们使用,其功能适用于各种场景,下面我们就介绍一下这些常用方法。
1.1构造方法
大家可以进入官方的帮助手册搜一下String类,我们可以看到String类在java.lang包里是默认导入的,以及它是被final所修饰的。
字符串构造方法有很多种,常用的构造方法有三种
-
String s1 = "hello";//简写
-
String s1 = new String("hello");
-
char[] ch = new char[]{'a','b','c'}; String s1 = new String(ch);
第一种方法用的最多,最简单。
下面我们来分析这几种构造方法的内存分布
1.2字符串的查找(indexOf)
方法 | 用法 |
---|---|
string.charAt(index) | 用来通过下标直接拿到字符串中的某个字符 |
string.indexOf(char ch) | 用来查找字符串中第一次出现字符ch的位置 |
string.lastindexOf(char ch) | 从后往前查找字符ch第一次出现的位置 |
string.indexOf(string ch)lastindexof也可以 | 用来查找字符串ch第一次出现的位置 |
string.indexOf(char ch ,int fromindex)last也可以 | 前面不变,fromindex表示从此位置开始找 |
public static void main5(String[] args) {
String s1 = "ababacabcdaseasq";
String s2 ="www.baidu.com";
System.out.println(s2.lastIndexOf('.',4));
System.out.println(s2.lastIndexOf('.'));
System.out.println(s1.lastIndexOf('ab'));
}
public static void main4(String[] args) {
String s1 = "hello";
for (int i = 0; i < s1.length(); i++) {
System.out.println(s1.charAt(i));
}
System.out.println("====================");
System.out.println(s1.indexOf('h'));//查找第一次出现的字符
System.out.println(s1.indexOf('l',3));
System.out.println("====================");
String s2 = "abaabcabcdabsaea";
System.out.println(s2.indexOf("abcd"));
}
1.3字符串的比较(equals,compareTo)
一般我们进行比较是否相等时都用==来表示,对于基本类型来说 == 比较的是内容是否相同,但是对于引用类型 == 比较的就是是否引用的同一个对象,这就无法达到我们的要比较内容的要求。
对于引用类型我们使用equals进行比较,equals方法的返回值是boolean,java中还提供了忽略大小写的equalsIgnoreCase方法。
String s1 = "hello";
String s2 = "hello";
String s3 = "HELLO";
System.out.println(s1.equals(s2));//true
System.out.println(s1.equalsIgnoreCase(s3));//true
equals只能比较两个字符串是否相同,比较大小我们就需要使用compareTo方法了因为String实现了CompareTo接口,compareTo的返回值类型是int,同样java中也提供了忽略大小写的比较compareToIgnoreCase方法。
String s1 = "hello";
String s2 = "hello";
String s3 = "HELLO";
System.out.println(s1.compareTo(s2));//0
System.out.println(s1.compareToIgnoreCase(s3));//0
1.4转换
- 大小写转换
方法 | 功能 |
---|---|
toUpperCase() | 将字符串所有的小写改为大写(字母) |
toLowerCase() | 将字符串所有的大写改为小写(字母) |
String s1 = "hello";
String s2 = "HELLO";
System.out.println(s1.toUpperCase());//HELLO
System.out.println(s2.toLowerCase());//hello
System.out.println(s1);//hello
System.out.println(s2);//HELLO
中文不管
- 字符串转数组(toCharArray)
String s1 = "hello";
char[] ch = s1.toCharArray();
for (char x : ch) {
System.out.println(x);
}
- 数值转换字符串(valueOf)
方法 | 功能 |
---|---|
string.valueOf(基本类型 i) | 将基本类型i转换为string类型 |
基本类型.valueOf(String s) | 将string类型转换为基本类型 |
基本类型.parse***(String s)(一般用这种转换) | 将string类型转换为基本类型 |
基本类型.valueOf(String s radix x) radix表示x进制(parse***也有) | 将String类型的值按x进制转换为十进制 |
String s1 = String.valueOf(123);
String s2 = String.valueOf(12.5);
System.out.println(s1);
System.out.println(s2);
String s3 = String.valueOf(new Student(12));//也可以是一个对象
System.out.println(s3);
int a = Integer.valueOf("0101",2);//5
System.out.println(a);
int b = Integer.parseInt("1000");//1000
System.out.println(b);
1.5字符串的替换(replace)
方法 | 功能 |
---|---|
String replaceAll(String regex, String replacement) | 替换所有的指定内容 |
String replaceFirst(String regex, String replacement) | 替换首个内容 |
String s1 = "ababcabcdeaaweqggh";
System.out.println(s1);
System.out.println(s1.replace('a', 'k'));//kbkbckbcdekkweqggh
System.out.println(s1.replace("ab", "wt"));//wtwtcwtcdeaaweqggh
System.out.println(s1.replaceAll("ab","zc"));//zczcczccdeaaweqggh
System.out.println(s1.replaceFirst("ab","1122"));//1122abcabcdeaaweqggh
1.6字符串拆分(split)
将字符串按指定的分隔符划分为几个字符串
方法 | 功能 |
---|---|
String[] split(String regex) | 将字符串全部拆分 |
String[] split(String regex, int limit) | 将字符串以指定的格式,拆分为limit组 |
String s1 = "ni hao ma zui jin";
String[] s2 = s1.split(" ",3);
for (String x : s2) {
System.out.println(x);
//ni
//hao
//ma zui jin
}
对于指定的特殊分隔符要进行转义如:,.
String s1 = "255\\255\\255\\255";
//特殊的字符要进行转义
String[] s2 = s1.split("\\\\");//因为字符串那里也需要转义,所以有两次转义
for (String x : s2) {
System.out.println(x);
}
String s1 = "255.255.255.255";
//特殊的字符要进行转义
String[] s2 = s1.split("\\.");
for (String x : s2) {
System.out.println(x);
}
还可以给定多个分隔符进行多次拆分
String s1 = "zaiganma nihao&=nibuhao";
String[] s2 = s1.split(" |&");
for(Stiring x : s2){
System.out.println(x);
}
//多次拆分
s2 = s1.split(" ");
for (String x : s2) {
String[] s3 = x.split("=");
for (String x1 : s3) {
System.out.println(x1);
}
}
1.7字符串截取(substring)
这个没什么好说的简单
String s1 = "liuyuhao";
System.out.println(s1.substring(3));
System.out.println(s1.substring(2, 5));//[2,5)左闭右开
1.8其他操作
trim()删除字符串左右两边的空格,制表,换行等
String s1 = " liu yu ";
System.out.println(s1);
System.out.println(s1.trim());
intern()手动入池,内容下面常量池中讲
char[] ch = {'a','b','c'};
String s1 = new String(ch);
s1.intern();//手动入池
String s2 = "abc";
System.out.println(s1 == s2);
String类的方法,如果返回基本上都是新的String对象。因为String里的内容创建后就不可以修改了,String是一种不可改变的对象,所以尽量避免对字符串的直接修改
String s1 = "hello";
s1 += " word";
System.out.println(s1);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("hello");
stringBuilder.append(" word");
因为它的底层其实是借助了StringBuilder类,中间会创建很多临时变量,所以对于字符串修改我们直接使用StringBuilder和StringBuffer。String的内容不能被改变的原因是String类里的字段value被final修饰,表明value不能引用其它字符数组,但是可以修改引用数组的内容。
1.9String常量池
字符串常量池又名StringTable其实是一种高效的查询数据结构。
inter()手动入池
2.StringBuilder和StringBuffer
注意String,StringBuffer,StringBuilder三者的区别
- String的内容是不可以被修改的,StringBuffer和StringBuilder的内容是可以被修改的
- StringBuffer和StringBuilder两者的方法都大致相同
- StringBuffer采用同步处理,多线程时很安全,StringBuilder未采用通不处理,多线程时不安全。
这里重点提几个String没有的方法,StringBuffer的方法也一样
StringBuilder stringBuilder = new StringBuilder();
String s1 = "hello";
stringBuilder.append(s1);//将字符串转为StringBuilder
stringBuilder.insert(0,"lyh ");//在0下标位置开始插入,lyh
stringBuilder.insert(1,1);//在1下标位置插入,1
stringBuilder.deleteCharAt(1);//删除1下标位置的1
stringBuilder.setCharAt(0,'z');//将0下标位置的字符改为z
stringBuilder.codePointAt(1);//返回1下标字符的ASCII码值
stringBuilder.reverse();//字符串逆转
String str = stringBuilder.toString();//StringBuilder转String
stringBuilder.append("how are you");//String转StringBuilder
int num = stringBuilder.capacity();
System.out.println(num);//获取底层保存字符串空间的总大小
System.out.println(stringBuilder);
补充:
- 字符串的格式输出
String s1 = String.format("%d-%d-%d",2002,06,24);
System.out.println(s1);
- 求字符串长度和数组不一样,字符串求长度调用的是一个方法,数组调用的是一个字段
String s1 = "hello";
System.out.println(s1.length());
int[] array = {1,2,3,4};
System.out.println(array.length);
- 关于字符串匹配的三种算法,BF,BM,KMP,这里简单给大家介绍一下,BF算法就是简单的暴力匹配两层循环搞定,BM算法就引用了一个好数对和坏数对的思想对子串进行处理,KMP算法引用了一个next数组对子串进行处理还有next数组的优化,nextval数组,具体相关内容大家可以去学习一下。
本节学习结果
- 了解了String类
- 熟练掌握了String类中的各种方法
- 理解了String常量池
- 认识了StringBuilder和StringBuffer也掌握了他们的各种方法
- 掌握String,StringBuffer和StringBuilder的区别