前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础面试题整理

Java基础面试题整理

作者头像
攻城狮的那点事
发布2019-09-17 15:10:33
2.2K0
发布2019-09-17 15:10:33
举报

Java SE类

1,JDK和JRE有什么区别?

JDK是给开发人员用的工具包,它包含了javac编译器,也包含了jre。

JRE是java运行环境包含了jvm虚拟机等等,简单的说如果要运行java程序只需要JRE即可。

2,==和equals的区别

==比较的是对象在内存中的地址值

equals比较的是两个对象是否相等,在不重写equals方法的情况下,默认是和==的作用一样。

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

不一定,hashCode是将内存地址转换为一个整数返回,两个对象的hashcode一样,但是如果equals方法被重写了,有可能会出现地址相同但是值不相等的情况,所以equals不一定是true。

4,final在java中的作用?

被final修饰的类不能被继承

被final修饰的变量是常量

被final修饰的方法不能被重写

5,java中的Math.round(-1.5)等于多少?

-1

Math.round这个方法实际上是比较这个数离最近的数比如1.6离1和2那个距离最近,很明显离2最近,因此答案就是2,但如果出现0.5这种距离一样的情况则是比较最近的两个数哪个数最大就取哪个。-1.5位于-2和-1之间,显然-1大答案就是-1。

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

不属于,String是java定义的一个最终类。

7,java中操作字符串都有哪些类,他们之间有什么区别?

String:处理长度不可变的字符串

StringBuffer和StringBulider:处理长度可变的字符串

其中StringBuffer是线程安全的,StringBulider是JDK1.5里,线程不安全的

8,

String s1="abc";

String s2=new String("abc");

s1 == s2 false

s1.equals(s2) true

简单的说String这个类很特殊,String s1="abc"他会先去内存中看看有没有abc有的话就直接引用,没有的话就new一个出来,而String s2=new String("abc");则不管内存中有没有abc都new一个出来。

9,如何将字符串反转

有很多种,我说两种我平时开发用的比较多的吧。

第一种是用StringBuffer中的reverse方法。

第二种是用charAt()方法根据索引拼接字符串。

10,String类的常用方法有哪些

spilt切割字符串

substring,获取索引开始到结束的指定字符串

charAt获取指定位置的字符

length字符串长度

replace 替换功能

trim 去掉首尾空格

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

不一定。但是抽象方法一定在抽象类(接口也酸抽象类的一种)。

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

抽象类不能被实例化,而普通类可以被实例化

抽象类的访问修饰符不能是private

抽象类中有抽象方法,一个子类继承抽象类必须实现该抽象类的所有抽象方法,或者子类也声明为抽象类。

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

不可以,抽象类要求要有子类继承,使用final修饰则无法被继承

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

接口由类实现,抽象类由类继承

接口中所有的方法都是抽象方法(JDK1.8之前),所有的变量都是公共的常量,抽象类中既可以有抽象方法也可以有具体的方法实现,变量为普通变量。

接口是功能的抽象,抽象类是类别的抽象

15,java中的IO流分为哪几种?

两种字符流和字节流,有InputStream和OutputStream和Wirte和Read,其余的流都是通过继承上面这四个抽象类继承的。

16,BIO NIO AIO有什么区别?

我只懂一些解释

BIO:同步并阻塞

NIO:同步非阻塞

AIO:异步非阻塞

17,File类中的常用方法

mkdir()创建文件夹

createNewFile()创建文件

getPath获取路径

getName()获取名字

length()文件字节数

容器类

1,java容器有哪些?

List Set Map

List:有序 可存放重复元素,底层是数组

Set:无序 不可存放重复元素,底层是HashMap,HashMap由数组+链表实现

Map:无序,键值对,键唯一,值不唯一。底层由由数组+链表实现

2,Colletction和Colletcions有什么区别

Colletction是Set和List的父接口

Collections是一个集合的工具类,提供比如集合元素反转类似的方法。

3,List Set Map 之间的区别是什么?

List:有序 可存放重复元素,底层是数组

Set:无序 不可存放重复元素,底层是HashMap,HashMap由数组+链表实现。

Map:无序,键值对,键唯一,值不唯一。底层由由数组+链表实现

4,HashMap和HashTable的区别?

HashMap是线程不安全的执行效率比较高,可以存储null键和值

HashTable是线程安全的执行效率低,不可以存储null键和值

5,如何决定使用HashMap还是TreeMap?

大多数情况下使用的是HashMap执行速度快

如果需要排序的话使用TreeMap。

6,说一下HashMap的实现原理?

HashMap底层由数组和链表实现,是线程不安全,执行速度快,且能存储null键和null值。

他的底层基于哈希实现,我们使用put(key,value)存储对象到容器来,使用get(key)从容器中获取元素。当我们使用put的时候,会先对键调用hashcode方法,返回的hash值作为找到entry在数组中存储位置的下标。

但是由于hashcode的值有可能会相同也就是存储的下标一样,所以hashmap也会采用链表的形式存储entry键值对。

然后在调用get方法的时候,首先把key做一次hash映射,得到对应的下标去找到对应的元素,但是刚刚说到有可能出现hashcode的值一样,这个时候会调用key.equals去匹配链表对应的节点,从而找到值。

7,说一下HashSet的实现原理?

HashSet底层由HashMap实现,无序且不能存储重复元素,我们在存储元素时候,首先对元素调用一次hashcode,获得返回的hash值,这个hash值是用来存储在哈希表中的位置下标。这个时候会出现两种情况,如果这个元素的hash值在哈希表中唯一,那么就直接存储到哈希表,如果不唯一,这个时候会调用equals方法,如果一样则认为是重复元素,这个时候重复元素不允许添加,如果不一样则该元素添加。

8,ArrayList和LinkedList的区别是什么?

二者都是线程不安全的,ArrayList顾名思义底层是数组,LinkedList底层是链表,根据二者的数据结构特性,一般查找的需求多的时候用ArrayList,增删改需求多的时候用LinkedList。

9,如何实现数组和List之间的转换?

数组转集合用的是asList(),并且数组存放的必须是引用类型的元素

集合转数组用的toArrary()。

9,ArrayList和Vector之间的区别?

ArrayList是线程不安全的,Vector是线程安全的。

ArrayList和Vectort容器都有初始大小,但是他们的容器增长倍率不一样,ArrayList是1.5,而Vector是2.

10,Array和ArrayList有什么区别

Array是数组即可以存放引用数据类型,也可以存放基本数据类型,其容量固定无法改变。

ArrayList底层是数组但是他只能存放引用数据类型,其容量有自动增长的倍率。

11,Queue中,poll()和remove()有什么区别?

这两个方法是移除第一个元素,remove和Colletction的remove类似,在容器为空的时候,会抛出异常,而poll则会返回null。

12,哪些集合类是线程安全的?

Vector,HashTable

13,迭代器Iterator是什么?

Iterator是一个接口,提供了对集合元素的迭代,其实就相当于一个游标,每迭代一次,游标就向下移动一个位置,直到下一个元素为null,返回false完成迭代。

14,Iterator怎么使用?有什么特点?

首先通过集合引用变量调用iterator()方法获取迭代器。通过while(迭代器.hasNext()){

迭代器.next()

}

hasNext()相当于判断是否有下一个元素,而next则是获取这个元素。

特点就是在迭代过程中,不可以使用集合自带的remove方法移除元素,而应该是用迭代器自带的remove方法移除,还有一个注意点就是用foreach的时候迭代器自带的remove也不能用否则会报异常。

15,Iterator和ListIterator有什么区别?

首先ListIterator只能遍历List集合,他提供了add方法可以一边迭代一边添加元素,并且可以倒叙遍历集合元素

Iterator可以遍历list和Set集合,没有add方法,并且不能倒序遍历。

16,怎么确保一个集合不被修改?

用Colletcions集合工具类的unmodifiableList方法。用final不可以因为final修饰的引用数据类型地址不变但是本身的内容是可以改变的。

多线程类

1,并行和并发有什么区别?

通俗说就是事件的交替进行,比如一个老师给2个学生辅导,他先辅导A到一半然后由A自己做然后跑去辅导B在跑来辅导A.

而并行则是把AB叫在一起同时辅导,相当于事件的同时执行。

2,线程和进程的区别?

进程是线程的容器,进程中至少要有一条线程,线程相当于一条路,不同的线程就是不同的路。

3,守护线程是什么?

就是用来守护重要线程的线程,如果重要线程挂了,守护线程也会跟着挂掉。

4,创建线程有哪几种方式?

继承Thread类或者实现Runnable接口,并重写run方法。

Thread子类的话可以直接使用Thread类的方法,但是如果类有继承其他类则没办法继承该类

Runnable的话无需担心该类是否继承了其他类,但是不能使用Thread类里面的方法。

5,runnable和callable有什么区别?

runnable执行完没有返回值他的run方法不能抛异常,callable执行完有返回值他的call方法能抛异常。

6,线程有哪些状态?

创建,就绪,运行,阻塞,死亡。

7,sleep和wait有什么区别

线程sleep休眠后会自动唤醒,而wait的话需要手动调用notify唤醒。然后sleep状态下的线程还是拥有锁,wait状态下的线程会释放锁。

8,notify()和notifyAll()有什么区别?

notify只会唤醒一个线程,notifyAll()唤醒所有线程

9,线程的run和start方法有什么区别

start方法用来启动线程

run方法用来运行线程

10,创建线程池有哪几种方式?

只有简单的了解过,通过Executors提供的4种方式创建线程池。

11,线程池种的submit和execute有什么区别?

sumbmit有返回值,能抛出异常

execute没有返回值,不能抛出异常

12,在java程序中怎么保证多线程的运行安全?

使用synchronized和lock锁,以及voliate关键字。

13,多线程锁的升级原理?

无锁→偏向锁→乐观锁→悲观锁

乐观锁:认为我拿数据的时候别人都不会修改数据,所以不会上锁,但是在更新的时候会判断一下我拿数据这个过程中数据是否有被修改过。

悲观锁:认为我拿数据的时候别人肯定会修改数据,所以我在拿数据的时候我要上锁,直到我释放掉这个锁,别人才能进来。synchronized锁就是基于悲观锁实现。

14,什么是死锁?

是由于两个或多个线程互相持有对方所需要的资源,导致锁无法被释放,双方都处于僵持状态。

15,怎么避免死锁?

打破死锁所需的四个必要条件。

由于资源互斥是固有的特性无法改变

所以从破坏“不可剥夺”条件,破坏”请求与保持条件,破坏“循环等待”条件入手。

16,ThreadLoacl是什么?有哪些应用场景?

线程本地变量,这个类的作用可以将对象绑定到当前线程,关于具体的应用场景,我说一个我自己有用到的地方就是在用spring事务之前,如果对一个事务的控制需要确保当前线程上的连接是同一条,这样才能控制住事务,所以会写一个工具类,用来绑定数据库连接到当前线程上,每次只要一拿连接先判断当前线程上有没有,有的话直接用这条连接,没有的话从连接池里面拿一条连接并绑定在当前线程上。

17,说一下synchronized的底层实现原理?

我只知道synchronized的底层是基于悲观锁实现,具体的实现不是很了解,但是可以讲讲悲观锁的机制。

反射类

1,什么是反射?

就是把java类中的成员变量和方法映射成对象,在运行阶段就能够获取所需类的成员变量和方法。

2,什么是java序列化?什么情况下需要序列化?

把java对象转换为字节序列对象的过程。

在分布式对象里,像数据,对象都有不同的格式,有了序列化在传输时就很方便,另外需要将内存中的类对象存储到硬盘上或者数据库里就需要用到序列化。

3,动态代理是什么?有哪些运用?

动态代理就是通过一个代理对象来帮助我们为完成原本应该是由我们来做的事,特别是在不能修改源代码的前提下,动态代理的运用显得更为重要。

spring的aop底层就是基于动态代理的,一般在权限验证和日志输出的时候比较多运用到动态代理。

4,怎么实现动态代理

实现动态代理有两种方式

一种是基于接口的,一种是基于子类的

基于接口的动态代理要求被代理类必须至少实现一个接口,由官方JDK提供的newProxyInstance方法,该方法的第一个参数写的是被代理类对象的类加载器,第二个是被代理类的字节码,第三个是用于提供需要我们提供的增强的代码,通常情况下是匿名内部类。

基于子类的动态代理,要求被代理类不能是最终类,需要第三方jar包的支持,只要提供被代理类对象的字节码和提供增强代码的匿名内部类即可。

JavaWeb

1,jsp和servlet有什么区别?

jsp编译后就是一个servlet,只是jvm无法识别jsp的代码,需要有web容器将其编译成能够由jvm识别的java类。

jsp更注重在页面的显示,servlet更注重逻辑控制。

jsp有内置对象,servlet没有内置对象。

2,jsp有哪些内置对象

九大内置对象,其中四个作用域对象,pageContext,request,session,application

另外五个:out,excption,response,page,config。

3,说一下jsp的四个作用域?

pageCotext:作用在当前页面

request:仅限于本次请求

session:一次会话

application:整个web工程

4,session和cookie有什么区别?

cookie是在客户端上开辟的一小段存储数据的空间

session是基于cookie的一种会话机制是在服务器上开辟的一小段存储数据的内存空间

5,说一下session的工作原理?

原理就是在session会话机制中,每个客户端都有一个服务端给他生成的sessionid,客户端将这个sessionid存储到内存中,这样下一次的请求都会带上这个sessionid,而服务器就能够根据这个sessionid获取客户端的信息状态。

6,如果客户端禁止cookie,session还能使用吗?

一般是不能用了,除非你自己在url里面传一个sessionid,因为客户端sessionid的发送就是依赖于cookie的存在。

7,springmvc和struct2的区别是什么?

springmvc的入口是servlet,struct2的入口是Filter

springMVC基于方法设计,struct2基于类设计

SpringMVC使用比较简介,有专门的处理json数据,struct2的OGNL表达式页面开发效率高。

8,如何避免sql注入?

sql注入就是在客户端提交数据的时候输入一些猜测数据库表信息什么的获取数据库里的信息,一般来说只要开发人员注意对请求的参数中的值在后端处理时不要拼接在sql语句上,而是让后端将他视为一个字符串一般就不会发生sql注入。

Web类

1,http 响应码 301 和 302 代表的是什么?有什么区别?

301和302都是代表地址重定向,有服务端帮我们转发。

301代表访问地址永久性移除不可用,服务端帮助我们记录并且由客户端跳转到新地址

302代表重定向到新地址是暂时的,旧地址资源依旧可以访问。

2,forward 和 redirect 的区别?

forward代表请求转发,由由客户端发送求给服务器后,服务器内部帮助我们完成跳转,整个过程客户端只发送了一次请求。

redirect代表重定向,由客户端发送给服务器后,服务器返回301或者302由客户端跳转到指定的新页面,整个过程客户端需要两次请求,url也会发生变化。

3,简述TCP和UDP的区别?

TCP是面向连接的可靠的传输协议,全双工模式需要以三次握手为基础建立连接。传输过程保证数据的安全性和完整性,但是传输效率较低

UDP是面向无连接的不可靠的传输协议,传输过程中不保证数据的安全性和完整性。但是传输效率搞。

4,TCP为什么要三次握手?两次不行吗?

TCP要三次握手是因为他是面向连接的可靠传输协议,第一次握手时候客户端像服务端发起请求,SYN请求建立连接标志位为1,并且设置seq序号x,服务端接收到请求,发起二次挥手告知客户端我接受到了你的请求,并且同意和你建立连接,标志位为ACK1代表确认连接,以及ack确认号x+1,seq序号y,客户端在接收到服务端的数据包后,发起第三次握手,告知服务端,我接受到了你的应答,设置确认号y+1,此时三次握手完成,连接通道建立。

综上所述,两次肯定不行,少了第三次,服务端不知道客户端那边有没有接收到应答,这个时候通道就无法建立。

5,简述一下TCP粘包的是怎么产生的?

由于TCP是以无结构字节流为基础没有边界并且TCP的帧结构中也没有数据长度字段,和UDP不一样,UDP是以报文为基础,有数据长度字段,基于上述两点TCP便有可能产生粘包。

6,OSI的七层模型有哪些?

应用层 :比如HTTP ,FTP协议

传输层:比如TCP/UDP协议

网络层:IP协议

数据链路层:封装要发送的数据包比如帧

表示层、会话层、物理层。

7,get和post请求有哪些区别?

get请求的参数跟在url后面,并且有大小限制64k。

post请求的参数包含在body里面。

从安全性可见角度来讲,post稍微安全一些,因为参数不可见,但是传输上二者其实都不算安全的,因为抓包是能拿到数据报明文,只能通过https才能在传输上做到安全。

8,如何实现跨域?

跨域这个问题主要针对js的同源策略,要跨域的话可以通过传输jsonp的数据格式,但是有个缺点就是jsonp只能发送get请求。

还有一个就是用各类代理软件,比如我开发前端用的就是nginx反向代理。还有一种在服务端上设置接受跨域的配置。

9,说一下jsonp的实现原理?

jsonp其实就是动态创建一个script标签,通过src属性跨域,并且将回调函数通过接口传递给对方。

设计模式类

1,单例设计模式。

单例设计模式就是确保每次拿到的对象都是同一个对象,也就是这个类产生一个对象作为公用,单例设计模式,包括懒汉式和饿汉式,他们的区别是,饿汉式上来就直接创建对象,并且私有构造器,对外提供访问对象的方法。这种属于消耗内存空间但节约了时间,因为JVM创建对象也需要时间,还有一种是懒汉式,懒汉式也是私有构造方法,并且事先声明一个对象引用,对外提供访问对象的方法,当方法被调用时,判断对象引用是否为null,为null就创建该对象。

关于懒汉式和饿汉式有个很重要的注意点就是懒汉式在多线程下有可能会出问题,就是创建出多个对象,而饿汉式则不会。

2,工厂设计模式

工厂设计模式就是将创建对象的权力转交给工厂进行,比如一个咖啡工厂对外提供生产咖啡,卡布奇洛,需求者只需调用工厂提供的方法就能获得对象,而无需自己创建对象,当然这么做肯定有个好处,在项目后期维护的时候如果某个类发生变化只需要去改动创建者工厂而无需每个手动更改之前创建过的对象。

3,装饰者设计模式

装饰者设计模式算是动态代理设计模式的低配版,从功能上来说,实际上单纯就是为了增强功能,装饰的方法在这个过程中发生了变化,区别于动态代理,装饰者模式更像是继承的一种替代方案。大家都遵循一个开发规范的接口,我想基于你的实现类开发我自己的功能,而我只需要实现这个开发规范的接口并且传入你这实现类的对象,我在使用新功能时用我自己的规范,而其他部分则使用你的对象的方法。

4,动态代理设计模式

而动态代理更强调的是控制访问,代理类可以对它的客户隐藏一个具体的对象信息,相当于在这个过程中我可以控制对象做其他的事,偏重在对某一个功能的把控流程和辅助(大意就是并不是在别人的方法上装饰我自己要的方法,而是在控制别人的方法替我完成我的任务)。

5,简单工厂和抽象工厂有什么区别?

其实和抽象类和普通类的区别很像,简单的来说简单工厂适合应单一的产品,而抽象工厂适应有多个品种的产品。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 攻城狮的那点事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档