概述
String相关面试题
- 1.String相关面试题
- String、StringBuffer和StringBuilder的区别?
- String str="i"与 String str=new String("i")一样吗?
- String t = new String("test");在堆中创建了几个对象?
- String 是 Java 基本数据类型吗?可以继承吗?
- 如何将字符串反转?
- 字符串相关比较
- 2.接口和抽象类有什么区别?
- 3.内部类的作用和分类?
1.String相关面试题
String、StringBuffer和StringBuilder的区别?
String 和 StringBuffer 、 StringBuilder 的区别:
String是不可变的字符串,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象
而 StringBuffer 、 StringBuilder 可以在原来的字符串上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String 。
StringBuffer 和 StringBuilder 最大的区别在于:
StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。
单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
StringBuilder 的性能却高于 StringBuffer。
String str="i"与 String str=new String(“i”)一样吗?
不一样:前面有Java虚拟机放在常量池中(方法区),new出来的对象是放在堆内存中(java8的串池在堆内存中)
String t = new String(“test”);在堆中创建了几个对象?
分两种情况:
java8之前:
1.创建对象时,会自动调用intern()方法检测串池中是否有该对象,如果没有便会在堆中创建一个对象
,在堆中在复制一份,调用intern()方法存入到串池中,一共创建两次。
2.如果常量池中检测出有该对象,只在堆中创建一次,常量池是为了代码的复用
java8或之后:
1.串池移到了堆中,如果串池中没有该对象,那么在堆中创建的对象,intern()方法会直接将对象放入到串池中
2.如果串池中有对象,就在堆中创建一次,所有在java8中对象至多创建一次
String 是 Java 基本数据类型吗?可以继承吗?
不是。Java 中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type)。
String 类使用 final 修饰,无法被继承。
如何将字符串反转?
1.StringBuffer和StringBuilder中可以调用reverse()方法进行反转
2.也可以转化为char数组进行反转
字符串相关比较
public class Demo1 {
public static void main(String[] args) {
String s1 = “a”;
String s2 = “b”;
String s3 = “a” + “b”;
String s4 = s1 + s2;
String s5 = “ab”;
String s6 = s4.intern();
String s7 = new String(“a”) + new String(“b”);
String s8 = s7.intern();
System.out.println(s3 == s4);//false
System.out.println(s3 == s5);//true
System.out.println(s3 == s6);//true
System.out.println(s4 == s6);//false
System.out.println(s4 == s7);//false
System.out.println(s6 == s8);//true
String x2 = new String("c") + new String("d");
// String x1 = “cd”;
// x2.intern();
// System.out.println(x1 == x2);//false
x2.intern();
String x1 =“cd”;
System.out.println(x1 == x2);//true
//如果调换了位置,如果是1.6呢
//如果常量池中没有,则会在堆中复制一份到常量池中
}
}
s3在编译期就自动编译成”ab”字符串
S4的底层是用StringBuilder在堆中创建了一个新的对象,使用appand方法进行拼接,然后在调用toString()方法
2.接口和抽象类有什么区别?
1.抽象类体现的是模板思想,使用abstact关键字创建类,方法中不能有方法体,而接口是 用来定义规范,使用interface创建接口
2.实现:抽象类的子类使用 extends 来单继承;接口必须使用 implements 来实现。
3.构造函数:抽象类可以有构造器和成员变量;接口不能有构造器,不能有普通方法,只能 是抽象方法,jdk8之后接口也可以有static、defalt关键字修饰的方法,变量必须是常量 Java9支持私有方法、私有静态方法。
4.main方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
5.实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
6.访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰 符。
3.内部类的作用和分类?
内部类可对同一包中其他类隐藏,内部类方法可以访问定义这个内部类的作用域中的数据
1.静态内部类:
属于外部类,只加载一次。作用域仅在包内,可通过 外部类名.内部类名 直接访问,类 内只能访问外部类所有静态属性和方法。HashMap 的 Node 节点,ReentrantLock 中的 Sync 类,ArrayList 的 SubList 都是静态内部类。内部类中还可以定义内部类,如 ThreadLoacl 静态内部类 ThreadLoaclMap 中定义了内部类 Entry。
2.成员内部类:
将一个类作为另一个类的成员使用时
注意:
当成员内部类时非static的情况下,在内部类中不能定义static内容
当外部类的成员与内部类的成员重名时,使用外部名.this.成员
3.局部内部类:
定义在方法内
注意:
不能声明访问修饰符
只能定义实例成员变量和实例方法
作用范围仅在声明类的代码块中。
4.匿名内部类:
只用一次的没有名字的类
注意:
不能有构造方法
不能有static修饰的内容
确认某个类的子类在程序执行过程中,只创建一次对象,则使用匿名内部类
最后
以上就是冷艳百褶裙为你收集整理的java 字符串相关面试题的全部内容,希望文章能够帮你解决java 字符串相关面试题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复