面试知识题

网投招聘APP:

51job、智联、拉勾、boss直聘

java基本类型有哪些?

分类去计算,整数型有byte,short,int,long,浮点型有float,double,布尔型有boolean,字符型有char,还有个void,别忘了。

什么是装箱和拆箱?

  • 装箱:值类型转化为引用类型    

  • 拆箱:引用类型转化为值类型

StringBuffer和StringBuilder谁是线程安全的?为什么?请简单说一下什么是线程安全?

StringBuffer是线程安全的,StringBuilder不是线程安全的,StringBuffer比StringBuilder多了synchronized修饰符。线程安全指多个线程执行同一段代码时采用加锁机制,使每次的执行结果和单线程执行结果一致,不存在执行时出意外。不安全指不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得数据是脏数据。

Redis常用的数据类型有哪些?

String,List,Set,Hash(键值对)

Map是无序的吗?

HashMap是无序的,LinkedHashMap是有序的,TreeMap是按key排序的。

ArrayList和数组(Array)的区别是什么?

ArrayList不用定长度,会自动扩容。数组需要定长,超过定下的长度会报数组越界。数组可以包含基本类型和对象类型的数据,ArrayList只能包含对象类型的数据。

什么是乐观锁?什么是悲观锁?在Java是怎么体现的?

乐观锁:认为读多写少,遇到并发的可能性低,所以不会上锁,但是在更新的时候判断一下在此期间别人有没有更新去更新这个数据,采取在写时先读出当前版本号,然后加锁操作。体现:atomicInteger。

悲观锁:认为写多,每次拿数据的时候认为别人会修改,所以每次在读写数据时都会上锁,这样别人想读这个数据就会block,直到拿到锁为止。体现:互斥锁。

简单描述进程和线程

  • 进程:当一个程序进入内存,即变成一个进程

  • 线程:轻量级进程,线程是进程的执行单元

一个程序运行后,至少一个进程,一个进程至少包含一个线程。

Java执行顺序是怎样的?

父类静态代码块→子类静态代码块→父类非静态代码块→父类构造函数→子类非静态代码块→子类构造函数

请你比较一下Java和JavaScript

Java是面向对象的语言,即使是开发简单程序也要有类。JavaScript是基于对象的语言,有丰富的内部对象供开发者使用,比如document,location,Math。

请你讲讲&和&&的区别

&是逻辑与,&&是短路与。短路与只要与左边的条件为false就能判断整个条件为false,而逻辑与两边都需要判断。

int和Integer有什么区别?

int默认值是0,Integer默认值是null。int是基本类型,Integer是引用类型。Integer范围是-128~127  int的范围是-2^31~(2^31)-1。

String是基本类型吗?

String是final类型,因此不断继承这个类,不能修饰这个类。为了提高效率节省空间,应该用StringBuffer。

什么是值传递?什么是引用传递?

值传递是对基本类型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。引用传递一般是对于对象型变量而言,传递的是该对象地址的一个副本,并不是原对象本身。一般认为Java内的传递都是值传递。

请说明“==”比较的是什么?

如果两个对象完全相同时,“==”将返回true,“==”两边是基本类型,就比较数值是否相等。

若不重写hashCode()的话,hashCode()如何计算?

该方法直接返回对象的地址。

你对synchronized和Lock有什么了解?

synchronized是Java的关键字,当他修饰一个方法或者一个代码块时,能够保证在同一时刻最多只有一个线程执行该代码(互斥的体现)。

Lock是一个接口,synchronized能做的他都能做,synchronized在发生异常时,会自动释放线程占有的锁,不会导致死锁的发生。而Lock在发生异常时,如果你没有在finally中主动unlock()去释放锁,就很有可能导致死锁。

请你介绍一下volatile?

volatile是Java关键字用来保证有序性和可见性。

  • 可见性:一个线程修改了某个变量的值,这个新值对其它线程来说是立即可见的

  • 有序性:禁止进行指令重排序

volatile只能保证单次读/写的原子性。i++这种操作不能保证原子性(i++的过程是读取i值,把i+1,再把i+1赋给i,这个过程中任何一步都可能会被其它线程改动,像i=1这种的就可以保证原子性)。

synchronized修饰一个静态方法,锁住了什么?如果修饰成员方法,又锁住了什么?

synchronized修饰静态方法锁住的是类,线程想执行对应同步代码,需要获得类锁。synchronized修饰成员方法锁住的是对象,线程想执行对应同步代码,需要获得对象锁。

若对一个类不重写,他的equal()方法是如何比较的?

比较的是对象的地址。

请解释hashCode()和equals()方法有什么联系?

相同的对象必须具有相等的Hash码,两个对象的Hash码相同,他们并不一定相同。

什么是构造函数?什么是构造函数重载?

每当新对象被创建的时候,构造函数就会被调用,每个类都有构造函数。构造函数重载和方法重载很相似。可以有多个构造函数,参数列表不同。

Java中的方法覆盖和方法重写是什么意思?

  • 重写:子类重新定义父类的方法,重写必须有相同方法名,参数列表和返回类型

  • 重载:方法名相同,参数列表不相同(注意!int fun(int x)和int fun(int y)不算重载)

什么是多态?

重载和重写就是多态的具体表现形式。

内部类可以引用它包含的类的成员吗?如果可以,有什么限制?

一个内部类对象可以访问创建他的外部类对象的内容。内部类不是static的,那么它可以访问创建他的外部类对象的所有属性。内部类是static的,那么它可以访问创建他的外部类对象的static属性。

Java如何进行异常处理?

每当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息。调用这个对象中的方法可以捕获这个异常并进行处理。

Java的接口和抽象类的相同和不同处?

  • 相同:都不能实例化

  • 不相同:抽象类中的方法是public,private,protected,default  接口方法是public,default

抽象类可以是public,private,protected,default  接口方法是public。一个子类只能继承一个抽象类,可以实现多个接口。抽象类可以有构造方法,接口内不能有构造方法。

Java的异常有几种?Exception和Error的区别是什么?

Exception分为两类,编译时异常和运行时异常。

  • Error:一般发生在严重故障时,他们在java程序处理的范畴之外

  • Exception:程序可以处理的异常,可以捕获且可以恢复。遇到这类异常应尽快处理

请说明final,finally,finalize的区别?

  • final用于声明属性,方法和类,分别表示属性不可变,方法不可重写,类不可继承

  • finally是异常处理语句结构的一部分,代表总执行

  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法

面向对象的特征

封装,继承,多态,抽象

Java是否支持多继承?

类不支持多继承,接口支持多继承。

是否可以在static环境中访问非static变量?

不可以,static是静态常量,属于类,调用非static变量需要new,而类的加载先于实例创建。

请说明static关键字是什么意思?Java是否可以重写一个private或static的方法?

static关键字表明一个成员变量或者是成员方法可以在没有所属类的实例变量(没有new)的情况下被访问。

不可以,private只能被自身类访问;不可以,static是编译时静态绑定的,override是运行时动态绑定的

List、Set、Map是否继承自Collection接口?

List、Set是,Map不是。

请说说常用的集合类及方法?

最常用的集合类是List和Map。List里最常用的就是ArrayList.他是可变长度的列表,Map里最常用的就是HashMap,他按键值对进行存储,但HashMap线程不安全。

请说明Collection和Collections的区别?

  • Collection是集合类的上级接口,继承他的主要有Set和List

  • Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对集合的各种操作,如sort()

HashMap和HashTable的区别?

HashMap允许key和value是null,而HashTable不允许key或value是null。HashTable(这是一个遗留类)是线程安全的,HashMap是线程不安全的。

请说明ArrayList是否会越界?

ArrayList并发add()可能出现数组下标越界异常。

如果HashMap的可以是一个自定义的类,怎么办?

就必须重写hashCode()和equals()。

请说明线程的基本状态及状态间的关系?

新建状态,运行状态,销毁状态,就绪状态(万事俱备,只欠cpu),阻塞状态(阻塞可能因为调用wait()进入等待池,也可能调用同步方法进入等锁池,或是sleep()等待休眠,发生I/O中断)。

什么是线程池?

创建和销毁对象很费时间,创建一个对象要申请内存及其他资源,在对象创建之后JVM试图跟踪每一个对象,虚拟机就能在对象销毁之后进行垃圾回收,所以提高效率的一个方案就是尽可能减少创建和销毁对象的次数,这就是池化思想的来源。线程池就是事先创建若干个可执行的线程放入一个池中,需要时从池中获取,不用自己创建,用完了可以放回池子里,不用销毁,从而减少了创建和销毁的开销。

举例说明同步和异步

同步和异步最大的区别就在于一个要等待,一个不要等待。

  • 异步:发短信,发起者不关心接收者状态,不用等待对方回短信就可以进行下一次发送。

  • 同步:打电话,发起者需要等待对方接听,接通后才能通信。

当一个线程进入对象的synchronized方法A之后,其它线程是否可进此对象的synchronized方法B?

不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。A方法的对象锁已经被取走,试图进入B方法的线程只能在等锁池里等待对象锁。

请问sleep()和yield()有什么区别?

sleep()给其他线程机会时,不考虑优先级。yield()只会给同级或更高级的线程机会

执行sleep()后转入阻塞状态,执行yield()后转入就绪状态。

stop()和suspend()为何不推荐使用?

stop()会解除由线程获取的所有锁定,如果线程处于不连贯状态,很难检查出问题所在。suspend()容易发生死锁,调用suspend()时,目标线程会停下来,但仍然持有之前的锁定。

请说明sleep()和wait()有什么区别?

sleep是Thread的方法,wait是Object的方法;sleep方法暂停指定时间,让出cpu给其他线程,但他监控状态依旧保持着,当指定时间到了又会自动恢复运行状态。在调用sleep方法的过程中,线程不会释放对象锁,而调用wait方法的时候线程会放弃对象锁。

请分析同步方法和同步代码块的区别是什么?

同步方法默认用this或当前类对象作为锁;同步代码块可以选择以什么来加锁。

请简述一下线程池的运行流程?

当需要任务大于核心线程数,把任务往存储任务队列里放,当存储队列满了的话就增加线程池创建的线程数量,当线程数量达到最大,就开始执行拒绝策略。

请简单描述一下死锁?

两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行,结果就是陷入了无尽的循环。

请说明一下synchronized的可重入怎么实现?

每个锁关联一个线程持有者和一个计数器,当计数器为0时表示该锁没有被任何线程持有,那么任何线程都可以获得该锁而调用方法。当一个线程请求成功后,JVM会记下持有锁的线程,并将计数器记为1。此时其它线程请求该锁,则必须等待,而持有锁的线程如果再次请求这个锁,就可以再次拿到锁,同时计数器会递增。当线程退出一个synchronized方法/块时,计数器会递减,如果计数器为0则释放该锁。

JDK和JRE的区别?

JDK是Java开发工具包,JRE是Java运行环境,JDK中包含了JRE。

请简单描述一下垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么方法可以主动通知虚拟机吗?

当对象被创建时,GC就开始监控这个对象,GC采用有向图的方式记录和管理堆中的所有对象,通过这种方式确定哪些对象是可达的,哪些是不可达。当GC确定一些对象“不可达”时,GC有责任回收这些内存空间。

Java中内存泄漏是什么意思?

不再会被使用的对象内存不能被回收就是内存泄漏。

运行时异常和一般异常有什么区别?

运行时异常不是必须要catch;一般异常必须要catch,不管你是否乐意。

依赖注入有几种?

Set注入,构造器注入,接口注入。

Redis的List在什么场景下使用?

Redis中List的数据结构实现是双向链表,所以可以非常便捷地应用于消息队列(生产者/消费者模型)。消息的生产者只需通过Ipush将消息放入list,消费者便可以通过rpop取出该消息,并且可以保证消息的有序性。

缓存的优点是什么?

减少对数据库的读操作,降低数据库压力。加快了响应速度。

为什么Redis是单线程的?为什么Redis读写速率快?

CPU不是Redis的瓶颈,Redis的瓶颈是机器内存或网络带宽。Redis是纯内存数据库。

GET和POST的区别

GET方式通过URL提交数据,POST方式数据放在请求头或消息体提交;GET提交的数据最多只要1024字节,POST则没有限制。使用GET的时候参数会显示在地址栏上,而POST则不会,所以敏感数据还是使用POST好。

数据库ACID特征

  • 原子性:事务是是一个不可分割的工作单位,事务要么都发生,要么都不发生

  • 一致性:事务前后数据的完整性必须保持一致

  • 隔离性:多个用户并发访问数据库,多个并发事务之间互相隔离

  • 持久性:一个事务一旦提交,他对数据库中数据的改变是永久的,数据库发生故障也不会对其有影响

浏览器从接受一个URL到展示,经历了什么?

DNS解析→TCP连接→发送HTTP请求→服务器处理请求并返回HTTP报文→浏览器解析,渲染页面;除了以上这些之外,你还需要掌握常考的设计模式和算法。

常用的设计模式

单例模式,工厂模式,观察者模式,装饰模式,代理模式,策略模式,适配器模式。

常考算法

冒泡排序,快速排序,二分查找。

                                                                                        /   面试   /

技术面试,无非就是Java基础+项目经历(+设计模式),如果是刚毕业或是还在校的学生,问的60%是Java基础,10%~20%的数据结构和算法(不过公司确实更看重这一块,这一块答好基本就稳了),剩下的才是项目经验(项目经验主要是你干了什么,有多大的工作量,用到了什么技术),问到的东西还会拓展,一般就是验证这个东西是不是你写的,你对这个技术熟悉到什么程度,如果你确实是使用过一般都没问题。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值