文章目录
一、java基础类型
1.1 整型变量规则
简单的说,如果整型字面量的值在-128 到 127 之间,那么不会 new 新的 Integer 对象,而是直接引用常量池
中的 Integer 对象,所以上面的面试题中 f1f2 的结果是 true,而 f3f4 的结果是 false。
1.2 String、 StringBuffer、 StringBuilder 的区别?
1)、可变不可变
String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。
StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对
象;使用场景:对字符串经常改变情况下,主要方法: append(), insert()等。
2) 、线程是否安全
String:对象定义后不可变,线程安全。
StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区
大量数据。
StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。
3) 、共同点
StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。
StringBuilder、 StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append(…)。
只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用
StringBuilder 效率高于 StringBuffer。
1.3 数据类型之间的转换
1)、 字符串如何转基本数据类型?
调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueOf(String)即可返回相应基本类型。
2) 、基本数据类型如何转字符串?
一种方法是将基本数据类型与空字符串(“”)连接(+)即可获得其所对应的字符串;另一种方法是调用 String
类中的 valueOf()方法返回相应字符串。
二、java中的IO
2.1 分类
按照流的方向:输入流(inputStream)和输出流(outputStream)。
按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)
按照处理数据的单位: 字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于
InputStreamReader 和 OutputStreamWriter。
2.2 字节流如何转为字符流
字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。
字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。
2.3 字节流和字符流的区别
字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节
数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。 字节流可以处理所有类型数
据,如:图片, MP3, AVI 视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符
流,除此之外都用字节流。 字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、
InputStream
字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字
节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的,
所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用
字符流好点。在程序中一个字符等于两个字节, java 提供了 Reader、 Writer 两个专门操作字符流的类。
2.4 如何实现对象克隆
1). 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
2). 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,
注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用 Object 类的 clone方法克隆对象。让问题在编译的时候暴露出来总是好过把问题留到运行时。
三、对象的序列化
3.1 对象的序列化
public class Serializable_test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Address address = new Address("23");
Stu stu = new Stu("李四","23",address);
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("D:\\Stu.obj"));
outputStream.writeObject(stu);
LocalDate now = LocalDate.now();
outputStream.writeObject(now);
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\Stu.obj"));
Stu stu1 = (Stu) objectInputStream.readObject();
LocalDate localDate = (LocalDate) (objectInputStream.readObject());
System.out.println(stu1.getAddress().getId() + " " + stu1.getAge() + " " + stu1.getName());
System.out.println(localDate.toString());
}
}
参考: 黑马程序员面试宝典