1.jdk 与jre的区别
jre :java Runtime Environment(java 运行时环境)。即Java运行时包含了Java 虚拟机,java基础类库。
jdk: java development kit(java 开发工具包) Java 编程所用的开发包,里面包含着jre,同时包含着Java 编译器javac,监控工具jconsole.分析工具jvisualvm 等。
2.== 和equals 的区别
‘==‘ 1.基本类型,比较的是值 2 引用类型比较的是地址 3 不能比较没有父子关系的两个对象
equals 1)系统类一般已经覆盖了equal是(),比较的是内容
2 )用户自定义类如果没有覆盖equals(),将调用父类的equals(如object类,object 中的equals比较的是地址(return(this == obj))
3)用户自定义类需要覆盖父类的equals().
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
首先,答案肯定是不一定。同时反过来equals为true,hashCode也不一定相同。
类的hashCode方法和equals方法都可以重写,返回的值完全在于自己定义。
hashCode()返回该对象的哈希码值;equals()返回两个对象是否相等。
关于hashCode和equal是方法是有一些 常规协定 :
1、两个对象用equals()比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。
2、两个对象用equals()比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,亿提搞哈希表性能。
3、重写equals()方法,必须重写hashCode()方法,以保证equals方法相等时两个对象hashcode返回相同的值。
(API上有标注:请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相等的哈希代码。)
4.final,fianlly,finalize的区别和用法
final 用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承
finally 是异常处理语句结构的一部分,表示总是在执行
finalize 是 object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,
Java中final、finally、finalize的区别与用法 - smart_hwt - 博客园
5java 中操作字符串都有哪些类?它们之间有什么区别?
.string,stringbuilder,stringbuffer ,
string 的源码中是用final 来进行修饰的,因此是不可变的
String builder 和 stringbuffer 的区别在于 stringbuffer 是线程安全的,stringbuffer 用synchronized 来进行修饰
执行效率上 是 string builder》string buffer》String
Java| String, StringBuffer和tringBuilder之间的区别?_YvesHe的专栏-CSDN博客
6.String str="i"与 String str=new String(“i”)一样吗?
String str1 = "i";
String str2 = "i";
String str3 = new String("i");
System.out.println(str1 == str2);//ture
System.out.println(str2 == str3);//false
Java虚拟机会将其分配到常量池中:常量池不会创建重复对象
在string str1 中,把i的值存在常量池,把地址赋给f1,假如再写一个string str2 =“i” 则会把i 的 地址赋给str2 ,但是 i 对象不会重新创建,他们引用的是同一个地址,共用同一个内存。
分到堆内存中:堆内存会创建新的对象
假设在写一个string s3 = new String(“i”) 则会创建一个新的ui对象,然后将新对象的地址赋值给s3,所以,str1 和 s3 值相同,地址不同。
7如何将字符串反转?
1)string builder 和 stringbuffer 中的 reverse 方法都可以实现,本质上是调用了 abstract String Builder中的reverse方法来实现的
2) 自己实现
3) 递归
package constxiong.interview;
public class TestReverseString {
public static void main(String[] args) {
String str = "ABCDE";
System.out.println(reverseString(str));
System.out.println(reverseStringByStringBuilderApi(str));
System.out.println(reverseStringByRecursion(str));
}
/**
* 自己实现
* @param str
* @return
*/
public static String reverseString(String str) {
if (str != null && str.length() > 0) {
int len = str.length();
char[] chars = new char[len];
for (int i = len - 1; i >= 0; i--) {
chars[len - 1 - i] = str.charAt(i);
}
return new String(chars);
}
return str;
}
/**
* 使用 StringBuilder
* @param str
* @return
*/
public static String reverseStringByStringBuilderApi(String str) {
if (str != null && str.length() > 0) {
return new StringBuilder(str).reverse().toString();
}
return str;
}
/**
* 递归
* @param str
* @return
*/
public static String reverseStringByRecursion(String str) {
if (str == null || str.length() <= 1) {
return str;
}
return reverseStringByRecursion(str.substring(1)) + str.charAt(0);
}
}
8.string 类中的常用方法有那些?
indexOf() 返回指定索引
charAt() 返回指定索引处得到字符
replace() 字符串替换
trim() 去除字符串两端的空白
split()分割字符串,返回分割的字符串数组
getBytes() 返回字符串的byte 类型数组
length() 返回字符串长度
toLowerCase() 字符串转小写
toUppderCase() 字符串转大写
substring() 截取字符串
equals() 字符串比价
9.普通类,抽象类,接口的区别
1) 普通类和抽象类的比较
抽象类: 用 abstract 修饰符来进行修饰的类,不能够被实例化,是一种概念并不具体
普通类: 相对于抽象类而言,可以进行实例化
抽象类和普通类的区别,两者都可以被继承,但是抽象类被继承之后子类必须重写继承的方法,除非子类也是抽象类。
2)抽象类和接口的区别
(1)概念不一样:接口是对动作的抽象,表示这个对象能做什么;抽象类是对本质的抽象,表示这个对象是什么。
(2)使用不一样:
a.抽象类和接口都可以用来抽象具体对象,但是接口的抽象级别更高
b. 抽象类可以使用具体的方法和属性,接口只能有抽象方法和不可变常量
c. 抽象类主要用来抽象类别,接口主要用来抽象功能
d. 抽象类中,不包含任何实现,派生类必须覆盖他们。接口中的所有方法都必须是未实现的
e. 接口时设计的结果,抽象类是重构的结果
(3)使用方向:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
10.java 中io 流分为几种
file :代表了磁盘上的文件或者目录
i/o: jvm 和外部数据源的数据交换。File,db -in-ajvm ---out -afile,db
三种分类:
方向分:输入流和输出流
单位分:字节流和字符流
字节流 InputStream/OutputStream 字节流的父接口
FileInputStream/FileOutputStream 文件字节流 ((可以向下转换))
DataInputStream/DataOutputStream 读写8种基本类型和以UTF-8读写String
BufferedInputStream/BufferedOutputStream 带缓冲的输入/出流
PrintStream 融合Data和Buffered, System.out所属的类
Piped 管道 用于线程间交换数据
RandomAccessFile 随机访问文件
字符流:处理字符编码问题
reader/writer 字符流的父接口
FileReader/FileWriter 文件字符流,和FileInputStream/FileOutputStream文件流,
InputStreamReader/OutputStreamWriter 桥转换 将字节流转成字符流 在桥转换的过程中,可以制定编解码方式
BufferedReader/PrintWriter 有缓冲
字符流转换为字节流时,指定编解码方式是在桥转换时指定的。
功能分:节点流和过滤流;
piped(g管道节点流): 用于两个线程间传输数据。一个线程的输出,是另一个线程的输入。
对象序列化: 把对象放在流上传输ObjectInputStream/'ObjectOutputStream
只有实现了serializable 接口的对象才能序列化
用transient 修饰的属性,为临时属性,不参与序列化,只能修饰对象的属性。
11.BIO、NIO、AIO 有什么区别?(这个整理的不完整,因为不理解,还需要接下来重新去整理)
io 通常分为几种 同步阻塞bio,同步非阻塞nio,异步非阻塞aio
一.bio
在jdk 1.4之前,我们建立网络连接的时候采用 bio 模式,需要现在后台启动一个serverSocket,然后在客户端启动socket 来对服务器进行通信,默认情况下服务端需要对每一个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程响应,如果没有则会一直等待或者拒绝请求,如果有的话,客户端会线程等待请求结束后才继续执行。
二、nio
nio 本身是基于事件驱动思想来完成的,主要是解决bio并发问题:在使用同步i/o的网络中,。如果能同时处理多个客户端请求,或者在客户端同时和多个服务器进行通讯,就必须使用多线程来处理,也就是说,将每一个客户端请求分配给一个线程来进行单独处理,
三、aio
与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。 在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道:
- AsynchronousSocketChannel
- AsynchronousServerSocketChannel
- AsynchronousFileChannel
- AsynchronousDatagramChannel
其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。
BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。
BIO与NIO、AIO的区别(这个容易理解)_skiof007的专栏-CSDN博客_aio bio nio
12、Files 常用方法有哪些?
Files.exists(); 判断文件是否存在
Files.createDirectory();创建文件夹
Files.copy(); 复制文件
File.move() 移动文件
File.delete() 删除一个文件或者目录:如果不存在会报错
Files.deleteIfExists() 删除一个文件或目录:如果存在就删除