String是java.lang包内的一个类
一、定义一个字符串常量
public class StringDemo {
public static void main(String[] args) {
String str1="abc"; //存放到字符串的常量池中,这个值不能被改变
String str2=new String("abc"); //比较的是字符串的内容是否相同;堆内存中有一个String对象,常量池中有一个abc对象
String str3="abc"; //常量池中只有一个abc,在创建新的字符串常量时,会先判断常量池中是否有该字符串,如果有就不再新创建,并且将新建的对象引用该字符串常量的地址,所以str3和str2的地址相同。
System.out.println(str1==str2);
System.out.println(str3==str1);
System.out.println(str1.equals(str2));//内容是相同的
}
}
str1和str2的区别就是str1在内存中有一个对象;str2在内存中有两个对象(堆内存和常量池)
String类没有提供用于修改字符串的方法。可以看下面的代码
public class StringReplace {
public static void main(String[] args) {
String str1="hello";
String str2="java";
str2.replace("a", "o");
str1=str2;
System.out.print(str1);
}
}
结果会发现仍旧是“java”,因为执行replace操作后,常量池中会增加一个新的字符串“jovo”,而不是将“java”改为“jovo”,str2的地址仍旧指向“java”.
二、String有很多重要的方法,简单列举如下:
char charAt(int index) —->返回指定索引处的 char 值。
boolean equals(Object anObject) —->将此字符串与指定的对象比较。
boolean contains(CharSequence s) —->当且仅当此字符串包含指定的 char 值序列时,返回 true。
int compareTo(String anotherString) —-> 按字典顺序比较两个字符串。
int indexOf(String str) —->返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(String str, int fromIndex) —->返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
int length() —->返回此字符串的长度。
char[] toCharArray() —->将此字符串转换为一个新的字符数组。
String substring(int beginIndex) —->返回一个新的字符串,它是此字符串的一个子字符串。(该子字符串从指定索引处的字符开始,直到此字符串末尾。)
String substring(int beginIndex, int endIndex) —->返回一个新字符串,它是此字符串的一个子字符串。(该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。)
三、String类的练习
(1)对已知字符串进行排序(”bupt”,”java”,”cctv”,”nba”,”kid”,”csdn”),输出结果为bupt,cctv,csdn,java,kid,nba
public class StringSort {
public static void main(String[] args) {
String[] str={"bupt","java","cctv","nba","kid","csdn"};
sort(str);
printString(str);
}
public static void sort(String[] str) {
for(int x=0;x<str.length-1;x++){
for(int y=x+1;y<str.length;y++){
if(!str[x].compareTo(str[y])=-1){ //返回值为-1,则不相等;返回值为0,则相等
String temp = str[x];
str[x]=str[y];
str[y]=temp;
}
}
}
}
public static void printString(String[] str) {
for(int x=0;x<str.length;x++){
if(x!=str.length-1)
System.out.print(str[x]+",");
else
System.out.print(str[x]);
}
}
}
(2)得出子串在整串中出现的次数“abcbuptjdhfgbuptundhribuptkditbupt”
public class StringTest {
public static void main(String[] args) {
String strs=“abcbuptjdhfgbuptundhribuptkditbupt”
String key="bupt";
int count =getKey(strs,key);
System.out.print(count);
}
public static int getKey(String strs, String key) {
int count=0;
int index=0;
while((index=strs.indexOf(key,index))>0){ //indexOf()方法
count++;
index=index+key.length();
}
return count;
}
}
(3)输出两个字符串中的最大相同子串(面试考过),”zhdgcctvkid”,”dkocctvdkidkdgj”
public class StringSameSubstring {
public static void main(String[] args) {
/*
* 需求:两个字符串中的最大相同子串
* 1、看两个字符串是否是包含与被包含的关系
* 2、否:从较短字符串中的最长的可能子串开始判断
*/
String str1="zhdgcctvkid";
String str2="dkocctvdkidkdgj";
String maxstr=MaxStr(str1,str2);
System.out.println(maxstr);
}
public static String MaxStr(String str1, String str2) {
String maxstr="";
String max;
String min;
if(str1.length()>str2.length()){
max=str1;
min=str2;
}
else{
max=str2;
min=str1;
}
if(max.contains(min)==true)
return min;
else{
for(int x=0;xint length=min.length();
for(int y=0,z=length-x;zif(max.contains(strs)==true){
maxstr=strs;
return maxstr;
}
}
}
}
return null;
}
}
结果是cctv。
(4)对字符串中的字符进行自然排序,输出排序后的字符串
package my.java.String;
import java.util.Arrays;
public class SortString {
public static void main(String[] args) {
// 需求:对字符串中的字符进行自然排序"dkocctvdkidkdgj"
//数组直接就有排序的方法,因此思路可以是先将字符串转为char类型的数组,可以用toCharArray方法
String str="qazwsx";
char[] char_str=str.toCharArray();
Arrays.sort(char_str);
System.out.println(Arrays.toString(char_str));//将字符类型的数组转成字符串
}
}
输出为[a, q, s, w, x, z]