美文网首页
Java最常见面试题-嘿嘿嘿

Java最常见面试题-嘿嘿嘿

作者: healthhappysmoo | 来源:发表于2019-11-24 16:25 被阅读0次

1.JDK 和 JRE 有什么区别?

RE:Java运行环境( Java Runtime Environment)

JDK:Java开发工具包(Java Development Kit)

具体来说:JDK包含了JRE,同时还包含了编译Java源码的编译器javac,还包含了很多Java程序调试和分析的工具;还包含了Java程序编写所需要的文档和demo程序例子。

简单来说:如果你需要运行Java程序,只需要安装JRE就行了,如果你需要编写Java程序,需要安装JDK.

2.==  和  equals 的区别。

①如果是 基本数据类型:== 比较的是基本数据类型的值是否一样。

②如果是 对象: == 比较的是对象的地址 是否一样。

③equals 比较值是否一样。

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

不一定:hashCode()相同,对象不一定相同,所以对象的值不一定相同;所以 equals()比较不一定为true。

如果对象相同,那么他们的HashCode()一定相同。

4.final 关键字的用法

①修饰类:  当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

②修饰方法: final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。

③修饰变量:当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

④final修饰一个成员变量(属性),必须要显示初始化。 

当函数的参数类型声明为final时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变该参数的值。

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

四舍五入的原理是在参数上加上0.5然后向下取整。

所以:Math.round(-1.5)输出-1 ;  Math.round(1.5)输出2.

如下图

6.java 中操作字符串都有哪些类?它们之间有什么区别?                                                                                  String、StringBuffer、StringBuilder:

String : 底层final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。                                                                                                                  StringBuffer : 底层对字符串的操作的方法都加了synchronized,保证线程安全。                                            StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append、replace、delete等方法修改字符串。

所以 StringBuilder 效率比 StringBuffer 高,一般单线程情况下都用 StringBuilder。

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

不一样的原因很简单,因为他们不是同一个对象。

String str="i";

这句话的意思是把“i”这个值在内存中的地址赋给str,如果再有String str3="i";那么这句话的操作也是把“i”这个值在内存中的地址赋给str3,这两个引用的是同一个地址值,他们两个共享同一个内存。

而String str2 = new String("i");

则是将new String("i");的对象地址赋给str2,需要注意的是这句话是新创建了一个对象。如果再有String str4= new String("i");那么相当于又创建了一个新的对象,然后将对象的地址值赋给str4,虽然str2的值和str4的值是相同的,但是他们依然不是同一个对象了。

需要注意的是:String str="i"; 因为String 是final类型的,所以“i”应该是在常量池。

而new String("i");则是新建对象放到堆内存中。

8.如何将字符串反转?

①利用 StringBuffer 或 StringBuilder 的 reverse 成员方法:                                                                       StringBuffer sb = new StringBuffer("abcd");                                                         System.out.println(sb.reverse());                                                                                                                       输出结果:dcba

②利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组,然后将各个字符进行重新拼接:

public static void main(String[] args) {                                                                        String str = "ABCD";                                                                                              String reverse = "";                                                                                                  char[] chars = str.toCharArray();                                                                                 for (int i = chars.length - 1;i >=0;i--){                                                                            reverse += chars[i];                                                                                                            }                                                                                                           System.out.println(reverse); //DCBA                                                                             }

③利用 String 的 CharAt 方法取出字符串中的各个字符:

public static void main(String[] args) {                                                                             String str = "ABCD";                                                                                               String reverse = "";                                                                                                      for (int i = 0;i < str.length();i++){                                                                              reverse = str.charAt(i) + reverse ;                                                                                           }                                                                                                 System.out.println(reverse);                                                                                         }

9.String 类的常用方法都有那些?                                                                                   https://www.cnblogs.com/ABook/p/5527341.html       

①用字符数组value创建一个String对象                                                                  char[] value ={"a","b","c","d"};                                                                               String str = new String(value);//相当于                                                                     String str = newString("abcd")

②用字符数组以x开始的n个字符创建一个String对象                                             char[] value ={"a","b","c","d"};                                                                                String str = new String(value, 1, 2);                                                                              //相当于String str = newString("bc");

③获取字符串某一位置的字符                                                                                String str = new String("43dfzyd");                                                                            char ch = str.charAt(4);//ch = z

④获取字符串的子串                                                                                                    public String substring(int beginIndex)                                                                          //该方法从beginIndex位置起从当前字符串中取出剩余的字符作为一个新的字符串返回。                                                                                                                              public String substring(int beginIndex, intendIndex)                                                      //该方法从beginIndex位置起从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。

⑤ 查找子串在字符串中的位置                                                                                       public int indexOf(String str)                                                                                        //用于查找当前字符串中字符或子串,返回字符串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。                                                                                       public int indexOf(String str, intfromIndex)                                                                   //改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。                      public int lastIndexOf(String str)                                                                                    //该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。              public int lastIndexOf(String str, intfromIndex)                                                              //该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。

⑥字符串中字符的大小写转换                                                                                 String str = new String("JavaStudy");                                                                       String str1 = str.toLowerCase();                                                                               //str1 = "javastudy"                                                                                                  String str2 = str.toUpperCase();                                                                               //str2 = "JAVASTUDY"

⑦字符串两端去空格                                                                                                      String trim()                                                                                                                   //去除字符串两端的空格,中间的空格不变,一般用于登陆注册时                                 eg:                                                                                                                                   String str = " z dali ";                                                                                               String str1 = str.trim();                                                                                                 int a = str.length();//a = 8                                                                                            int b = str1.length();//b = 6                     

⑧将字符串分割成字符串数组         String[] split(String str)                                        String str = "sgs#jkc#eer";                                                                                           String[] str1 = str.split("#");                                                                                           for (int i = 0; i < str1.length; i++) {                                                           System.out.println(str1[i]); //输出结果是sgs jkc eer                                                       }

⑨替换字符串                                                                                                                public String replace(char oldChar, char newChar)                                                        //用字符newChar替换当前字符串中所有的oldChar字符,//并返回一个新的字符串。public String replaceFirst(String regex,String replacement)                                          //该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。                                                                             public String replaceAll(String regex,String replacement)                                           //该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。

10.抽象类必须要有抽象方法吗?抽象方法的特点。

答案:不是必须的

这道题考察的是抽象类的知识:                                                                                   ①抽象类必须有关键字abstract来修饰                                                                         ②抽象类可以不含有抽象方法                                                                                     ③如果一个类包含抽象方法,则该类必须是抽象类                                                     ④抽象方法类可以包含具体(非抽象)方法                                                                 ⑤抽象方法不能被实例化

11.抽象类能使用 final 修饰吗?                       

final关键字不能用来抽象类和接口;                                                                                因为:抽象类和接口不能实例化,需要继承他的子类去实例化,但是如果使用final来修饰了抽象类,那么这个类将不能被继承。 

12.接口和抽象类有什么区别?

a.抽象类和接口都不能直接实例化

b.抽象类要被子类继承,接口要被类实现。

c.接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现

d.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

e.抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

f.抽象类里可以没有抽象方法

g.抽象类可以实现接口

h.如果一个类里有抽象方法,那么这个类只能是抽象类

i.抽象方法要被实现,所以不能是静态的,也不能是私有的。

j.接口可继承接口,并可多继承接口,但类只能单根继承。

13..java 中 IO 流分为几种?

按照流的流向分,可以分为输入流和输出流;

按照操作单元划分,可以划分为字节流和字符流;

•InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

•OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

14.Files的常用方法都有哪些?

Files.exists() 检测文件路径是否存在

File.createFile()创建文件

File.createDirectory()创建文件夹

File.delete() 删除文件或者目录

File.copy() 复制文件

File.move() 移动文件

File.size()查看文件个数

File.read() 读取文件

File.write()写入文件

File.isFile()  是否是一个文件,如果不存在,则始终为false

File.isDirectory()  是否是一个目录,如果不存在,则始终为false

15.BIO、NIO、AIO 有什么区别?

•BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。

•NIO (New I/O): NIO是一种同步非阻塞的I/O模型。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

•AIO (Asynchronous I/O): AIO 也就是 NIO 2。它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。

18.Java容器有哪些?

https://www.jianshu.com/p/fa30a9890cca

数组、List、Set、Map 、Queue、堆、栈

19. Collection 和 Collections 有什么区别?

java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。

Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

20. List、Set、Map 之间的区别是什么?

21. HashMap 和 Hashtable 有什么区别?

hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。

hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。

hashMap允许空键值,而hashTable不允许。

22. 如何决定使用 HashMap 还是 TreeMap?

对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

23. 说一下 HashMap 的实现原理?

HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

24. 说一下 HashSet 的实现原理?

HashSet底层由HashMap实现

HashSet的值存放于HashMap的key上

HashMap的value统一为PRESENT

25. ArrayList 和 LinkedList 的区别是什么?

最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

26. 如何实现数组和 List 之间的转换?

List转换成为数组:调用ArrayList的toArray方法。

数组转换成为List:调用Arrays的asList方法。

27. ArrayList 和 Vector 的区别是什么?

Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。 

ArrayList比Vector快,它因为有同步,不会过载。 

ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

28. Array 和 ArrayList 有何区别?

Array可以容纳基本类型和对象,而ArrayList只能容纳对象。 

Array是指定大小的,而ArrayList大小是固定的。 

Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

29. 在 Queue 中 poll()和 remove()有什么区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

30. 哪些集合类是线程安全的?

vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

statck:堆栈类,先进后出。

hashtable:就比hashmap多了个线程安全。

enumeration:枚举,相当于迭代器。

31. 迭代器 Iterator 是什么?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

32. Iterator 怎么使用?有什么特点?

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

33. Iterator 和 ListIterator 有什么区别?

Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。 

Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。 

ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

相关文章

网友评论

      本文标题:Java最常见面试题-嘿嘿嘿

      本文链接:https://www.haomeiwen.com/subject/nnyruqtx.html