Java基础面试题
1、面向对象的特征有哪些方面
面向对象的特征主要有以下几个方面:
-
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
-
封装:把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
-
继承:使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
- 关于继承如下 3 点请记住:
- 子类拥有父类非 private 的属性和方法。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。(以后介绍)。
- 关于继承如下 3 点请记住:
-
多态:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
2、== 和 equals 的区别是什么
-
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
-
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
-
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
-
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
3、常用的集合有哪些?
Map接口和Collection接口是所有集合框架的父接口:
-
Collection接口的子接口包括:Set接口和List接口;
-
Map接口的实现类主要有:HashMap、ConcurrentHashMap、TreeMap、Hashtable以及Properties等;
-
Set接口的实现类主要有:HashSet、LinkedHashSet、TreeSet等;
-
List接口的实现类主要有:ArrayList、LinkedList、Stack、Vector等。
4、静态变量和成员变量的区别?
-
所属不同: 静态变量属于类,所以也称为类变量;成员变量属于对象,所有也称为实例变量(对象变量);
-
在内存中出现的时间不同: 静态变量只在类创建时加载一次,随着类的加载而加载随着类的消失而消失;成员变量随着对象(也叫实例)的创建而存在,随着对象的消失而消失;
-
在内存中的位置不同: 静态变量存储于方法区里的静态区,成员变量属于对内存;
-
调用方式不同: 静态变量可以通过类名调用,也可以通过对象调用;成员变量只能通过对象调用;
5、filter过滤器用过吗?一般用在什么地方?
-
用过
-
例如实现Servlet,Jsp或静态html等文件的拦截,从而实现一些特殊功能。
-
例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
6、多线程一般用在什么地方?
-
多线程的作用:
充分利用CPU资源,提高CPU使用率
,才用多线程的方式去同时完成几件事情而不相互干扰 -
用在什么地方:大多情况下,用到多线程主要是需要处理
大量的IO操作
或处理需要耗费大量时间的操作
等等。比如:读写文件等。
7、线程之间的可见性
-
加入volatile可以实现线程之间的可见性
-
加入了volatile关键字之后可以将值马上更新到变量中从而达到可见性
8、int和Integer的区别?
-
Integer是int的包装类,而int是Java的一种基本数据类型
-
Integer是类,必须实例化之后才能使用,而int变量不需要
-
Integer的默认值是null,而int的默认值是0
-
Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针只想此对象;而int是直接存储数据值
9、Jdk和Jre和JVM的区别
-
JDK
- Jdk还包括了一些Jre之外的东西 ,就是这些东西帮我们编译Java代码的, 还有就是监控Jvm的一些工具
Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等
- Jdk还包括了一些Jre之外的东西 ,就是这些东西帮我们编译Java代码的, 还有就是监控Jvm的一些工具
-
JRE
- Jre大部分都是 C 和 C++ 语言编写的,他是我们在编译java时所需要的基础的类库
Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包
如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
- Jre大部分都是 C 和 C++ 语言编写的,他是我们在编译java时所需要的基础的类库
-
Jvm
- 在倒数第二层 由他可以在(最后一层的)各种平台上运行
Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。
- 在倒数第二层 由他可以在(最后一层的)各种平台上运行
10、Oracle JDK 和 OpenJDK 的对比
-
Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
-
OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;
-
Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题;
-
在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;
-
Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
-
Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。
11、Java8的新特性
-
Lambda表达式
-
函数式接口
-
方法引用和构造器调用
-
Stream API
-
接口中的默认方法和静态方法
-
新时间日期API
12、http协议的三次握手
- 三次握手:
- 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
13、http协议的四次挥手
- 四次挥手:
- 第一次挥手:客户端A发送一个FIN.用来关闭客户A到服务器B的数据传送
- 第二次挥手:服务器B收到这个FIN. 它发回一个ACK,确认序号为收到的序号+1。和SYN一样,一个FIN将占用一个序号
- 第三次挥手:服务器B关闭与客户端A的连接,发送一个FIN给客户端A
- 第四次挥手:客户端A发回ACK报文确认,并将确认序号设置为序号加1
14、http协议的三次握手为什么不是两次或者四次
- 客户端要给服务器报告我要和你建立连接,顺便把我自己的一个发送能力发给服务器,让服务器知道
- 服务器判断是否可以给你创建链接,把我的一个接受能力,
- 只有三次握手才能保证双方的发送和接收能力达到我认为协商好的一个过程
- 协议没有百分之百的安全,三次已经够了,即使是四次也不能保证协议百分之百可靠
15、http调用时候超时,超时怎么处理
- 我使用的是捕获异常,重试,重试超过一定次数就报错,放弃重试,以防造成其他模块的阻塞
16、final 有什么用
- 用于修饰类、属性和方法;
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的
17、&和&&的区别
- &运算符有两种用法:(1)按位与;(2)逻辑与。
- &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。
18、Java 有没有 goto
- goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。
19、3.2E3F 里面的E/F分别表示什么?
- E:科学计数法 3.2*10(3)
- F:表示float类型
20、switch(参数) case的参数可以传哪些数据类型?
- jdk1.0 char byte short int
jdk5.0 enum(枚举)
jdk7.0 String
21、do while 和while之间的区别?
- do while 先执行 然后在判断 保证程序至少执行一次【先斩后奏】
- while 先判断 符合条件在执行
22、list用过哪些?ArrayList如何排序?list和Set的区别?
- 用过ArrayList、LinkedList、Vector
- 排序:sort()
List和Set的区别:
- List,Set都是继承自Collection接口
- List特点:元素放入有顺序,元素可以重复。
Set特点:元素放入无顺序,元素不可重复,重复元素会覆盖。- Set和List对比:
Set:检索元素效率低下,删除和插入效率高,删除和插入不会引起元素位置的改变。
List:和数组类似,List可以动态增长,查找元素效率高,增删元素效率低,因为增删元素会引起其他元素位置的改变。
23、list集合去重(两种解决方案)
- 把list变为set集合
- 在jdk1.8中用到java8新特性stream流
- list.stream().distinct(抵死听科特).collect(Collectors.toList());
24、异常包括什么 说一下什么是运行时异常、非运行时异常,举例说明
-
异常是指程序运行过程当中出现的例外情况
异常的体系结构:异常包括:运行时异常和非运行时异常
-
运行时异常(RuntimeException):指编译能通过,直到运行的时候才体现出来
-
非运行时异常(Exception):指在编译的时候必须明确该如何处理,否则根本无法通过编译
-
Error:描述了Java运行时系统的内部错误或资源耗尽错误。大多数错误与代码编写无关,而表示代码运行时JVM出现的问题。应用程序不应该抛出这种类型的对象。
常见的运行时异常(RuntimeException)有: -
IndexOutOfBoundsException(下标越界异常)
-
NullPointerException(空指针异常)
-
NumberFormatException(String转换为指定的数字异常)
-
ArithmeticException(算术异常,如除数为0)
-
FileNotFoundException(文件未找到异常)
-
IOException(操作输入流和输出流时可能出现的异常,如磁盘损坏等)
25、jvm内存结构
- 堆 程序计数器 方法区,虚拟机栈,本地方法栈
26、在jvm中锁住的是什么?
- 锁住的是堆里这个字节码文件
27、线程的实现方式
- 继承Thread类,重写run方法 (其实Thread类本身也实现了Runnable接口)
- 实现Runnable接口, 重写run方法。(传入Thread类的构造方法中,由Thread的start启用线程)
- 实现Callable接口,重写call方法(有抛出异常和有返回值)
通过Callable和FutureTask创建线程,将Callable实现类传入FutureTask构造方法中,由FutureTask的start方法启用线程 - 通过线程池创建线程
28、怎么处理异常
- 抛还上级:throws
- 自行处理:try catch finally
29、多态的实现机制
Java中实现多态的机制靠的是: 父类或接口定义的引用变量可以指向子类或具体的实现类的实例对象,而程序调的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
一句话:父类或接口引用指向具体的实例对象
多态的不同表现形式:方法的重写和重载就是Java多态的不同表现
- 重写Overriding是父类与子类之间多态的一种表现
- 重载OverLoding是一个类中多态的一种表现
30、Java简单运算面试题
short x = 1;
x = x + 1;//左边short = 右边int?
System.out.println(x);//报错
short y = 1;
y += 1;//y = (short)(y + 1); +=会自动转换
System.out.println(y);//2
31、StringBuffer和StringBuilder之间的区别?
- StringBuffer和StringBuilder在创建对象的时候 都会多预留16块缓冲区
- StringBuffer 同一时间允许一个线程进行访问,效率较低,但是不会出现并发错误
- StringBuilder 同一时间允许多个线程进行访问,效率较高,但是可能会出现并发错误
32、为什么不把一个类所有的方法全部定义成静态的呢?
- 静态方法里面只能直接的访问静态成员
- 如果想要在静态方法里面访问非静态成员的话,需要先创建对象,拿着对象去调用
33、&和&&的区别
- &和&&都可以作为逻辑运算符使用
- &&有短路特性,当通过前面条件能够得知最终表达式结论的话,后面的条件会短路掉不做判断,所以效率更高。
- &没有短路特性,两边的条件都会进行判断。
另外&还是按位运算符的按位与运算。当&左右两边连接的是整数类型的时候作为二进制按位与运算,也就是将两个数的二进制位都是1的结果写1。
34、final finally finalize区别
- final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
- finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
- finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。
35、String和StringBuffer的区别
String和StringBuffer都是Java当中提供的字符串类型,其中String没有预留缓冲空间,而StringBuffer会在原先内容的基础上预留一部分的缓冲空间。
String: “a” + “b” 相当于创建了一个新对象,返回值是”ab"。
StringBuffer: sbuff.append(“b”)相当于还是在原先的对象上进行修改值。
36、访问修饰符 public,private,protected,以及不写(默认)时的区别
-
定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
-
分类
- private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
- default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
- protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
- public : 对所有类可见。使用对象:类、接口、变量、方法
37、请说出你所知道的线程同步的方法
-
synchronize修饰符
修饰代码块
修饰方法 -
java.util.concurrent.locks.ReentrantLock(并发包中的可重入锁)
Lock lock = new ReentrantLock();
其中lock.lock()用于上锁,lock.unLock()用于释放锁38、在Java中,如何跳出当前的多重循环
- break加循环标签,如:
example_this:for