最常见的Java面试题(网络整理)

一、Java基础

1、JDK和JRE有什么区别?

      JDK:java development kit的简称,java开发工具包,提供Java的开发环境和运行环境。

      JRE:Java runtime environment的简称,Java运行环境,为Java的运行提供所需环境

      具体来说JDK其实包含了JRE,同时还包含了编译Java源码的编译器javac,还包含了很多Java程序调试和分析的工具。简单来说:如果你需要运行Java程序,只需要安装JRE就可以了,如果你需要编写Java程序,就需要安装JDK

2、==和equals的区别是什么?

==解读

对于基本类型和引用类型==的作用效果是不一样的,如下所示:

基本类型:比较的是值是否相同;

引用类型:比较的是引用是否相同

代码示例:

String x = "string";
Stirng y = "string";
String z = new String("string");
System.out.println(x==y);//true
System.out.println(x==z);//false
System.out.println(x.equals(y));//true
System.out.println(x.equals(z));//true

代码解读:因为x和y指向的是同一个引用,所以==是true,而new String()方法则是重新开辟了内存空间,所以==结果为false,而equals比较的一直是值,所以结果都为true。

equals解读

equals本质上就是==,只不过是String和Integer等重写了equals方法,把它编程了值比较。代码如下:

class Cat() {
public Cat(String name) {
	This.name=name;
}

private String name;

public String getName() {
Return name;
}

public void setName(String name) {
This.name=name;
}
}

Cat c1 = new Cat(“小白”);
Cat c2 = new Cat(“小白”);
System.out.println(c1.equals(c2));//false

equals源码如下:

public boolean equals(Object obj) {
return (this==obj);
}

equals本质上就是==

两个相同值的String对象,为什么返回的是true?代码如下:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2));//true

String的equals方法,源码如下:

public boolean equals(Object anObject) {
    if(this==anObject) {
    return true;
    }
    if(anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if(n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while(n-- != 0) {
                if(v1[i] != v2[i]) {
                    return false;
                    i++;
                }
            return true;
            }
        }
    }
    return false;
}

原来是String重写了Object的equals方法,把引用比较改成了值比较。

总结:==对于基本类型来说是值比较,对于引用类型来说比较的是引用;而equals默认情况下是引用比较,只是很多类重写了equals方法,比如String、Integer等把它变成了值比较,所以一般情况下equals比较的是值是否相等。

3、两个对象的hashCode()相同,则equals()也是一定为true,对吗?

不对,因为两个对象的hashCode()相同,equals()不一定为true。

示例代码:

String str1 = "通话";
String str2 = "重地";
System.out.println(String.fromat("str1:%d | str2:%d",str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
//执行结果:
//str1:1179395 | str2:1179395
//false

代码解读:很显然“通话”和“重地”的hashCode相同,然而equals()值为false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等并不一定能得出键值对相等。

4、final在Java中有什么作用?

     1、final修饰的类叫最终类,该类不可以被继承。

     2、final修饰的方法不能被重写。

     3、final修饰的变量叫常量,常量必须初始化,初始化之后值不可以被修改。

5、Java中的Math.round(-1.5)等于多少?

等于-1.因为在数轴上取值时,中间值(0.5)向右取整,所以正0.5向上取整,负0.5时直接舍去。

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

String不属于基础类型,基础类型有8种:byte、boolean、char、short、int、float、long、double,而String属于对象。

7、Java中操作字符串都有哪些类?

操作字符串的类有:String。StringBuffer,StringBuilder

     String和StringBuffer,StringBuilder的区别在于String声明的时不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer,StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String。

     StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuffer是线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。

8、String str = "i"与String str = new String("i")一样吗?

不一样,因为内存的分配方式不一样,String str = "i"的方式,Java虚拟机会将器分配到常量池中,而String str = new String("i")则会分到堆内存中。

9、如何使用字符串反转?

使用StringBuilder或者StringBuffer的reverse()方法

示例代码:

//StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdef");
System.out.println(stringBuffer.reverse());//fedcba

//StringBuilder reverse
StringBuilder strinBuilder = new StringBuilder();
stringBuilder.append("abcdef");
System.out.println(stringBuilder.reverse());//fedcba

10、String类的常用方法都有哪些?

    1、indexOf():返回指定字符的索引

    2、charAt():返回指定索引处的字符

    3、replace():字符串替换

    4、trim():去除字符串两端空白

    5、spilt():分割字符串,返回一个分割后的字符串数组

    6、getBytes():返回字符串的byte类型数组

    7、length():返回字符串长度

    8、toLowerCase():将字符串转换成小写字母

    9、toUpperCase():将字符串转化成大写字母

    10、substring():截取字符串

    11、equals():字符串比较

11、抽象类必须要有抽象方法吗?

不需要,抽象类不一定非要抽象方法

示例代码:

abstract class Cat() {
    public static void sayHi() {

        System.out.println("hi,,");
    }
}
//没有抽象方法但可以运行

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

普通类不能包含抽象方法,抽象类可以包含抽象方法

抽象类不能直接实例化,普通类可以直接实例化

13、抽象类能使用final修饰吗?

不能,定义仇雷的目的就是让其他类继承的,如果定义final,该类就不能被继承,这样就会产生矛盾,所以final不能修饰抽象类。

14、接口和抽象类有什么区别?

实现:抽象类的子类使用extends来继承;接口必须使用implements来实现接口。

构造函数:抽象类可以有构造函数,接口不能有。

main方法:抽象类可以有main方法,并且我们能运行它;接口不能有main方法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用public修饰;抽象类中的方法可以是任一访问修饰符。

15、Java中IO流分为几种?

按功能分:输入流(input)、输出流(output)

按类型分:字节流和字符流

字节流和字符流的区别是:字节流按8位传输,以字节为单位输入输出数据;字符流按16位传输,以字符为单位输入输出数据

16、BIO、NIO、AIO有什么区别?

BIO:BlockIO同步阻塞式IO,就是我们平常使用的传统IO,他的特点是模式简单、使用方便,并发处理能力低。

NIO:New IO同步非阻塞式IO,是传统IO的升级,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。

AIO:Asynchronous IO是NIO的升级,也叫NIO2,实现了异步非阻塞式IO,异步IO的操作基于时间和回调机制。

17、Files的常用方法都有哪些?

Files.exists():检测文件路径是否存在

Files.createFile():创建文件

Files.createDiretory():创建文件夹

Files.delete():删除一个文件或目录

Files.copy():复制文件

Files.move():移动文件

Files.size():查看文件个数

Files.read():读取文件

Files.write():写入文件

二、容器

18、Java容器都有哪些?

19、Collection和Collections有什么区别?

java.util.Collection是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供最大化的统一操作方式,其直接继承接口有List与Set。

Collections则是集合类的一个工具类/帮助类,其中提供了一系列的静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

20、List、Set、Map之间的区别是什么?

比较ListSetMap
继承接口CollectionCollection 
常用实现类AbstractList(其中常用的子类有ArrayList、LinkedList、Vector)AbstractSet(常用子类有HashSet、LinkedHashSet、TreeSet)HashMap、HashTable
常用方法add()、remove()、clear()、get()、contains()、size()add()、remove()、clear()、contains()、size()put()、get()、remove()、containsKey()、containsValue()、KeySet()、values()、size()
元素可重复不可重复(用equals()判断)不可重复
顺序有序无序(实际上由HashCode决定) 
线程安全Vector线程安全 HahsTable线程安全

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值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

需要注意JDK1.8中对HashMap的实现做了优化,当链表中的节点数据超过8个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn).

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

HashSet底层由HashMap实现

HashSet的值存放于HashMap的key上

HashMap的value统一为resent

25、ArrayList和LinkedList的区别是什么?
最明显的区别时ArrayList底层的数据结构是数组,支持随机访问,而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()在获取元素失败的时候会返回null,但是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接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引等。

三、数据库

34、数据库(DDL、DML、DQL、DCL)

1、数据查询语言DQL:select,from,where等构成

2、数据操作语言DML:insert、update、delete三种

3、数据定义语言DDL:创建数据库中的各种对象--表、视图、索引等

4、数据控制语言DCL:用来授予或回收访问数据库的某种权限,并控制数据库操作事务发生的时间及效果,对数据库实行监控

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值