文章目录
1、线程的基本状态以及状态之间的关系?
说明:其中 Running 表示运行状态,Runnable 表示就绪状态(万事俱备,只欠CPU),Blocked 表示阻塞状态,阻塞状态又有多种情况,可能是调用wait() 方法进入等待池,也可能是执行同步方法或者同步代码块进入等锁池(lock pool),或者是调用了sleep() 方法或 join() 方法等待休眠或其他线程结束,或是因为发生了I/O中断。
2、简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
Lock 是 java5 以后引入的新的API 和关键字
synchronized 相比主要相同点:Lock 能完成synchronized所实现的所有功能;
主要不同点:
Lock 有比 synchronized 更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized 会自动释放锁,而 Lock 一定要求程序员手工释放,并且最好在 finally 块中释放(这是释放外部资源的最好的地方)。
3、Java 中如何实现序列化,有什么意义?
[序列化]([Java序列化与反序列化 - niceyoo - 博客园 (cnblogs.com)](https://www.cnblogs.com/niceyoo/p/10596657.html#:~:text=Java,中对象的序列化就是将对象转换成二进制序列,反序列化则是将二进制序列转换成对象。 二是可以对象数据的远程通信。))就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可以将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可别序列化的,然后使用一个输出流来构造一个对象输出流并通过 writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject 方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。
4、 java中有几种类型的流?
字节流和字符流。字节流继承于 InputStream、OutputStream,字符流继承于Reader、Writer。在java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于 java 的 I/O 需要注意的有两点:一是两种对象性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式([适配器模式]((2条消息) Java适配器模式_YuenBin128的博客-CSDN博客_java适配器模式)和装潢模式)。另外 Java 中的流不同于C# 的是它只有一个维度和一个方向。
5、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
package day220812;
import java.io.BufferedReader;
import java.io.FileReader;
public final class MyUtil {
// 工具类中的 方法都是静态方式访问的因此将构造器私有不允许创建对象(绝对好习惯)
private MyUtil(){
throw new AssertionError();
}
/**
* 统计给定文件中给定字符串的出现次数
* @param filename 文件名
* @param word 字符串
* @return 字符串在文件中出现的次数
*/
public static int countWordInFile(String filename, String word){
// 计数器
int counter = 0;
try (FileReader fr = new FileReader(filename)) {
try (BufferedReader br = new BufferedReader(fr)){
String line = null;
while ((line = br.readLine())!=null){
int index = -1;
while (line.length() >= word.length() && (index =line.indexOf(word))>=0){
counter ++;
line = line.substring(index + word.length());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return counter;
}
}