String类是一个很重要类,因为你与String打交道的次数真的是太多了,若是真的严格要求自己,可以说String类中的每个方法你都需使用的如会背一般的熟练,当然我们也不需要去死记硬背,熟能生巧嘛,多接触接触代码,多查查API即可。
String类的概述
1:字符串字面值"abc"也可以看成是一个字符串对象。
2:字符串是常量,一旦被赋值,就不能被改变。
String类的构造方法
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):把字符串常量值转成字符串
String类的判断功能
boolean equals(Object obj):比较字符串的内容是否相同,区分大小写
boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
boolean contains(String str):判断大字符串中是否包含小字符串
boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
boolean isEmpty():判断字符串是否为空。
String类的获取功能
int length():获取字符串的长度。
char charAt(int index):获取指定索引位置的字符
int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
String substring(int start):从指定位置开始截取字符串,默认到末尾。
String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。
String的转换功能
byte[] getBytes():把字符串转换为字节数组。
char[] toCharArray():把字符串转换为字符数组。
static String valueOf(char[] chs):把字符数组转成字符串。
static String valueOf(int i):把int类型的数据转成字符串。
注意:String类的valueOf方法可以把任意类型的数据转成字符串。
String toLowerCase():把字符串转成小写。
String toUpperCase():把字符串转成大写。
String concat(String str):把字符串拼接。
String类的其他功能
A:String的替换功能
String replace(char old,char new)
String replace(String old,String new)
B:String的去除字符串两空格
String trim()
C:String的按字典顺序比较两个字符串
int compareTo(String str)
int compareToIgnoreCase(String str)
String类常见面试题
常量池:方法区的一部分,常量池在编译期间就将一部分数据存放于该区域,包含基本数据类型如int、long等和对象类型String、数组等并以final声明的常量值。特别注意的是对于运行期位于栈中的String常量的值可以通过 String.intern()方法将该值置入到常量池中。
public class StringInterview {
public static void main(String[] args) {
//注:以下程序重点解释两个String字符串的地址值比较(==)
test1();
// test2();
// test3();
// test4();
// test5();
}
public static void test1() {
// 1.判断定义为String类型的s1和s2是否相等
String s1 = "abc"; //存放在常量池
String s2 = "abc"; //判断常量池是否有 "abc" ,有则直接返回其地址值,无则创建并返回地址值
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
}
public static void test2() {
// 2.下面这句话在内存中创建了几个对象?
String s1 = new String("abc");
/*
* 两个,一个是字符串字面量"abc"所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,
* 另一个是通过new String(String)创建并初始化的、内容与"abc"相同的实例,在堆内存中。
*/
}
public static void test3() {
// 3.判断定义为String类型的s1和s2是否相等
String s1 = new String("abc"); //存放在堆内存
String s2 = "abc"; //存放在常量池。注意:由于上面已经在常量池创建了"abc"对象,所以此时直接返回其地址值
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2));//true
}
public static void test4() {
// 4.判断定义为String类型的s1和s2是否相等
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
/*
* JVM对于字符串常量的"+"号连接,将程序编译期,JVM就将常量字符串的"+"连接优化为连接后的值,
* 拿"a" + "b" + "c"来说,经编译器优化后在class中就已经是abc。
* 在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。
*/
}
public static void test5() {
// 5.判断定义为String类型的s1和s2是否相等
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2); //false
System.out.println(s3.equals(s2)); //true
/*
* JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即s1 + "c"无法被编译器优化,
* 只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序第一个的结果也就为false。
*
* 在想一下:假如s1前面加上 final 修饰呢?第一个输出结果如何?
* 结果:true
* 原因:
* 对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中。
* 所以此时的s1 + "c"和"ab" + "c"效果是一样的。故结果为true。
*/
}
}
小试一下
题目:在大串中寻找小串出现的次数?
如:在大串("jdbfwlfdaksfjavaajkrgfekjcsjavsjavarekjgfrejkvskjdvcjxkxzxcjavarjskdjavsjava") 中查找小串(“java”)出现了几次?
参考答案:
/*
* 思路:使用indexOf查找小串在大串中首次出现位置,当不等于-1时(查找到了),计数器+1
* 截取大串(从小串出现的首次位置在加上小串的长度处开始截取到末尾),在使用indexOf()查找
* 可以发现,这个每次重复的操作,可以使用递归解决,
* 递归的出口就是 indexOf()等于-1时,大串中已无小串了,无需进行下去,开始返回
*/
public class FindString {
public static void main(String[] args) {
String minString = "java";
String maxString = "jdbfwlfdaksfjavaajkrgfekjcsjavsjavarekjgfrejkvskjdvcjxkxzxcjavarjskdjavsjava";
System.out.println(countString(minString, maxString));
}
public static int countString(String minString,String maxString) {
int index = maxString.indexOf(minString);
if(index != -1) {
return 1+countString(minString, maxString.substring(index+minString.length()));
}
return 0;
}
}
//Output: 4