关注WX公众号:“程序猿补课班”,分享Java相关技术知识,学习经验,面试经验等。快来补课吧!
1、String 是基本数据类型吗?
String 不是基本数据类型。
基本数据类型有四类八种,分别为:
1.整型:byte,short,int,long。
2.浮点型:float,double。
3.逻辑型:boolean。
4.字符型:char。
2、String 是可变的吗? 为什么可以赋其他值?
String 是 final 类型的,所以是不可变。
String对象是不可变的,它的内容是不能改变的。
String str = "Java" ;str = "hello" ;
第一条语句创建了一个内容为"Java"的String对象,并将其引用赋值给str。
第二条语句创建了一个内容为"hello"的新String对象,并将其引用赋值给str。赋值后第一个String对象仍然存在,但是不能再访问它,因为变量str现在指向了新的对象。
3、==和equals的区别?
比较字符串的值是否相同用 equals,比较字符串对象是否同一个用==。
==操作符用于比较两个对象的地址是否相等equals()用于比较两个对象的内容是否相等
例:
new String("您好").equals("您好") //equals() 比较的是两个字符串对象的内容是否相等,所以结果为 true。
new String("您好")=="您好" //==操作符左侧的是在堆中创建的对象,右侧是在字符串常量池中的对象,尽管内容相同,但内存地址不同,所以返回 false。
4、switch 中可以使用 String 吗?
jdk7+中的 switch 可以使用 String 类型。
5 、String str = "abc";和String str =new String("abc");到底分别创建了几个对象?
1、String str = “abc”; 创建了几个对象?0个 或者 1个
2、String str = new String(“abc”);创建了几个对象?1个或2个
我们来看String str = “abc”的创建过程:
1、首先在常量池中查找是否存在内容为"abc"字符串对象。
2、如果不存在则在常量池中创建"abc",并让str引用该对象。(也就是创建1个对象的情况)
3、如果存在则直接让str引用该对象(该对象是存在方法区的运行常量池中的)。(也就是创建0个对象的情况)
我们来看String str = new String(“abc”)的创建过程:
1、首先在堆中(不是常量池)创建一个指定的对象"abc",并让str引用指向该对象。(创建第1个对象)
2、在字符串常量池中查看是否存在内容为"abc"的字符串对象。
3、若存在,则让堆中创建好的字符串对象对字符串常量池的对象进行引用。(也就是只创建1个对象的情况)
4、若不存在,则在常量池中添加一个内容为"abc"的字符串对象,并将堆中的String对象进行引用。(也就是创建2个对象的情况)
6、String、StringBuffer、StringBuilder 有什么区别?
String 是 Java 中基础且重要的类,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。
StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。
在很多情况下我们的字符串拼接操作不需要线程安全,所以 StringBuilder 登场了。StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
线程安全:
StringBuffer:线程安全
StringBuilder:线程不安全
速度:
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。
使用环境:
操作少量的数据使用 String。
单线程操作大量数据使用 StringBuilder。
多线程操作大量数据使用 StringBuffer。