面试题整理:java基础篇

JDK和JRE有什么区别?

JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和lib和起来就称为jre。

==和equles的区别是什么?

== 是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。
equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。

两个对象的hashCode()相同,则equles()也一定为true,对吗?

不对,两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
hashCode是地址值经过一系列的复杂运算得到的结果,而Object中的equals方法底层比较的就是地址值,所以equals()相等,hashCode必定相等,反equals()不等,在java底层进行哈希运算的时候有一定的几率出现相等的hashCode,所以hashCode()可等可不等。

final关键字在java中有什么作用?

被final关键字修饰的类不能被继承,被final关键字修饰的类属性和类方法不能被重写

java中Math.round(-1.5)等于多少?

等于-1,四舍五入的原理是在参数上加0.5然后做向下取整。

String属于基本数据类型吗?

不属于,String是个对象,是引用类型。

基本数据类型与引用类型的区别是:

  • 基础类型只表示简单的字符或数字这样的简单的数据类型。
  • 引用类型可以表示复杂的数据类型,还可以操作这种数据类型的行为 。

java中操作字符串有哪些类?

字符串查找
indexOf(String str)
lastIndexOf(String str)

获取指定索引位置的字符
charAt(int index)

获取子字符串
substring(int beginIndex)

去除空格
trim()

字符串替换
replace(String str1, String str2)

判断字符串的开始与结尾
startsWith(String prefix)
endsWith(String suffix)

判断字符串是否相等
equals(String otherstr)
equalsIgnoreCase(String otherstr)

按字典顺序比较两个字符串
compareTo()

字母大小写转换
toLowerCase()
toUpperCase()

字符串分割
split()

想要详细了解用法可点击 Java字符串常用操作

String str = “i” 与 String str = new String(“i”)一样吗?

不一样。
可以这么理解,String str = “i” 先在内存中搜索是否有"i"存在,如果存在则取出,如果不存在则新建一个对象。
而String str = new String(“i”) 不管内存中是否有"i"存在,都新建一个对象。

如何将字符串反转?

  1. split()方法将一个字符串对象的每个字符拆出来,并且将每个字符串当成数组的每个元素
  2. reverse()方法用来改变数组,将数组中的元素倒个序排列,第一个数组元素成为最后一个,最后一个变成第一个
  3. join()方法将数组中的所有元素边接成一个字符串

抽象类必须要有抽象方法吗?

抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。

普通类和抽象类的区别?

1.抽象类不能被实例化。
2.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
3.抽象方法只需声明,而无需实现,抽象类中可以允许普通方法有主体
4.含有抽象方法的类必须声明为抽象类
5.抽象的子类必须实现抽象类中所有抽象方法。

java中的IO流分为几种?

字节流:InputStream/OutputStream
任何文件都可以通过字节流进行传输

字符流(Reader/Writer)
非纯文本文件,不能用字符流,会导致文件格式破坏,不能正常执行

节点流(FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter.)
低级流:直接跟输入输出源对接

处理流
高级流:建立在低级流的基础上
转换流:InputStreamReader / OutputStreamWriter(字节流转字符流 / 字符流转字节流)
缓冲流:BufferedInputStream / BufferedOutputStream BufferedReader / BufferedReader (可对节点流经行包装,使读写更快)

BIO、NIO、AIO的区别

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

BIO
在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。

NIO
NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。

AIO
与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。

Files常用方法

创建:
createNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false。
mkdir() 在指定位置创建一个单级文件夹。
mkdirs() 在指定位置创建一个多级文件夹。
renameTo(File dest)如果目标文件与源文件是在同一个路径下,那么renameTo的作用是重命名, 如果目标文件与源文件不是在同一个路径下,那么renameTo的作用就是剪切,而且还不能操作文件夹。

删除:
delete() 删除文件或者一个空文件夹,不能删除非空文件夹,马上删除文件,返回一个布尔值。
deleteOnExit()jvm退出时删除文件或者文件夹,用于删除临时文件,无返回值。
判断:
exists() 文件或文件夹是否存在。
isFile() 是否是一个文件,如果不存在,则始终为false。
isDirectory() 是否是一个目录,如果不存在,则始终为false。
isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
获取:
getName() 获取文件或文件夹的名称,不包含上级路径。
getAbsolutePath()获取文件的绝对路径,与文件是否存在没关系
length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。
getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。
lastModified()获取最后一次被修改的时间。

文件夹相关:
static File[] listRoots()列出所有的根目录(Window中就是所有系统的盘符)
list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。
listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。
list(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
listFiles(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。

猜你喜欢

转载自blog.csdn.net/weixin_42103026/article/details/89040943