新手Java程序员了解String类型
1、String是什么数据类型?
String在定义上是java.lang包下的一个类,它不是基本的数据类型
String是不可变的,JVM使用字符串池来存储所有的字符串对象
2、创建String对象的方式
使用关键new
这种方式JVM创建字符串对象但不存储于字符串池。可以调用intern()方法存储字符串池,如果字符串中已经有同样的字符串,则返回引用。
使用双引号直接创建
这种方式JVM去字符串池中找有没有值相等的,如果有返回找到的字符串引用。如果没有创建新的字符串。
3、判断一个字符串是否是回文(顺读和倒读都一样)
回文就是正反都一样的词,如果需要判断是否是回文,只需要比较正反是否相同即可。String类并没有提供反转方法供我们使用,但是StringBuffer和StringBuilder有reverse方法。
private static boolean isPalindrome(String str){
if(str==null)
return false;
StringBuilder strBuilder=new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}
不使用任何其他类来实现:
private static boolean string(String str){
if(str==null)
return false;
int len=str.length();
System.out.println(len/2);
for(int i=0;i<len/2; i++){
if(str.charAt(i)!=str.charAt(len-i-1)){
return false;
}
}
return true;
}
4、如何让一个字符串变成大写或小写形式
toUpperCase()大写
toLowerCase()小写
5、字符串的比较
String内部实现了Comparable接口,有两个方法比较compare To(String anotherString)和compare TolgnoreCase(String str)。
compare To(String anotherString)
与传入的anotherString进行比较,如果小于传入的字符串返回负数,如果大于则返回正数,当两个数相等时返回0,此时eqauls方法会返回true
equalslgnoreCase(String str)
该方法与compareTo方法类似,区别只是内部利用了Character.toUpperCase等方法进行了大小写转换后进行比较
6、String和char类型相互转换
这是一个误导题,String是一系列的字符,所以我们没办法转成单一的char,但可以调用toCharArray()方法将字符串转换成字符数组。
7、String 转换为byte array
使用String的getBytes()方法将String转成byte使用String的构造方法new String(byte[] array)将byte数据转为String
8、String,StringBuffer,StringBuilder区别
String是不可变类,对String类型的操作总会创建新的字符串。操作String很耗费资源,所以Java提供了两个工具来操作String StringBuffer和StringBuilder
StringBuffer和StringBuilder是可变类,StringBuffer是线程安全,StringBuilder则是线程不安全。所以多线程对同一个字符串操作时选择StringBuffer.由于不需要处理多线程的情况,StringBuilder的效率比StringBufferh高
9、String是不可变有什么好处?
String不可变优点:
由于String是不可变类,所以在多线程中使用时安全的,我们不需要做任何的替他同步操作
String不可变,它的值也不能被改变,座椅用来存储数据密码安全
String不可变可以在java运行时节省大量java堆空间,因为不同的字符串变量可以引用池中的相同的字符串,如果字符串是可变的,任何变量的值改变就会反射到其他变量,那么字符串池就没有任何意义
10、如何分割字符字符串
split(String regex);传入正则字符串,返回字符串数组
split(String regex,int limit);限制分割结果数组中有几个字符串。
11、判断两个String是否相等
有两种凡是判断字符串是否相等,使用“==”或者使用equals方法。当使用“==”操作符时,不仅比较字符串的值,还会比较引用的内存地址,大多数情况下我们只需要判断值是否相等,此时用equals方法比较即可。
12、字符串池
存储字符串,存在于Java堆内存
13、String的intern()方法
当调用intern()方法被调用,如果字符串池中含有一个字符串和当前调用方法的字符串equals相等,那么就会返回池中的字符串,如果池中没有的话则首先先将当前字符串假如池中,然后返回引用
14、String是线程安全吗
String是不可变类,一旦创建String对象,我们就无法改变它的值,因此,它是线程安全的,可以安全地用于多线程环境中
15、为什么我们在使用HashMap的时候总是用String做key
因为字符串是不可变,当创建字符串时它的hashcose被缓存下来,不需要再次计算。因此HashMap内部实现是通过key的Hashcode来确定value的存储位置,所以相比其他对象更快,这也是我们平时都是用String作为HashMap对象。