0
点赞
收藏
分享

微信扫一扫

java面试题(记录与分享)(一)

梅梅的时光 2022-03-15 阅读 85

金三银四,正值跳槽旺季,本人在总结的同时也为了进一步对基础知识的巩固,在此奉上亲自总结的面试题,供大家参考!

1、“==”与equals的区别

(1)对象类型不同

  • equals():是超类Object中的方法。
  • ==:是操作符。

(2)比较的对象不同

  • equals():用来检测两个对象是否相等,即两个对象的内容是否相等。
  • ==:用于比较引用和比较基本数据类型时具有不同的功能。

(3)运行速度不同

  • equals():没有==运行速度快。
  • ==:运行速度比equals()快,因为==只是比较引用。

扩展资料:

2、final在java中有什么作用?

(1)用来修饰一个引用

  • 如果引用为基本数据类型,则该引用为常量,该值无法修改;
  • 如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
  • 如果引用时类的成员变量,则必须当场赋值,否则编译会报错。

(2)用来修饰一个方法

当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。

(3)用来修饰类

当用final修改类时,该类成为最终类,无法被继承。

 比如常用的String类就是最终类。

3、String 属于基础的数据类型吗? 

        不属于

        八大基本数据类型:byte、short、char、int、long、double、float、boolean。

4、如何将字符串反转?并去除空格

将对象封装到stringBuilder中,调用reverse()方法反转、trim方法去除首尾空格,replace()方法替换任意字符串的方式去除所有空格

    public static void main(String[] args) {
        String string = " abcd ef  g  ";
        StringBuilder stringBuilder = new StringBuilder(string);
        String s = stringBuilder.reverse().toString();
        String trim = stringBuilder.reverse().toString().trim();
        String replace = stringBuilder.reverse().toString().replace(" ","");
        System.out.println("反转后字符串为:"+s);
        System.out.println("反转字符串去除首尾空格:"+trim);
        System.out.println("反转字符串去除所有空格:"+replace);
    }
}

5、String 类的常用方法都有那些?

equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpty等等。

6、 普通类和抽象类有哪些区别?

  • 抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  • 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
  • 抽象类可以有抽象方法,只需申明,无须实现;
  • 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  • 抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类;
  • 抽象方法不能声明为静态、不能被static、final修饰。

7、抽象类和接口的区别有哪些 

  • 接口使用interface修饰,抽象类使用abstract修饰;
  • 接口不能实例化,抽象类不能被实例化
  • 类可以实现多个接口,抽象类只能单继承
  • 抽象类要被子类继承,接口要被类实现。
  • 接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
  • 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
  • 接口是设计的结果,抽象类是重构的结果。
  • 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
  • 抽象类主要用来抽象类别,接口主要用来抽象功能。

8、java 中 IO 流分为几种? 

(1)按流划分,可以分为输入流和输出流;

  • 输入流: 只能从中读取数据,而不能向其写入数据。
  • 输出流:只能向其写入数据,而不能向其读取数据。

(2)按单位划分,可以分为字节流和字符流

  • 字节流:inputStream、outputStream;
  • 字符流:reader、writer;

9、谈谈final、finally、 finalize有什么不同?

(1)final是用来修饰类,方法,变量,并具有不同的涵义
        修饰类: 代表此类不可以继承扩展
        修饰方法:代表此方法不可以重写
        修饰变量:变量不可以修改
(2)fianlly则是保证Java代码必须被执行的一种机制
        我们使用try-finally或者try-catch-finally来进行类似,常用于一些流的关闭
(3)finalize则是java.lang.Object的一个方法,保证对象在被垃圾收集前完成特定资源的回收,所以称为java GC的阻碍,成为了特等公民,其次,finalize还可以吞掉Throwable,导致程序检查不出错误也无法运行,现在已经被定义为Old方法

10、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

public static void main(String[] args) {
            System.out.println(test());
        }
        public static int test(){
            try{
                int ret =1/0;
                System.out.println("try");
                return 0;
            }catch (Exception e){
                System.out.println("catch");
                return 1;
            }finally {
                System.out.println("finally");
            }
        }

运行结果为:

11、常见的异常类有哪些?

  • NullPointerException:空指针异常;
  • SQLException:数据库相关的异常;
  • IndexOutOfBoundsException:数组下角标越界异常;
  • FileNotFoundException:打开文件失败时抛出;
  • IOException:当发生某种IO异常时抛出;
  • ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常;
  • NoSuchMethodException:无法找到某一方法时,抛出;
  • ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常;
  • NumberFormatException:当试图将字符串转换成数字时,失败了,抛出;
  • IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
  • ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。

12、java 中操作字符串都有哪些类?它们之间有什么区别?

(1)String

        String是不可变对象,每次对String类型的改变时都会生成一个新的对象。

(2)StringBuilder

        线程不安全,效率高,多用于单线程。

(3)StringBuffer

        线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。

        不频繁的字符串操作使用String,操作频繁的情况不建议使用String。

        StringBuilder > StringBuffer > String。

13、在 Java 中,为什么不允许从静态方法中访问非静态变量?

  • 静态变量属于类本身,在类加载的时候就会分配内存,可以通过类名直接访问;
  • 非静态变量属于类的对象,只有在类的对象产生时,才会分配内存,通过类的实例去访问;
  • 静态方法也属于类本身,但是此时没有类的实例,内存中没有非静态变量,所以无法调用。

14、java重载与重写的区别

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现;

重写是父类与子类之间多态性的一种表现;

重载可以理解成多态的具体表现形式;

15、byte类型127+1等于多少 

 16、Java 容器都有哪些?

  • JAVA的容器包括如下

        List,Map,Set ,Collection ,LinkedList ,ArrayList ,Vector ,Stack ,Set
        Map ,Hashtable ,HashMap ,WeakHashMap

  • 数据容器主要分为了两类:

        Collection: 存放独立元素的序列。
        Map:存放key-value型的元素对。(这对于需要利用key查找value的程序十分的重要!)

17、Collection 和 Collections 有什么区别?

  • Collection是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式。它提供了对集合对象进行基本操作的通用接口方法

  • Collections 是一个包装类。它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

18、list与Set区别  

(1)list可以允许重复对象和插入多个null值,而set只允许插入一个null元素;

(2)list容器是有序的,而set容器是无序的;

(3)Set和List增删查对比

        Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 
        List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

19、HashMap 和 Hashtable 有什么区别?

  • HashMap是线程不安全的,HashTable是线程安全的;
  • HashMap中允许键和值为null,HashTable不允许;
  • HashMap的默认容器是16,为2倍扩容,HashTable默认是11,为2倍+1扩容;

 20、说一下 HashSet 的实现原理?

HashSet实际上是一个HashMap实例,数据存储结构都是数组+链表。

HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value都是一个统一的对象PRESENT。

private static final Object PRESENT = new Object();
HashSet中add方法调用的是底层HashMap中的put方法,put方法要判断插入值是否存在,而HashSet的add方法,首先判断元素是否存在,如果存在则插入,如果不存在则不插入,这样就保证了HashSet中不存在重复值。

 通过对象的hashCode和equals方法保证对象的唯一性。

21、ArrayList 和 LinkedList 的区别是什么?

  • ArrayList是动态数组的数据结构实现,查找和遍历的效率较高;
  • LinkedList 是双向链表的数据结构,增加和删除的效率较高;

22、哪些集合类是线程安全的

  • Vector:就比Arraylist多了个同步化机制(线程安全)。
  • Stack:栈,也是线程安全的,继承于Vector。
  • Hashtable:就比Hashmap多了个线程安全。
  • java.util.concurrent 包下所有的集合类 ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque...

23、队列和栈是什么?

栈:

(1)栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。(如下图)

 队列:

(2)队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。(如下图)

 

24、队列和栈有什么区别?

(1)队列先进先出,栈先进后出。

(2)遍历数据速度不同。

栈只能从头部取数据 也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性;

队列则不同,他基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多。

 

25、堆和栈有什么区别?

(1)空间分配

        ①栈:由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

        ②堆: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。

(2)缓存方式

        ①栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

        ②堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

(3)数据结构

        ①堆:堆可以被看成是一棵树,如:堆排序。

        ②栈:一种先进后出的数据结构。

如有错误请指出,后面还会继续更新,如果觉得不错就加个关注吧!

举报

相关推荐

0 条评论