String基础面试题
1、String是基本数据类型吗
String不属于基本数据类型,如果非要说的话我认为String应该和包装类归为一类,是对字符串进行操作的工具类,java的基本数据类型只有以下八种:
类型 | 字节数 | 位数 | 范围 |
---|---|---|---|
char | 2 | 16 | char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符 |
byte | 1 | 8 | -2^8 ~ 2^8 -1 |
short | 2 | 16 | -2^16 ~ 2^16 - 1 |
int | 4 | 32 | -2^32 ~ 2^32 -1 |
lang | 8 | 64 | -2^64 ~ 2^64 -1 |
float | 4 | 32 | |
double | 8 | 64 | |
boolean | 1 | 8 | true/false |
2、java 中操作字符串都有哪些类?它们之间有什么区别?
java中操作字符串常见的类与三种:String、StringBuilder、StringBuffer
String
string操作字符串是不可变的,每次定义一个新的string的变量都是不可变的。
如果改变String变量的值实际上不是改变他的值,而是改变了String变量在内存中指向的地址,使其指向新的地址。String操作字符串不是线程安全的
StringBuilder
StringBuilder对象操作字符串是可变的,可以通过append方法继续往字符串后面添加新的字符串。
每次改变的都是变量的值,而不是改变变量在内存中的指向。StringBulider也不是线程安全的字符串操作
StringBuffer
StringBuffer操作字符串也是可变的,与StringBuilder操作字符串本质上没什么区别。
StringBuffer和StringBuilder最大的区别就在于StringBuffer是线程安全的,因为StringBuffer中的方法都被synchronized修饰了
3、String str="hello, world"与 String str=new String(“hello, world”)一样吗?
答案是不一样的
public static void main(String[] args) {
// 定义一个字符串,在字符串常量池中放入一个字符串hello, world
String str = "hello, world";
// 定义一个字符串,在堆内存中new出一个实例对象
String str1 = new String("hello, world");
// 返回false代表两个变量在内存中指向的地址不是同一个地址,返回true代表两个变量在内存中指向的地址是同一个地址
System.out.println(str == str1); // 返回结果是false
// 因为String中重写了equals方法,此时的equals已经不是仅仅比较的两个字符串的地址是否相同了,而是内容是否一样
System.out.println(str.equals(str1)); // 返回结果为true
/**
* 原因分析:
* String str = "hello, world";这段代码是在字符串常量池存储的一个"hello, world"的字符串
* String str1 = new String("hello, world"); 这段代码是在堆内存中创建了一个实例对象
* 因此两者所指向的内存中的地址不是同一个地址,两个对象并不是同一个对象
*/
}
4、如何将字符串反转?
代码示例
// 字符串反转
public static void main(String[] args) {
// 1、StingBuffer/StringBuilder中的reverse()
String str = "String reverse";
System.out.println(StringTest.reverseTest(str));
// 2、新建char数组反转
System.out.println(StringTest.charArrTest(str));
// 3、遍历反转字符串
System.out.println(StringTest.foreachStringTest(str));
}
// 1、StingBuffer/StringBuilder中的reverse()
public static String reverseTest(String sourceStr) {
StringBuffer sbf = new StringBuffer(sourceStr);
StringBuilder sb = new StringBuilder(sourceStr);
sbf.reverse().toString();
return sb.reverse().toString();
}
// 2、新建char数组反转
public static String charArrTest(String sourecStr) {
char[] arr = sourecStr.toCharArray();
char[] reArr = new char[sourecStr.length()];
for (int i = 0; i < arr.length; i++) {
reArr[i] = arr[arr.length - 1 - i];
}
return new String(reArr);
}
// 3、遍历字符串反转
public static String foreachStringTest(String str) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str.length(); i++) {
sb.append(str.charAt(str.length() - 1 - i));
}
return sb.toString();
}
5、String 类的常用方法都有那些?
length():获取字符串的长度
isEmpty():判断字符串长度是否为 0
charAt():返回指定索引处的字符
equals():判断两个变量内容是否相同
equalsIgnoreCase():忽略大小写比较两个字符串是否相同
startsWith():判断字符串是否以指定字符串开头
endsWith():判断字符串是否以指定字符串结尾
hashCode():获取字符串的hash码
indexOf():返回子字符串第一次在字符串中出现的索引
lastIndexOf():返回子字符串最后一次在字符串中出现的索引
substring():截取字符串
concat():将指定字符串拼接到字符串末尾
replace():替换字符串中的字符
contains():判断指定字符是否存在字符串中
split():根据指定字符将字符串拆分成数组
toLowerCase():将字符串转换成小写返回
toUpperCase():将字符串转换成大写返回
trim():去除字符串开始和结尾的空格
strip():删除字符串中索引的空格
toCharArray():将字符串转换成字符数组
format():返回值指定格式的字符串
valueOf():将对象转换成String输出,类似于包装类的装箱