1、JDK 和 JRE 有什么区别?
JDK:Java Development Kit,Java开发工具包,提供了Java开发和运行的环境。
JRE:Java Runtime Environment,Java运行环境,提供Java运行所需要的环境。
注意:JDK里面包含JRE,同时还包含java编译工具以及各种调试工具。简单来说,如果你要运行Java程序,只需要安装JRE就可以了;如果要开发Java应用程序,就要安装JDK。
2、== 和 equals 区别是什么?
关于“==”:
1、基本数据类型比较,比较的是值是否相等。
2、引用数据类型比较,比较的是引用地址是否相等。
关于“equals”:
1、equals本来就是“==”,在Object中,equals就是值比较。
2、比如String、Integer等类中重写了equals方法,就是值比较。
3、两个对象的hashCode相同,equals结果一定是true吗?
Java中hashCode的生成方式:给每一个对象生成数字,特点如下:相同的文本总会生成相同的数字,但是不同的文本也可能生成相同的数字(概率很低)。
案例如下:
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月12日 14:53
*
* 两个对象的 hashCode 相同,equals 一定为 true,对吗?
* 不对,不一样的对象也存在生成相同hashCode的概率。
*/
public class HashCode {
public static void main(String[] args) {
String s1="通话";
String s2="重地";
System.out.println("s1.hashCode() = " + s1.hashCode());
System.out.println("s2.hashCode() = " + s2.hashCode());
System.out.println(s1.equals(s2));//false
}
}
运行截图:
4、final在Java中有什么作用?
1、final 修饰的类就叫做最终类,被 final 修饰的类不能被继承。
2、final修饰的方法不能被重写。
3、final修饰的变量叫做常量,常量必须初始化,初始化之后,值不可以修改。
5、Java中Math.round(-1.5)等于多少?
round()是Math类中的一个四舍五入的方法,round()方法在实现四舍五入的时候实际上是不论正负的,它会先将这个数加上0.5然后在像下取整。
-1.5+0.5=-1.0,然后-1.0向下取整结果为-1,最后的结果就是-1
运行截图:
6、String属于基本数据类型吗?
Java中String是引用数据类型。
Java中8大基本数据类型: 整数型:byte、short、int、Long;浮点型:Double,float
字符型:char ;布尔型:boolean
引用数据类型:数组、接口、对象。
String创建对象的两种方法:
1、直接赋值:String str3 = “abc”;2、new赋值:String str1 = new String(“abc”);
7、Java中可操作的字符串有哪些?他们之间有什么区别?
1、String不可变的对象,每次操作都会生成新的String对象,然后指针指向新的String对象。
2、StringBuffer、StringBuilder为可变字符串,如果字符串需要频繁修改,使用这两个。其中StringBuffer线程安全,性能略差;StringBuilder线程不安全,性能较好。
8、String str="i"与String str=new String("i")一样吗?
不一样,主要是内存分配方式不一样,前者JVM会将其分配到常量池里面,后者是生成一个普通的对象,对象保存在堆里面。
9、如何实现字符串的反转。
1、使用StringBuilder/StringBuffer里面的reserve方法。
2、将字符串存到数组里面,倒着遍历一遍。
10、String类常见的方法有哪些?
indexOf:找到指定字符串的索引(下标);
charAt:给定索引,返回对应字符。
replace:替换字符串中字符。
length:获取字符串的长度。
toLowerCase:转小写。
toUpperCase:转大写。
substring:字符串截取。
equals:字符串比较。
trim:去前后空格。
getBytes:获取字符串对象中的bytes数组。
PS:getBytes获取字符串中的对象,返回的是一个byte类型字节数组,此方法多用在字节流中,用与将字符串转换为字节。
演示源代码如下:
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月12日 15:37
*/
public class StringMethod {
public static void main(String[] args) {
String str=" IloveJava ";
//indexOf:获取指定字符串索引(下标)
System.out.println("str.indexOf(\"I\") = " + str.indexOf("I"));
//charAt:给定索引(下标),返回对应字符。
System.out.println("str.charAt(1) = " + str.charAt(1));
//replace:替换字符串中字符。
System.out.println("str.replace(\"I\",\"U\") = " + str.replace("I", "U"));
//length:获取字符串长度
System.out.println("str.length() = " + str.length());
//toLowerCase:转小写
System.out.println("str.toLowerCase() = " + str.toLowerCase());
//toUpperCase:转大写
System.out.println("str.toUpperCase() = " + str.toUpperCase());
//substring:字符串截取(下标0-2之间的“I”)
System.out.println("str.substring(0,1) = " + str.substring(0, 2));
//equals:字符串比较
System.out.println("str.equals(\" IloveJava \") = " + str.equals(" IloveJava "));
//trim:去除前后空格
System.out.println("str.trim() = " + str.trim()+" str去除空格后的字符串长度是:"+str.trim().length());
//getBytes获取字符串中的对象,返回的是一个byte类型字节数组,此方法多用在字节流中,用与将字符串转换为字节。
byte[] arr=str.getBytes();
System.out.println("字符串转成byte类型数组的打印结果:");
//遍历打印数据元素,用空格分开。
for (byte b : arr) {
System.out.print(b+" ");
}
}
}
程序运行截图:
11、抽象类必须要有抽象方法吗?
不需要,抽象类里面可以有抽象方法和普通方法,不是必须要有。
总结:抽象方法一定要在抽象类里面,抽象类里面不一定有抽象方法。
12、普通类和抽象类的区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法。
普通类可以直接实例化对象,抽象类不能直接new对象,可以通过多态来创建对象。
抽象子类需要实现抽象父类中定义的抽象方法,除非子类也是抽象类,可以不用实现。
13、抽象类能使用final来修饰吗?
因为抽象类创建是被用来继承的,添加final后此类不能被其他类继承,所以抽象类不能被final修饰。
14、接口和抽象类的区别?
子类实现方式:extends继承抽象类;implements实现接口。
构造函数:抽象类中可以有构造方法,接口中不能有构造方法。
实现数量:一个类可以实现多个接口,但是只能继承一个类。
15、Java中IO流分为哪几类?
按功能分:输入流input/输出流output。
按类型分:字节流XXXStream/字符流XXXReader、XXXWriter。
按角色分:字节流、处理流。
字节是8位传输,以字节为单位输入输出数据;字符是16位,以字符位数输入输出数据。
16、Java中的容器有哪些?
17、Collection和Collections有什么区别?
Collection:集合接口,提供了所有集合的通用操作,所有的集合都是Collection的子类,比如List\Set。
Collections:集合的工具类,用来操作集合,里面有很多静态方法,这些静态方法可以直接使用。
大家平常所见的两种类:XXX,XXXs,一般来说,后者都是前者的工具类:
-
Array 和 Arrays
-
File 和 Files
-
关于Collections的一些常用方法我这边再帮同学们回顾一下。
-
import java.util.*; /** * @author 小河子~ * @VX xiaohe66i * @date 2021年06月12日 20:38 * * Collections:集合的工具类,用来操作集合,里面有很多静态方法,这些静态方法可以直接使用。 */ public class CollectionsDemo { public static void main(String[] args) { List<Integer>list=new ArrayList<>(); list.add(20); list.add(5); list.add(12); list.add(1); //sort排序 System.out.println("list集合排序前" + list.toString()); Collections.sort(list); System.out.println("list集合排序后 " + list.toString()); //binarySearch二分查找 int i=Collections.binarySearch(list,1); System.out.println("数字1的下标是:"+i); //copy List<Integer>dest=new ArrayList<>(); //根据list集合的大小给dest集合增加容量 for (int j = 0; j < list.size(); j++) { dest.add(0); } System.out.println("dest集合复制前为:" + dest.toString()); //复制list集合的元素到集合dest中 Collections.copy(dest,list); System.out.println("dest集合复制后元素为: " + dest.toString()); //reserve反转 Collections.reverse(list); System.out.println("list集合反转后为:" + list.toString()); //shuffle打乱 Collections.shuffle(list); System.out.println("list集合打乱后为:" + list); //list转为数组 System.out.println("-------集合转成数组 -----"); Integer[]arr=list.toArray(new Integer[list.size()]); //方法1:打印数组 System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr)); //方法2:打印数组 System.out.print("Arrays.toString(arr) = " ); for (Integer integer : arr) { System.out.print(integer+" "); } //数组转为集合 System.out.println(); System.out.println("-------数组转成集合 -----"); String[]names={"张三","李四","王五"}; List<String>nameList=Arrays.asList(names); //数组转成的集合是一个受限集合,不能添加和删除元素,添加或者删除会报“UnsupportedOperationException"异常 //nameList.add("赵六"); //nameList.remove(0); System.out.println("nameList字符集合为: " + nameList); //基本数据类型转为集合的时候,需要修改为包装类型 Integer[]nums={100,200,300}; List<Integer>list3= Arrays.asList(nums); System.out.println("list3数字集合为: " + list3); } }
代码运行截图:
-
注意:Arrays.asList生成的集合是一个受限集合,不能添加和删除元素,添加或者删除元素会报“UnsupportedOperationException"异常。
18、List、Set、Map 之间的区别是什么?
19、HashMap 和 HashTable 有什么区别?
存储:HashMap的key和Value允许为null,HashTable里面不允许为空。
线程安全:HashMap线程不安全,性能高;Hashtable线程安全,性能低。
PS:HashTable是一个保留类,不再建议使用,如果单线程环境建议使用HashMap,多线程建议使用ConcurrentHashMap。
20、如何决定使用HashMap还是TreeMap
1、频繁插入、删除、查找、使用HashMap。
2、如果存储的元素有序,使用TreeMap。(实现了SortedMap接口(Map的子接口),可以对key自动排序,Key需实现Comparable接口。)
21、ArrayList 和 LinkedList 区别是什么?
底层结构:ArrayList底层是数组,LinkedList底层是双向链表。
随机访问:ArrayList随机访问效率高,LinkedList随机访问效率低。(因为ArrayList数组可以直接取出元素,而LinkedList是链表,每次访问需要遍历。)
插入和删除效率:ArrayList效率低,LinkedList效率高。(ArrayList底层是数组,插入和删除都会设计要移动其他元素,LinkedList是一个链表,只要修改以下对象的引用就可以实现插入和删除。)
PS:频繁读取,使用ArrayList,频繁修改就用LinkedList。
22、实现数组和List之间的转换?
使用Arrays.asList( );
String[] arrs = new String[]{"red", "blue", "yellow"};
//数组转集合
List<String> list = Arrays.asList(arrs);
//集合转数组
Object[] arr = list.toArray();
23、ArayList和Vector的区别是什么?
ArrayList线程不安全(效率高),Vector线程安全(效率低)。
动态调整时的区别:Vector 扩容时每次会增加一倍,ArrayList 扩容时,每次增加 50%。(假设两者初识容量都是 10,当存储不下的时候,Vector 会将数组扩容,新的数组长度为 20,ArrayList 也会扩容,新的数组长度为 15.)
24、Array和ArrayList的区别?
1、Array可以存储对象和集合类型,ArrayList只能存储对象。
2、Array是大小固定,ArrayList可以自动扩容。
3、ArrayList可以存储异构对象,而Array只能存储相同数据类型的数据。
25、Queue中的poll和remove方法有什么区别?
相同点:都是返回并移除Queue中的第一个元素。
不同点:如果没有元素,poll方法会返回null,remove方法会抛出NoSuchElementException 异常。
推展:队列是一个典型的先进先出(FIFO)的容器。即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的。
1、offer()和add()的区别
add()和offer()都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。
2、peek()和element()的区别
peek()和element()都将在不移除的情况下返回队头,但是peek()方法在队列为空时返回null,调用element()方法会抛出NoSuchElementException异常。
3、poll()和remove()的区别
poll()和remove()都将移除并且返回队头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。
26、哪些集合类是安全的?
-
Vector、Stack、HashTable。
JDK1.5 之后提供的并发相关的类都在 java.util.concurrent 包下面。
27、迭代器Iterator怎么使用,有什么特点?
Iterator 是一个接口,提供了遍历任何集合的方式,一般来说,我们可以直接从集合中去获取迭代器。
28、Iterator怎么使用,有什么特点?
演示代码如下:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月14日 14:40
* Iterator迭代器的使用
*/
public class IterarorTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
//声明一个迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String next=iterator.next();
System.out.println("next = " + next);
}
}
}
运行截图:
PS:使用迭代器可以确保数据安全,在当前遍历的集合被修改时,会主动抛出异常(一旦获取迭代器之后,集合就不能被修改了)。
29、Iterator和ListIterator有什么区别?
-
Iterator 可以遍历 Set 和 List,而 ListIterator 就只能遍历 List。
-
Iterator 只能单向遍历(只能向后遍历),ListIterator 可以向前遍历,也可以向后遍历,它是双向的。
-
ListIterator是Iterator的子类,功能相对更加丰富一些。
30、怎么确保一个集合不能被修改?
有三个方法可以将一个集合改为不可以被修改的集合:
-
Collections.unmodifiableList(list)
-
Collections.unmodifiableMap()
-
Collections.unmodifiableCollection()
31、并行和并发有什么区别?
-
并行:多个处理器或者是多核处理器同时处理多个任务。
-
并发:多个任务在同一个CPU核上。
32、进程和线程有什么区别?
一个程序启动后至少有一个进程,一个进程里边至少有一个线程,一个进程里边也可以有多个线程来提高程序的运行速度。
比如:一个QQ是一个进程,QQ里面有多个任务,就是多个线程。
33、什么是守护线程?
-
守护线程是一个运行在后台的特殊进程,他独立于当前的应用程序,而且可以周期性的执行某种任务或者等待某种事件的发生。
-
Java 中的垃圾回收机制(GC)就是特殊的守护线程。
34、创建线程有哪几种方式?
-
继承 Thread 类重写 run 方法。
-
实现 Runnable 接口并实现 run 方法。
-
实现 Callable 接口并实现 run 方法。
好了,兄弟们今天就更新到这里了,明天有时间会继续更新,每天进步一点点,欢迎感兴趣的小伙伴一起前来交流、学习~