面试总结(二)字符、数组、字符串、链表、栈、队列、树、IO

1. 数组、字符、字符串

1.1 String,StringBuffer,StringBuilder区别

StringBuilder与StringBuffer有公共父类AbstractStringBuilder( 抽象类 )。
- 抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。

  1. 线程安全
    String 字符串常量 慢
    StringBuffer 字符串变量(线程安全) 一般
    StringBuilder 字符串变量(非线程安全)快
  2. 可变性
    • 每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,
    • StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer
  3. 方法的区别
    String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true
    而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。

1.2 String为什么不可变

  • 主要是为了 “ 效率 ” 和 “ 安全性 ” 的缘故。 若 String 允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以 String 被定义成 final。
  • 只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。
  • 因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。
  • 不可变类真正唯一的缺点是,对于每个不同的值都需要一个单独的对象。创建这种对象的代价很高。

2.链表

1. 链表删去指定值的节点

2.

3.栈、队列

手写两个栈实现队列,优化【3】

4.树、图

树的中序遍历,除了递归和栈还有什么实现方式(Morris遍历)
说一下对B+树的了解
堆与普通二叉树有什么区别。

5.IO

5.1 说一说对java io的理解

面试总结(二)字符、数组、字符串、链表、栈、队列、树、IO

  • Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.

  • IO体系结构
    面试总结(二)字符、数组、字符串、链表、栈、队列、树、IO

  • 字符流和字节流
    1) 字节流:字节流以字节(8bit)为单位,字节流能处理所有类型的数据(如图片、avi等)
    2) 字符流:字符流以字符(16bit)为单位,根据码表映射字符,一次可能读多个字节。字符流只能处理字符类型的数据。数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。

  • 字节流和字符流的区别(重点)
    节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。
    因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。

  • 字符流与字节流转换

    1. InputStreamReader:字节到字符的桥梁
    2. OutputStreamWriter:字符到字节的桥梁
  • 何时使用转换流?

    1. 当字节和字符之间有转换动作时;
    2. 流操作的数据需要编码或解码时。

5.2 说一下IO模型

  • Java的IO模型设计非常优秀,它使用Decorator(装饰者)模式,按功能划分Stream,您可以动态装配这些Stream,以便获得您需要的功能。
  • 例如,您需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。

5.3 IO哪个类可以byte[]转String

  • 字节流转化为字符流时,实际上就是byte[]转化为String时,

5.4 操作系统IO的几种类型和原理