Java面试问题及答案详解(一)Java基础篇

交互设计

  之前浏览很多各种各样的最新Java面试题目,但是让人蛋疼的是都是满满的套路,只有题目,没有对应的答案详解。想要获取对应的答案还要各种私聊、加QQ群、微信群等。到最后折腾一大圈也不一定能拿到自己想要的东西。所以,闲暇之余,专门抽空整理了下大部分常见面试题目的答案,由简到难,都有。话不多说,先从最开始的Java基础篇搞起!(PS: 部分专业名词介绍来源于网络查阅,花了不少时间整理,觉得有用的小伙伴别吝啬点赞哦。) 1. JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? (1)对于基本数据类型的变量,"=="的作用是判断左右两边的值是否相等 (2)对于引用类型的变量,"=="的作用是判断左右两边所指向的地址是否一样 重点:对于Integer var=?在-128至127之间赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用 == 进行判断,这个区间之外的数据用equals判断 (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返回相同的值。 4. final 在 java 中有什么作用? 在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量) (1)修饰类 当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。 (2)修饰方法 final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。此处需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(注:类的private方法会隐式地被指定为final方法。) (3)修饰变量 final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。 当函数的参数类型声明为final时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变该参数的值。 5. java 中的 Math.round(-1.5) 等于多少? Math.round是向上取整数,所以结果毫无疑问是 -1。 6. String 属于基础的数据类型吗? 不属于。 Java8种基础的数据类型:byte、short、char、int、long、float、double、boolean。 7. java 中操作字符串都有哪些类?它们之间有什么区别? (1)String : final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。 (2)StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。 (3)StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的app、replace、delete等方法修改字符串。 8. String str="i"与 String str=new String(“i”)一样吗? 毫无疑问不一样,因为他们不是同一个对象。 9. 如何将字符串反转? 常用的有两种方式分别是StringBuilder 和 StringBuffer 的reverse 方法。 10. String 类的常用方法都有那些? equales,split,startsWith,sWith,indexOf,substring,length 11. 抽象类必须要有抽象方法吗? 抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。 如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。 抽象类是为了把相同的但不确定的东西的提取出来,为了以后的重用。定义成抽象类的目的,就是为了在子类中实现抽象类。 12. 普通类和抽象类有哪些区别? (1) 抽象类可以没有抽象方法,也可以有普通方法; (2) 抽象方法不能声明为静态,抽象方法只需声明无需实现,没有主体,普通方法有主体; (3) 抽象类的子类必须实现父类的抽象方法,否则该子类也是抽象类; (4) 抽象类可以有构造方法,被继承时子类必须继承父类的一个构造方法; (5) 含有抽象方法的类必须是抽象类; (6) 抽象类不能被实例化; 13. 抽象类能使用 final 修饰吗? 不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。 14. 接口和抽象类有什么区别? 抽象类可以实现代码的复用;抽象类不可以创建实例对象; 有抽象方法的类一定是抽象类,抽象类中的方法可以不是抽象的; (1)抽象类中可以有普通成员变量,接口中没有普通成员变量 (2)抽象类可以有构造方法,接口中不能有构造方法 (3)抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法 (4) 抽象类中可以包含静态方法,接口中不能包含静态方法 (5) 抽象类中的抽象方法的访问类型可以是 public,protected ,但接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型 (6) 一个类可以实现多个接口,但只能继承一个抽象类。 (7) 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只是public static final 类型,并且默认即为 public static final 类型。 15. java 中 IO 流分为几种? 按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色划分为节点流和处理流。 ava Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0流的40多个类都是从如下4个抽象类基类中派生出来的。 •InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。 •OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。 字符流和字节流的区别 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别: 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。 字节流:一次读入或读出是8位二进制。通过字节的形式一个字节一个字节或者字节数组来操作文件中内容,可以操作一切文件。 字符流:一次读入或读出是16位二进制。通过单个字符或者是字符数组的形式来操作文件的,存在一定的局限性,是专门用于对文本文件操作的,默认的版本为GBK 设备上的数据无论是图片或者视频,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。 16. BIO、NIO、AIO 有什么区别? •BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。 •NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它面向缓冲的,基于通道的I/O操作方法。NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都阻塞和非阻塞两种模式。阻塞模式使用就像传统中的一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发 •AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。 17. Files的常用方法都有哪些? (1) 创建功能 public boolean createNewFile() throws IOException 创建新文件 public boolean mkdirs() 创建新的目录,若父目录不存在,会自动创建 public boolean renameTo(File dest) 重命名文件 (2) 判断功能 public boolean isFile() 判断是否是文件 public boolean isDirectory() 判断是否是目录 public boolean exists() 判断文件或者目录是否存在 public boolean canRead() 判断文件是否可读 public boolean canWrite() 判断文件是否可写 public boolean isHidden() 判断文件是否隐藏 (3) 获取功能 public String getAbsolutePath() 获取绝对路径 public String getPath() 获取相对路径 public String getName() 获取文件或目录名 public long length() 获取文件大小(应用例如:用于限制上传文件大小) public long lastModified() 获取文件最后一次修改的时间(单位,毫秒) (4) 高级获取功能 public String[] list() 获取路径表示目录下的所有文件和目录名称 public String[] list(FilenameFilter filter) 获取满足过滤器FilenameFilter条件的所有目录或文件 public File[] listFiles() 获取路径表示目录下的所有文件和目录对象(文件类型) public File[] listFiles(FilenameFilter filter) 获取满足过滤器FilenameFilter条件的所有目录或文件对象(文件类型) 以上,就是准备的第一阶段java基础篇的常见面试问题及答案,后续更高等级的知识点干货慢慢补上,有疑问的小伙伴们可以留言互相交流探讨。

标签: 交互设计