String类
java.lang.String
JDK 1.0
public final class String extends Object implements Serializable,Comparable<String>,CharSequenec
概述:
- 字符串是由多个字符组成的一串数据(字符序列)。
- 字符串可以看成是字符数组。
通过查看API,我们可以知道:
- String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例(对象)实现。
- 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区(另一个类)支持可变的字符串。
- String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。
- Java 语言提供对字符串串联符号(”+”)以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。
常用的构造方法:
- public String() :空构造
- public String(byte[] bytes):把字节数组转成字符串
- public String(byte[] bytes,int index,int length) :把从某索引开始的一定长度的字节数组转成字符串
- public String(char[] value):把字符数组转成字符串
- public String(char[] value,int index,int count):把字符数组的一部分转成字符串
- public String(String original):把字符串常量值转成字符串
字符串方法:
public int length():返回此字符串的长度
//public String(byte[] bytes):把字节数组转成字符串
byte[] bys={97,98,99,100,101};
String s2=new String(bys);
system.out.println("s2"+s2);//abcde
system.out.println("s2.length():"+s2.length());//5
//public String(byte[] bytes,int index,int length) :把从某索引开始的一定长度的字节数组转成字符串
String s3 = new String(bys,1,3);
system.out.println("s3"+s3);//bcd
system.out.println("s3.length():"+s3.length());//3
//public String(char[] value):把字符数组转成字符串
char[] chs = {'a','b','c','你','好'};
String s4 = new String(chs);
system.out.println("s4"+s4);//abc你好
system.out.println("s4.length():"+s4.length());//5
//public String(String original):把字符串常量值转成字符串
String s5 = new String("abcde");
system.out.println("s5"+s5);//abcde
system.out.println("s5.length():"+s5.length());//5
//Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例(对象)实现。
String s6="abcde";
system.out.println("s6"+s6);//abcde
system.out.println("s6.length():"+s6.length());//5
String的特点:一旦被赋值就不能改变。
String s = "hello";
s += "world";
System.out.println("s:"+s);//helloworld
面试题:String s = new String("hello"); 与 String s = "hello";
的区别:
方法区的常量池中有“hello”时,前者创建在堆内存中创建一个对象,后者不用创建对象。否者,前者需要分别在堆内存和方法区中创建一个对象,而后者需要在方法区中创建一个对象。
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3==s1+s2);//false
//s3==(new StringBuilder(String.valueOf(s1))).append(s2).toString();
System.out.println(s3.equals((s1+s2)));//true
//s3.equals((new StringBuilder(String.valueOf(s1))).append(s2).toString());
System.out.println(s3=="hello"+"world");//true 易错
//s3=="helloworld"
System.out.println(s3.equals("hello"+"world"));//true
//s3.equals("helloworld")
- 字符串如果是变量相加,先开空间,再拼接
- 字符串如果是常量相加,先加,然后再常量池中找,如果有就直接返回,否者,就创建。
String 类的功能
判断功能
- public boolean equals(Object obj);比较字符串的内容是否相同(区分大小写,如用户名)
- public boolean equalsIgnoreCase(String str);比较字符串的内容是否相同,忽略大小写(验证码)
- public boolean contains(String str);判断大字符串中是否包含小字符串
- public boolean startsWith(String str);判断字符串是否是以某个指定的字符串开头
- public boolean endsWith(String str);判断字符串是否是以某个指定的字符串结尾
- public boolean isEmpty();判断字符串是否为空
- 注意:
- 字符串内容为空和字符串为空
- String s = “”;
- String s = null;
// public boolean isEmpty();判断字符串是否为空
String s1 = "hello";
String s2 = "";
String s3 = null;
System.out.println(s1.isEmpty());//false
System.out.println(s2.isEmpty());//true
System.out.println(s3.isEmpty());//字符串为空时,NullPointerException,空指针异常。
获取功能:
- public int length();获取字符串的长度
- public chart charAt(int index);返回指定索引位置的字符
- public int indexOf(int ch);返回指定字符在此字符串中第一次出现处的索引
- 为什么此处是int类型,而不是char类型
- 原因:’a’ 和97其实都可以代表a.
- public int indexOf(String str);返回指定字符串(首字母)在此字符串中第一次出现处的索引。
- public int indexOf(int ch,int fromIndex);返回指定字符在此字符串中从指定位置后第一次出现处的索引
- public int indexOf(String str,int fromIndex);返回指定字符串在此字符串中从指定位置后第一次出现处的索引
- public String substring(int start);从指定位置开始截取字符串(包含sart 索引值对应的字符串)
- public String substring(int start,int end);从指定位置开始到指定位置结束截取字符串(包括起始索引对应的字符串,不包括结束位置)
遍历获取字符串中的每一个字符
//char charAt(int index);
//int length()
String s = "helloworld";
for(int x=0;x<s.length();x++){
System.out.print(s.charAt(x));
}
判断字符串中的大小写和数字
ASCII 码表 0—48 A—65 a—97
做大于等于加减乘除等操作的时候,char类型首先会转成int类型。
//已经遍历后,统计大小写和数字的个数
char ch = s.charAt(x);
if(ch>='0' && ch<='9'); numberCount++
if(ch>='a' && ch<'z'); smallCount++
if(ch>='A' && ch<='Z');bigCount++
转换功能:
- public byte[] getBytes();把字符串转换为字节数组
- public char[] toCharArray();把字符串转换为字符数组
- public static String valueOf(char[] chs);把字符数组转成字符串
- 注意:String类的valueOf方法可以把任意类型的数据转成字符串
- public static String valueOf(int i);把int类型的数据转成字符串
- public String toLowerCase();把字符串转成小写
- public String toUpperCase();把字符串转成大写
- public String concat(String str);把字符串拼接
String s = "JavaSE";
// public byte[] getBytes();把字符串转换为字节数组
btye[] bys = s.getBytes();
for(int x=0;x<bys.length;x++){
System.out.println(bys[x]);//74,97,118,97,83,69
}
//public char[] toCharArray();把字符串转换为字符数组
char[] chs = s.toCharArray();
for(int x=0;x<chs.length;x++){
System.out.println(chs[x]);//J a v a S E
}
其他功能
替换功能
- public String replace(char old,char new)
- public String replace(String old,String new)
去除字符串两空格
public String trim()
按字典顺序比较两个字符串
- public int compareTo(String str);
- public int compareToIgnoreCase(String str);
依次比,如果每个字符都相同,就返回0,一旦有不同,就用前者字符的ASCII码值减去后面的。如果字符串长度不同(“hello”与“hel”)就返回字符串长度差。
compareTo()源码:
//字符串会自动转换成字符数组。
private final char value[];
public int compareTo(STring anotherString){
int len1= value.length;//this.value.length---s1.toCharArray().length
int len2=anotherString.value.length;//s2.value.length--s2.toCharArray().length
int lim=Math.min(len1,len2);
char v1[]=value;
char v2[]=anotherString.value;
int k = 0;
while(k<lim){
char c1=v1[k];
char c2=v2[k];
if(c1 != c2){
return c1-c2;
}
k++;
}
return len1-len2;
}
案例
把int数组拼接字符串
int[] arr={1,2,3};
String s = "";
s += "[";
for(int x = 0;x<arr.length;x++){
if(x==arr.length-1){
s + arr[x];
s +="]";
}else{
s +=arr[x];
s +=", ";
}
}
System.out.println(s);
字符串反转
String line = "abcde";
String result = "";
//把字符串转成字符数组
char[] chs=line.toCharArray();
//倒着遍历数组
for(int x=chs.length-1;x>=0;x--){
result += chs[x];
}
System.out.println(result);
统计大串中小串出现的次数
思路:
- 定义一个统计变量,初始值为0
- 先获取一次小字符串在这个大串中第一次出现的索引
- 如果索引值是-1 ,说明不存在,返回统计变量
- 如果索引值不是-1,就说明存在,统计变量++
- 把刚才的索引+小串的长度作为起始位置截取原始大串,得到一个新的字符串,并把该字符串重新赋值给大串。
- 再返回第二步重新截取。