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接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
网友评论