Java SE常见面试基础知识,持续补充ing~

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 方法。

 

 

 

 

 

好了,兄弟们今天就更新到这里了,明天有时间会继续更新,每天进步一点点,欢迎感兴趣的小伙伴一起前来交流、学习~

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值