java面试题之java基础
1. JDK 和 JRE 有什么区别?
JDK:java development kit :java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,JDK包含JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具。
JRE:java Runtime Environment :java的运行环境,包含了java的虚拟机,java的基础类库,是使用java语言编写程序运行所需要的软件环境。
2. == 和 equals 的区别是什么?
== 是判断两个变量或实例是不是指向同一个内存空间,== 是java的一个运算符合
Equals 是判断两个变量和实例所指向的内存空间的值是不是相同,Equals是java的一个方法
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
如果equals相等,则hashCode一定相等,反之则不然,两个方法的关联:
A.equals(B)==ture --> A.hashCode() == B.hashCode()
两个方法的定义:
Equals():用来判断两个对象是否相等,相同返回true,不相同返回false。
hashCode():返回一个int数,该int数的含义是:将该对象的内部地址转换为一个整数返回。
两个方法的规范:
1.若重写equals(Object obj)方法,必须重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。
2.如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。
hashCode是所有java对象的固有方法,如果不重载的话,返回的是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同。
哈希表是结合了直接寻址和链式寻址两种方式,将需要加入哈希表的数据首先计算哈希值,哈希值就是预先分个组,然后再将数据挂到分组后的链表后面,随着添加的数据越来越多,分组链上会挂接更多的数据,同一个分组链上的数据必定具有相同的哈希值,java中的hash函数返回的是int类型的,也就是说,最多允许存在2^32个分组,也是有限的,所以出现相同的哈希码就不稀奇。
4. final 在 java 中有什么作用?
特征:凡是引用final关键字的地方皆不可修改
1.修饰类:类不能被集成
2.修饰方法:方法不能被重写
3.修饰参数:参数不能被修改
5. java 中的 Math.round(-1.5) 等于多少?
1.round(arg):返回arg的四舍五入值,负.5返回较大的整数,如-0.5返回-1。
2.ceil(arg):返回小数所在两整数之间的最大值,如-0.5返回-1。
3.tail(arg):返回小数所在两整数之间的最小值,如-0.5返回-2。
6. String 属于基础的数据类型吗?
不是,java是用final修饰引用数据类型。
Java的基础数据类型有:byte、short、char、int、long、float、double、boolean
7. java 中操作字符串都有哪些类?它们之间有什么区别?
String,StringBuffer,StringBuilder。
相同点:都是以char[]的方式保存字符串。
不同点:
String类型的字符串是不可变的,我们对String的任何操作都相当于new一个新的String 。
StringBuffer和StringBuilder进行增删操作都是对一个对象做操作
StringBuffer中的方法大多数都使用synchronized关键字修饰,所以StringBuffer是线程安全的。
StringBuilder的方法没有用synchronized进行修饰所以线程不安全,但是正因为如此,所以他的性能更高。
使用:
单线程的情况下使用StringBuilder
多线程的情况下使用StringBuffer
如果在一个生命周期内,这个字符串几乎不做什么操作,那使用String,因为不调用new关键字声明Sting时,他不会再堆内存中创建对象,直接指向String的常量值,并可以复用,效率更高。
8. String str="i"与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。
String str="i"的方式,Java 虚拟机会将其分配到常量池中;
而 String str=new String(“i”)方式,则会被分到堆内存中。
9. 如何将字符串反转?
StringBuffer的reverse()方法。
String的charAt()方法从后向前取出。
10. String 类的常用方法都有那些?
.length()获取长度。
.charAt(int index)返回指定索引的字符。
.substring(2)截取。
.compareTo(str2)比较。
.concat(String str)连接。
.toLowerCase()小写。
.toUpperCase()大写。
.replace(char oldChar, char newChar)替换。
11. java 中 IO 流分为几种?
1.如果按流的流向分,可分为输入流和输出流。
2.如果按流的单元分,可分为字节流和字符流。
3.按照流的角色划分,可分为节点流和处理流。
InputStream:字节输入流的基类,OutputStream:字节输出流的基类。
Reader:字符输入流的基类,Writer:字符输出流的基类。
12. BIO、NIO、AIO 有什么区别?
默认情况:服务端启动一个ServerSocket,客户端启动Socket来对服务端进行通信。
BIO (Blocking I/O): 同步阻塞I/O
1.服务器实现模式为一个连接一个线程。即客户端有连接请求时服务器就需要启动一个线程进行处理
2.如果这个连接不做任何事情会造成不必要的线程开销
3.适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,应对小于单机1000的并发量。
NIO (New I/O): 同步非阻塞的I/O
1.服务器实现模式为一个请求一个线程。即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。
2.适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器
AIO (Asynchronous I/O): 异步非阻塞I/O
1.服务器实现模式为一个有效请求一个线程。客户端的IO请求都是由操作系统先完成了再通知服务器用其启动线程进行处理
2.适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂。
13. 同步与异步的区别:
同步:发送一个请求,等待返回,再发送下一个请求,同步可以避免出现死锁,脏读的发生
异步:发送一个请求,不等待返回,随时可以再发送下一个请求,可以提高效率,保证并发
14. Files的常用方法都有哪些(NIO包下)?
1.Files.exists():检测文件路径是否存在。
2.Files.createFile():创建文件。
3.Files.createDirectory():创建文件夹。
4.Files.delete():删除一个文件或目录。
5.Files.copy():复制文件。
6.Files.move():移动文件。
7.Files.size():查看文件个数。
8.Files.read():读取文件。
9.Files.write():写入文件。