40道Java基础常见面试题及详细答案

最近看到网上流传着各种面试经验及面试题,往往都是一大堆技术题目贴上去,但是没有答案。

为此我业余时间整理了40道Java基础常见的面试题及详细答案,望各路大牛发现不对的地方不吝赐教,留言即可。

  1. 八种基本数据类型的大小,以及他们的封装类
  2. 引用数据类型
  3. Switch能否用string做参数
  4. equals与==的区别
  5. 自动装箱,常量池
  6. Object有哪些公用方法
  7. Java的四种引用,强弱软虚,用到的场景
  8. Hashcode的作用
  9. HashMap的hashcode的作用
  10. 为什么重载hashCode方法?
  11. ArrayList、LinkedList、Vector的区别
  12. String、StringBuffer与StringBuilder的区别
  13. Map、Set、List、Queue、Stack的特点与用法
  14. HashMap和HashTable的区别
  15. JDK7与JDK8中HashMap的实现
  16. HashMap和ConcurrentHashMap的区别,HashMap的底层源码
  17. ConcurrentHashMap能完全替代HashTable吗
  18. 为什么HashMap是线程不安全的
  19. 如何线程安全的使用HashMap
  20. 多并发情况下HashMap是否还会产生死循环
  21. TreeMap、HashMap、LindedHashMap的区别
  22. Collection包结构,与Collections的区别
  23. try?catch?finally,try里有return,finally还执行么
  24. Excption与Error包结构,OOM你遇到过哪些情况,SOF你遇到过哪些情况
  25. Java(OOP)面向对象的三个特征与含义
  26. Override和Overload的含义去区别
  27. Interface与abstract类的区别
  28. Static?class?与non?static?class的区别
  29. java多态的实现原理
  30. foreach与正常for循环效率对比
  31. Java?IO与NIO
  32. java反射的作用于原理
  33. 泛型常用特点
  34. 解析XML的几种方式的原理与特点:DOM、SAX
  35. Java1.7与1.8,1.9,10 新特性
  36. 设计模式:单例、工厂、适配器、责任链、观察者等等
  37. JNI的使用
  38. AOP是什么
  39. OOP是什么
  40. AOP与OOP的区别

八种基本数据类型的大小,以及他们的封装类

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

封装类分别是:Integer、Short、Float、Double、Long、Boolean、Byte、Character。

引用数据类型

引用数据类型是由类的编辑器定义的,他们是用于访问对象的。这些变量被定义为不可更改的特定类型。

例如:Employee, Puppy 等等

  • 类对象和数组变量就是这种引用数据类型。
  • 任何引用数据类型的默认值都为空。
  • 一个引用数据类型可以被用于任何声明类型和兼容类型的对象。

Switch能否用string做参数

jdk7之前 switch 只能支持 byte、short、char、int 这几个基本数据类型和其对应的封装类型。

switch后面的括号里面只能放int类型的值,但由于byte,short,char类型,它们会?自动?转换为int类型(精精度小的向大的转化),所以它们也支持

jdk1.7后 整形,枚举类型,字符串都可以。

原理

1

2

3

4

5

6

7

8

9

10

11

switch (expression)  // 括号里是一个表达式,结果是个整数{

  case constant1:   // case 后面的标号,也是个整数

     group of statements 1;

     break;

  case constant2:

     group of statements 2;

     break;

  ...

  default:

     default group of statements

}

jdk1.7后,整形,枚举类,字符串都可以。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class TestString {

    static String string = "123";

    public static void main(String[] args) {

        switch (string) {

        case "123":

            System.out.println("123");

            break;

        case "abc":

            System.out.println("abc");

            break;

        default:

            System.out.println("defauls");

            break;

        }

    }

}

为什么jdk1.7后又可以用string类型作为switch参数呢?

其实,jdk1.7并没有新的指令来处理switch string,而是通过调用switch中string.hashCode,将string转换为int从而进行判断

equals与==的区别

使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。

1、==是判断两个变量或实例是不是指向同一个内存空间。 equals是判断两个变量或实例所指向的内存空间的值是不是相同。

2、==是指对内存地址进行比较。 equals()是对字符串的内容进行比较。

3、==指引用是否相同。 equals()指的是值是否相同。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public static void main(String[] args) {

        String a = new String("ab"); // a 为一个引用

        String b = new String("ab"); // b为另一个引用,对象的内容一样

        String aa = "ab"// 放在常量池中

        String bb = "ab"// 从常量池中查找

        System.out.println(aa == bb); // true

        System.out.println(a == b); // false,非同一对象

        System.out.println(a.equals(b)); // true

        System.out.println(42 == 42.0);  // true

    }

public static void main(String[] args) {

    Object obj1 = new Object();

    Object obj2 = new Object();

    System.out.println(obj1.equals(obj2));//false

    System.out.println(obj1==obj2);//false

    obj1=obj2;

    System.out.println(obj1==obj2);//true

    System.out.println(obj2==obj1);//true

}

自动装箱,常量池

自动装箱 在jdk?1.5之前,如果你想要定义一个value为100的Integer对象,则需要如下定义:

1

2

3

4

5

6

Integer i = new Integer(100);

int intNum1 = 100//普通变量

Integer intNum2 = intNum1; //自动装箱

int intNum3 = intNum2; //自动拆箱

Integer intNum4 = 100//自动装箱

上面的代码中,intNum2为一个Integer类型的实例,intNum1为Java中的基础数据类型,将intNum1赋值给intNum2便是自动装箱;而将intNum2赋值给intNum3则是自动拆箱。

八种基本数据类型: boolean byte char shrot int long float double ,所生成的变量相当于常量。

基本类型包装类:Boolean Byte Character Short Integer Long Float Double。

自动拆箱和自动装箱定义:

自动装箱是将一个java定义的基本数据类型赋值给相应封装类的变量。 拆箱与装箱是相反的操作,自动拆箱则是将一个封装类的变量赋值给相应基本数据类型的变量。

Object有哪些公用方法

Object是所有类的父类,任何类都默认继承Object

clone 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

equals 在Object中与==是一样的,子类一般需要重写该方法。

hashCode 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

getClass final方法,获得运行时类型

wait 使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。 wait() 方法一直等待,直到获得锁或者被中断。 wait(long timeout) 设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生

1、其他线程调用了该对象的notify方法。 2、其他线程调用了该对象的notifyAll方法。 3、其他线程调用了interrupt中断该线程。 4、时间间隔到了。 5、此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

notify 唤醒在该对象上等待的某个线程。

notifyAll 唤醒在该对象上等待的所有线程。

toString 转换成字符串,一般子类都有重写,否则打印句柄。

Java的四种引用,强弱软虚,用到的场景

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

1、强引用

最普遍的一种引用方式,如String s = "abc",变量s就是字符串“abc”的强引用,只要强引用存在,则垃圾回收器就不会回收这个对象。

2、软引用(SoftReference)

用于描述还有用但非必须的对象,如果内存足够,不回收,如果内存不足,则回收。一般用于实现内存敏感的高速缓存,软引用可以和引用队列ReferenceQueue联合使用,如果软引用的对象被垃圾回收,JVM就会把这个软引用加入到与之关联的引用队列中。

3、弱引用(WeakReference)

弱引用和软引用大致相同,弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

4、虚引用(PhantomReference)

就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 虚引用主要用来跟踪对象被垃圾回收器回收的活动。

虚引用与软引用和弱引用的一个区别在于:

虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

Hashcode的作用

http://blog.csdn.net/seu_calvin/article/details/52094115

1、HashCode的特性

(1)HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode经常用于确定对象的存储地址

(2)如果两个对象相同,?equals方法一定返回true,并且这两个对象的HashCode一定相同

(3)两个对象的HashCode相同,并不一定表示两个对象就相同,即equals()不一定为true,只能够说明这两个对象在一个散列存储结构中。

(4)如果对象的equals方法被重写,那么对象的HashCode也尽量重写

2、HashCode作用

Java中的集合有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复

equals方法可用于保证元素不重复,但如果每增加一个元素就检查一次,若集合中现在已经有1000个元素,那么第1001个元素加入集合时,就要调用1000次equals方法。这显然会大大降低效率。?于是,Java采用了哈希表的原理

哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。

这样一来,当集合要添加新的元素时,先调用这个元素的HashCode方法,就一下子能定位到它应该放置的物理位置上

(1)如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了。

(2)如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了。

(3)不相同的话,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同HashCode的对象放到这个单链表上去,串在一起(很少出现)。

这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

如何理解HashCode的作用:

从Object角度看,JVM每new一个Object,它都会将这个Object丢到一个Ha

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java开发常见面试题面试中经常会被问到的问题。这些问题通常涵盖Java语言基础知识、面向对象编程、集合框架、多线程、异常处理、IO操作、数据库等方面。以下是一些可能被问到的Java开发常见面试题的例子: 1. 什么是Java虚拟机(JVM)?它的作用是什么? 2. 什么是面向对象编程(OOP)?Java中的类和对象有什么区别? 3. Java中的集合框架有哪些?分别介绍一下它们的特点和用途。 4. 什么是多线程?Java中如何创建和管理线程?如何实现线程间的通信? 5. 什么是异常处理?Java中的异常分类是什么?如何处理异常? 6. Java中的IO操作有哪些?分别介绍一下它们的特点和用途。 7. 如何连接和操作数据库?介绍一下JDBC的基本用法。 8. 什么是Java的反射机制?如何使用反射实现动态加载类和调用方法? 9. 什么是Java的注解(Annotation)?如何自定义注解? 10. 什么是Java的设计模式?列举一些常见的设计模式及其应用场景。 以上只是一些常见Java开发面试题的例子,面试时可能还会有其他问题涉及到更深入的知识。建议在面试前充分准备,熟悉Java语言基础知识和常用的开发技术,以便能够给出清晰且准确的答案。引用<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java面试题大全带答案 110(持续更新)](https://blog.csdn.net/u012889902/article/details/121614968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值