JavaSE面试题(一)

别人总结的一些面试题

Java的一些基础问题

String类笔试的问题

1.String类常考选择题
String类笔试题
上面解释的很清楚。
2.内存分布

  • 栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
  • 堆内存:数组和对象,通过new建立的实例都存放在堆内存中。
  • 方法区:静态成员、构造函数、常量池、线程池
  • 本地方法区:window系统占用
    实例:
    1)包装类
    基本数据类型的包装类型可以在常量池查找对应值的对象,找不到就会自动在常量池创建该值的对象。
    2)String类的intern()方法
    比如String a= new String(“a”).intern()时会先在常量池找是否有“a"对象如果有的话直接返回“a"对象在常量池的地址,即让引用a指向常量”a"对象的内存地址。 public native String intern(); Integer也是同理。
String s1 = "a";
String s2 = new String("a");
//调用intern时,如果s2中的字符不在常量池,则加入常量池并返回常量的引用
String s3 = s2.intern();
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //true

String类面试的问题

一、String、StringBuilder和StringBuffer的区别

  1. String是字符串常量,StringBuilder和StringBuffer是字符串变量

String对象创建完成之后,如果对其更改,都是重新创建一个String对象,创建的过程是先向字符串常量池查找,如果没有则先创建该对象,然后把该字符串对象添加到字符串常量池中(jdk1.6复制的是字符串对象实例,jdk1.7则是复制字符串对象的实例引用);而StringBuilder和StringBuffer都是可变的;

2. StringBuilder是线程不安全的,StringBuffer是线程安全的

StringBuffer相关方法添加了线程同步关键字synchronize关键字,故线程安全的,但效率低。

二、String为什么设计成不可变(immutable)

  1. 字符串常量池的优化需要

字符串常量池针对String字符串使用的一种优化策略,创建字符串对象前,首先检查字符串常量是否已经有该字符串(通过equal比较),有直接返回字符串在字符串常量池的引用,避免重复创建字符串而消耗多余的内存空间,如果String为可变的,这种优化策略则无效;

  1. 允许String对象缓存HashCode
    字符串的不变性保证了hashcode唯一性,不可变的hashcode可以被缓存而不用重新计算,提升了像使用String作为键值的hashmap的效率,这也侧面反映了hashmap为什么多数使用String作为键值的原因了;

  2. 多线程使用安全性

字符串不可变,所以在多线程可以共享一个字符串实例,而不需要做额外的线程同步;

  1. 类加载器需要

类加载器用到字符串,不可变性提供了安全性,以便类的正确加载;例如在加载java.sql.Connection类,如果这个值被改成myhacked.Connection,则会对数据库造成不可知的破坏;

  1. 安全性

如果字符串是可变的,则会引起很严重的安全问题;例如数据库的用户名和密码都是以字符串形式传入获得数据库的连接,socket编程中,主机名等都是以字符串形式传入,如果字符串可变,黑客可以很容易改变字符串对象的值,造成安全漏洞。

三、String直接创建对象(String s=“abc”)和intern()方法的区别
两者在创建字符串对象的时候都会先去字符串常量池查找该对象是否存在,如果没有,在堆中创建字符串对象,并把字符串实例引用(jdk1.7+)复制到字符串常量池中;大概看上去intern()方法该有的功能String s=“abc”;都有的,那么intern存在的意义为何?
String s="abc"和intern()方法的区别是一个在编译期查找,一个在运行期查找。

四、StringBuilder和"+"号的区别
使用“+”进行字符串常量的拼接在表达式只有常量时,编译期完成计算,但表达式有变量时,运行期才完成计算,所以地址不一样;而使用 StringBuilder 进行字符串拼接需要在运行时完成。所以单纯的字符串常量拼接“+”的效率应该高于 StringBuilder。

 String s1="ab";
  String s2=new StringBuilder().append(s1).append("c").toString();
  String s3=s1+"c";
  String s4="ab"+"c";
  String s5="abc";
  System.out.println(s2==s3);
  System.out.println(s3==s5);
  System.out.println(s4==s5);
>>false
>>false
>>true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值