java 字符串相关面试题

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修饰的内容
确认某个类的子类在程序执行过程中,只创建一次对象,则使用匿名内部类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抹泪的知更鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值