面试刷题第四天

一、常见的面试题
1、String、StringBuffler、Stringbuilder的区别?
(1)、可变 不可变

  • String : 字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。
  • StringBuffer : 在修改时会改变对象自身,每次操作都是对StringBuffer对象本身进行修改,不是生成新对象,使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。

(2)、线程是否安全

  • String:对象定义后不可变,线程安全。
  • StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区大量数据。
  • StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。

(3)、共同点

  • StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。
  • StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append(…)。只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用StringBuilder 效率高于 StringBuffer。

2、数据类型之间的转换

(1)、字符串如何转基本数据类型?

  • 答:调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueOf(String)即可返回相应基本类型。

(2)、基本数据类型如何转字符串?

  • 答:一种方法是将基本数据类型与空字符串(“”)连接(+)即可获得其所对应的字符串;另一种方法是调用 String 类中的valueOf()方法返回相应字符串。

3、Java 中有几种类型的流?

答:

  • 按照流的方向:输入流(inputStream)和输出流(outputStream)。
  • 按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)
  • 按照处理数据的单位:字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于InputStreamReader 和 OutputStreamWriter。

4、字节流如何转为字符流?
答:

  • 字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。
  • 字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。

5、如何实现对象克隆?
答:有两种方式
(1)、 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
(2)、 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆

6、什么是 java 序列化,如何实现 java 序列化?
答:

  • 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列 化 的 实 现 : 将 需 要 被 序 列 化 的 类 实 现 Serializable 接 口 , 该 接 口 没 有 需 要 实现 的 方 法 ,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。

7、并发集合和普通集合如何区别?
答:

  • 在 java中有普通集合、同步(线程安全)的集合、并发集合。普通集合通常性能最高,但是不保证多线程的安全性和并发的可靠性。线程安全集合仅仅是给集合添加了synchronized同步锁,严重牺牲了性能,而且对并发的效率就更低了,并发集合则通过复杂的策略不仅保证了多线程的安全又提高的并发时的效率。

8、List 的三个子类的特点
答:

  • ArrayList 底层结构是数组,底层查询快,增删慢。
  • LinkedList 底层结构是链表型的,增删快,查询慢。
  • voctor 底层结构是数组 线程安全的,增删慢,查询慢。

9、List 和 Map、Set 的区别
答:

  • List集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
  • Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
  • Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 TreeSet 类,可以按照默认顺序,也可以通过实现Java.util.Comparator接口来自定义排序方式。

9、HashMap 和 HashTable 有什么区别?
答:

  • HashMap 是线程不安全的,HashMap 是一个接口,是 Map 的一个子接口,是将键映射到值得对象,不允许键值重复允许空键和空值;由于非线程安全,HashMap 的效率要较 HashTable的效率高一些
  • HashTable 是线程安全的一个集合,不允许 null 值作为一个 key 值或者 Value 值; HashTable 是
    sychronize,多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被多个线程访问的时候需要自己为它的方法实现同步;

10、数组和链表分别比较适合用于什么场景,为什么?
答:

  • 数组应用场景:数据比较少;经常做的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建的线性表较稳定。
  • 链表应用场景:对线性表的长度或者规模难以估计;频繁做插入删除操作;构建动态性比较强的线性表。

猜你喜欢

转载自blog.csdn.net/qq_49014164/article/details/129341509