JAVA基础常见的面试题

第一题 jdk,jre,jdk有什么区别
    JDK(Java Development Kit):指的是Java开发工具集。JDK是整个Java的核心,包括了Java基础类库、Java运行环境(JRE)和Java开发工具。是做Java开发必须要安装的。

       JRE(Java Runtime Environment):指的是Java运行时环境。Java程序运行时必需要JRE的支持。如果系统只安装JRE的话,则意味着系统可以跑任何Java程序,但不能做Java开发。

        JVM (Java Virtual Machine):就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序首先被编译为.class文件,这种类文件可以在虚拟机上运行,也就是说class并不直接与机器的操作系统相对应。而是经过虚拟机间接的与操作系统交互,由虚拟机将程序解释给本地系统执行,只有jvm还不能将class执行,因为在解释class的时候jvm需要调用解释所需要的类库lib,而jre包含lib类库,jvm屏蔽了具体操作系统平台的相关信息,使得java程序只需要生成在java虚拟机上运行的目标代码。可以在多种平台(操作系统)上不加修改的运行。

        如果你只是为了运行一下 Java 程序的话,那么你只需要安装 JRE 就可以了。如果你需要进行一些 Java 编程方面的工作,那么你就需要安装JDK了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何Java开发,仍然需要安装JDK。例如,如果要使用JSP部署Web应用程序,那么从技术上讲,您只是在应用程序服务器中运行Java程序。那你为什么需要JDK呢?因为应用程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译 servlet。

第二题 ==和equals的区别
1.  ”==“
1)"=="如果比较的是基本数据类型(byte short char boolean int long double float),对比的是值,因此是相等的,
例如       int num1 = 34;   int num2 = 34;  System.out.println("num1 == num2: "+(num1 == num2));  num1 == num2: true
   2)如果比较的是对象则对比的是对象的地址值,
例如     String s1 = new String("hello");     String s2 = new String("hello");  System.out.println("s1 == s2: "+(s1 == s2));  s1 == s2: false
2.equals
1)对于字符串常量来说,equals比较的是对象两边的内容,如果内容相同则返回true
例如     String s1 = new String("hello");     String s2 = new String("hello");  System.out.println("s1 == s2: "+(s1 == s2)); s1.equals(s2): true
2)如果比较的是非字符型变量,equals比较的是内存的首地址值,此时和"=="是一样的,既比较两边指向的是不是同一个对象
二、equals和hashCode的区别
在java中任何一个对象都具有equals和hashCode两种方法,因为它们都是在Object类中定义的,equals用来判断两个对象是否相同,如果相同则返回true,如果不相同则返回false。hashCode则是返回一个int数值,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。
总结:
1.hashCode是为了提高散结构存储中查找的效率,在线性表表中没有作用
2.若要重写,equals和hashCode需要同时覆盖
3.若equals为true,则hashCode一定相等
4.若equal返回值为false,hashCode不一定不相等
5.如hashCode相等,equals不一定为true
6.若hashCode不相等,则equals一定不相等
7.同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露。

第三题  final在java中有什么作用
1.锁定这个方法,防止任何继承类修改它的含义;
2.提高效率:在方法前面添加final进行修饰可以提高效率,其原理是基于内联/内嵌(inline)机制,它会使你在调用final方法时,直接将方法的主体插入到调用处,从而省去调用函数所花费的开销。但是如果方法过于庞大或者其中有循环的话,这种提高效率的方法可能会失效。
3.当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。

第四题   java中操作字符串都有哪些类,他们之间有什么区别?
String
StringBuffer
StringBuilder
区别:在StringBuffer类中的方法绝大部分都加了synchronized关键字,而StringBuilder类中则没有,所以说StringBuffer类是线程安全的,而StringBuilder则不是线程安全的.如图 png
这三个类都是以char[]的形式保存的字符串,不同的是String类型的数组长度是3,而另外两个数组的长度都是19且默认值为0.但是String类型的字符串是不可变的,对String类型的字符串做修改操作都是相当于重新创建对象.而对StringBuffer和StringBuilder进行增删操作都是对同一个对象操作.StringBuffer中的方法大部分都使用synchronized关键字修饰,所以StringBuffer是线程安全的,StringBuilder中的方法则没有,线程不安全,但是StringBuilder因为没有使用使用synchronized关键字修饰,所以性能更高,在单线程环境下我会选择使用StringBuilder,多线程环境下使用StringBuffer.如果声明的这个字符串几乎不做修改操作,那么我就直接使用String,因为不调用new关键字声明String类型的变量的话它不会在堆内存中创建对象,直接指向String的常量池,并且可以复用.效率更高. 

 第五题   Java中String类的几个常用方法?
(1)public String toString()  字符串本身就是字符串,返回本身。
(2)public char charAt(int index)  用于查找字符串中下标为index的字符,返回一个字符。
(3)public int compareTo(String anotherString)   按照字典顺序比较两个字符串大小。返回0表示两个字符串的值相同。如果不相同,返回两个字符串的第一位不相同字符的ASCII之差。如果是包含关系的话,返回长度之差。例如:"abc"比较"abcsdads"等于-5,"bcdghk"比较"bcd"等于3。
(4)public boolean contains(CharSequence s)  判断前面的字符串是否包含后面字的字符串。
(5)public boolean startsWith(String prefix)  判断当前字符串是否以prefix字符串开头。
        public boolean endsWith(String suffix)   判断当前字符串是否以suffix字符串开结尾。
(6)public boolean equals(Object anObject)  判断当前字符串内容是否与后面字符串内容相同。注意:比较两个字符串内容是否相等不能使用“==”。(7)public boolean equalsIgnoreCase(String anotherString)  忽略大小写,判断当前字符串内容是否与后面字符串内容相同。
(8)public byte[] getBytes()  将字符串转成byte[]数组。
(9)public int indexOf(String str)  返回某个子字符串在当前字符串中第一次出现的下标,没有就返回-1。
        public int lastIndexOf(String str)  返回某个子字符串在当前字符串中最后一次出现的下标,没有就返回-1。
(10)public boolean isEmpty()  判断某个字符串是否为空字符串,已经实例化了,也就是字符串的长度是否为0。
(11)public int length()    返回当前字符串的长度。
(12)public String replace(CharSequence target, CharSequence replacement)  将当前字符串当中的所有target字符串换成replacement字符串。
(13)public String[] split(String regex)  将当前字符串以regex字符串隔开,隔开后的片段以String[]形式返回。
(14)public String substring(int beginIndex, int endIndex) 在当前字符串中,从beginIndex开始截取,截取到endIndex的新字符串,返回新字符串。注意:beginIndex是包括的,endIndex是不包括的。  左闭右开:[beginIndex, endIndex) 或 [beginIndex, endIndex-1]。
(15)public char[] toCharArray()  将字符串转换成char[]数组,并返回。
(16)public String toLowerCase()将字符串全都转换成小写字母。
          public String toUpperCase()将字符串全都转换成大写字母。
(17)public String trim()   去除字符串前后的空格。
(18)public static String valueOf(Object obj)   String类当中的一个静态方法,可以将任何类型转换成字符串,包括基本类型,引用类型。

第六题   一.抽象类必须要有抽象方法吗?
答案是:不必须
  1.抽象类必须有关键字abstract来修饰。
  2.抽象类可以不含有抽象方法
  3.如果一个类包含抽象方法,则该类必须是抽象类
二.Java 普通类和抽象类的区别
普通类:不含抽象放方法,可以直接实例化。
抽象类:包含抽象方法, 不能直接实例化。
三.抽象类能用final修饰吗?
不能,抽象类要子类继承然后实现内部方法的。但是final修饰的类不能再被继承和修改。
四.接口和抽象类的区别是什么?
1.接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
2.接口中的实例变量默认是 final 类型的,而抽象类中则不一定。
3.一个类可以实现多个接口,但最多只能实现一个抽象类。
4.一个类实现接口的话要实现接口的所有方法,而抽象类不一定。
5.接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象。从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
备注:在JDK1.8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然会报错。

第七题    java 中 IO 流分为几种?
1.按照流的流向分,可以分为输入流和输出流;
2.按照操作单元划分,可以划分为字节流和字符流;
3.按照流的角色划分为节点流和处理流。
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

1.同步:使用同步IO时,Java自己处理IO读写。
2.异步:使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,完成后OS通知Java处理(回调)。
3.阻塞:使用阻塞IO时,Java调用会一直阻塞到读写完成才返回。
4.非阻塞:使用非阻塞IO时,如果不能立马读写,Java调用会马上返回,当IO事件分发器通知可读写时在进行读写,不断循环直到读写完成。
BIO:
同步并阻塞,服务器的实现模式是一个连接一个线程,这样的模式很明显的一个缺陷是:由于客户端连接数与服务器线程数成正比关系,可能造成不必要的线程开销,严重的还将导致服务器内存溢出。当然,这种情况可以通过线程池机制改善,但并不能从本质上消除这个弊端。
NIO:
在JDK1.4以前,Java的IO模型一直是BIO,但从JDK1.4开始,JDK引入的新的IO模型NIO,它是同步非阻塞的。而服务器的实现模式是多个请求一个线程,即请求会注册到多路复用器Selector上,多路复用器轮询到连接有IO请求时才启动一个线程处理。
AIO:
JDK1.7发布了NIO2.0,这就是真正意义上的异步非阻塞,服务器的实现模式为多个有效请求一个线程,客户端的IO请求都是由OS先完成再通知服务器应用去启动线程处理(回调)。
应用场景:并发连接数不多时采用BIO,因为它编程和调试都非常简单,但如果涉及到高并发的情况,应选择NIO或AIO,更好的建议是采用成熟的网络通信框架Netty。

第八题    Files类的常用方法
1.Files.exists() 检查文件路径是否存在
2.Files.createFile() 创建文件
3.Files.createDirectory() 创建文件夹
4.Files.delete() 删除一个文件或者目录
5.Files.copy()复制文件
6.Files.move() 移动文件
7.Files.size() 查看文件个数

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值