( 百度Java面经)互联网公司校招Java面试题总结及答案——百度
Posted yunxi520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了( 百度Java面经)互联网公司校招Java面试题总结及答案——百度相关的知识,希望对你有一定的参考价值。
1.关键字transient
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
MyISAM引擎是mysql 5.1及之前版本的默认引擎,它的特点是:
不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁
不支持事务
不支持外键
不支持崩溃后的安全恢复
在表有读取查询的同时,支持往表中插入新纪录
支持BLOB和TEXT的前500个字符索引,支持全文索引
支持延迟更新索引,极大提升写入性能
对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用
InnoDB
InnoDB在MySQL 5.5后成为默认索引,它的特点是:
支持行锁,采用MVCC来支持高并发
支持事务
支持外键
支持崩溃后的安全恢复
不支持全文索引
----------------------------------------百度-----------------------------------------------------
一面:
1.怎样设计实现一个高效的线程安全的hashmap 。
方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现。
方法二:重新改写了HashMap,具体的可以查看java.util.concurrent.ConcurrentHashMap. 这个方法比方法一有了很大的改进。(锁分离)
方法一使用的是的synchronized方法,是一种悲观锁.在进入之前需要获得锁,确保独享当前对象,然后做相应的修改/读取.
方法二使用的是乐观锁,只有在需要修改对象时,比较和之前的值是否被人修改了,如果被其他线程修改了,那么就会返回失败.锁的实现,使用的是 NonfairSync. 这个特性要确保修改的原子性,互斥性,无法在JDK这个级别得到解决,JDK在此次需要调用JNI方法,而JNI则调用CAS指令来确保原子性与互斥性.
重写和重载
(1)重写:需要继承;方法吗和参数、返回值必须相同,权限修饰符必须大于等于父类;不可以重写父类的private方法;不可以抛出父类没有抛出的异常;
(2)重载:方法名必须相同;参数个数、类型有一个不相同;返回值可以相同也可以不同;可以有不同的访问修饰符;可以抛出不同异常。
2.用过的设计模式。写单例模式代码,各种情况下比如去掉某一句会怎样。
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
单例模式:
工厂模式:程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象。
代理模式:指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。
观察者模式:
适配器模式:如果一个类要实现一个具有很多抽象方法的接口,但是本身只需要实现接口中的部分方法便可以达成目的,所以此时就需要一个中间的过渡类,但此过渡类又不希望 直接使用,所以将此类定义为抽象类最为合适,再让以后的子类直接继承该抽象类便可选择性的覆写所需要的方法,而此抽象类便是适配器类。
3、介绍同步锁,使用情景;
synchronized
4、假如有两个线程,一个线程A,一个线程B都会访问一个加锁方法,可能存在并发情况,但是线程B访问频繁,线程A访问次数很少,问如何优化。(然后面试官说有了解过重度锁和轻度锁吗)
5、进程间都有哪些通信方式;
1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2.高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
3.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
7.共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
8.套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
6、有一个整数,转换为二进制,请找出所有的1的数量;
只计算1的个数使用:
while(n>0)
count++;
n = n & (n-1);
7、你觉得Java是完全面相对象的语言吗?
8、讲解下你对抽象,多态的理解;
抽象就是将实际事物特征抽象出来,用一个类表示,类中的属性就表示事物的不同特征。
抽象类和接口就是抽象的一种表象。
多态
①使用父类类型的引用指向子类的对象;
②该引用只能调用父类中定义的方法,不能调用子类中独有的方法;
③如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用子类中的这个方法;
④在多态中,子类可以调用父类中的所有方法;
⑤多态主要体现为方法重载和方法重写,相同的行为,不同的实现方式;
⑥多态的主要应用是多态参数和多态集合
⑦如果一个方法中有父类作为参数类型,就意味着可以给该方法传递任何一个子类对象。
9、讲解下http请求里的header有什么作用;
10.Get和post区别。
(1)get用于获取数据,而且应该是安全的和幂等的。post用于提交数据。(多用于新建)。
(2)GET请求的数据会附在URL之后,最多只能是1024字节;POST把提交的数据则放置在是HTTP包的包体中,理论上数据大小没有限制。
(3)POST的安全性要比GET的安全性高。
11.Http协议相关。
HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。
HTTP/1.0不支持连接保持,所以后来HTTP/1.1增加了Connection:keep-alive以及管道,管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序。
HTTP/2.0是一个彻底的二进制协议;实现双向的、实时的通信(多工),避免了队头阻塞;用ID来区分数据流,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数;可以取消数据流;客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应;引入了头信息压缩机制和信息表;允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送;
12.Java有没有多继承,接口和抽象类区别。jvm 理解
接口可以多继承,类不可以。
(1)抽象类是由abstract关键字修饰,允许包含未实现的方法。
接口是方法声明和常量值定义的集合,不允许包含变量。
(2)接口是绝对抽象的,不可以被实例化。抽象类不能被实例化。
(3)定义接口时可以使用继承,而且可以使用多继承。抽象类只能单继承。类可以实现很多个接口,但是只能继承一个抽象类;
(4)接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
(5)Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
public是在不同包中也可以访问;protected是必须在同一个包中或者子类才能访问;default是不允许子类访问,可以在类内部或者同一个包中访问;private是只能在类内部访问。
13.JDK和JRE的区别是什么?
Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK) 是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程 序。
JDK中包含JRE,JRE中包含JVM。
JDK中包含的JRE主要是为JDK自带的开发工具提供运行环境,与JDK并列的那个JRE是为用户编写的JAVA代码提供运行环境的。
classpath配置的是JDK的lib目录,path配置的是JDK的bin目录。
14.数据库四个范式的区别。在设计数据库的时候如何考量。
第一范式(1NF)属性不可拆分 或 无重复的列(保证列唯一)
第二范式(2NF)要求实体的属性完全依赖于主关键字。存在一个列被定义为唯一主键的表就是第二范式。(保证行唯一)
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(外键关系)
第四范式(4NF)禁止主键列和非主键列一对多关系不受约束用复合列做主键的表。
15.64个马有8个跑道,没有计时工具,最少需要多少次跑,如何找到跑最快的1个和4个马?
先分为8组,找出每组第一再跑一次,一共9次就可以找到第一名;
第九次的第一名的那组的二(1)、三(2),四(3),第二名(4)那组的第二名(5),第三名(6),第三名(7)的第二名(8)再跑一次就可以找到前4名。
16.正则表达式
s表示所有空白字符;S表示非空白字符;*表示匹配零次或多次;+表示匹配一次或多次;. 表示除换行符外的任意字符;?匹配零次或一次。
1.如何停止运行一个线程
interrupt
2.如何实现一个hashmap,需要考虑哪些问题
hashcode
3.equal和==的区别
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
String s2 = new String("Monday").intern();会放入缓冲池。
4.如何判断一个对象已经被回收
5.为什么四次挥手比三次握手多一次
因为三次握手是要建立和确认客户端和服务器之间的通信线路;而四次挥手是为了关闭两方之间的数据传递,因为是双工的,所以被动方和主动方两个流向都需要关闭和确认,所以是四次。
4. linux相关指令,把能记得的说一下,出了个小功能,用shell实现;
5. sql中replace和update的区别;
update是SQL中的数据更新命令,replace是VF中的数据更新命令;
update不需要打开表,repl命令需要先打开表;
update不加条件是更新表中所有记录,repl不加条件是更新当前记录,要加上all短语才是更新所有记录。
9. 接触过哪些软件测试的方法。
黑盒,白盒测试;
性能测试,压力测试,冒烟测试;
3. 如何拦截5分钟前恶意登录(用户名密码不正确)超多一定次数的ip
6.介绍一下信号量和互斥锁
信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。
互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section)。因此,在任意时刻,只有一个线程被允许进入这样的代码保护区。
对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
7.问了问项目,让画一下其中一个项目的系统架构图,和其中一个功能的流程图。
——————————————————————————-——————————
二面:
输入字符流,找第一个重复的字符串。
1、Linux下的一些指令,$$(进程id),$?(上一条命令退出时状态),怎么查看进程,按照内存大小,CPU占用排序等等。
(大写M和大写P)
2、项目中遇到的问题,自己咋解决的等等。
多数据库,使用Mybatis的拦截器。
3、介绍一下hash,怎么解决冲突。(链地址法)
4、进程间的通信,共享内存方式的优缺点。
环境变量/文件描述符:子进程接受父进程环境数据的拷贝以及所有文件描述符。
管道:用于相关和无关进程间的通信,而且形成两个进程间的一个通信通道,通常使用文件读写程序访问。
共享内存:使用客户机/服务器模型(C/S),服务器对客户的数据或动作请求作出反应。
动态数据交换:动态数据交换使用消息传递、共享内存、事务协议、客户/服务器范畴、同步规则以及会话协议来让数据和控制信息在进程间流动。动态数据交换对话( dynamic data exchange session, DDE )的基本模型是客户、服务器。服务器对来自客户的数据或动作作出反应。客户和服务器可以以多种关系来通信。
共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的.因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中.所以只能由处于同一个计算机系统中的诸进程共享,不方便网络通信。
共享内存块提供了在任意数量的进程之间进行高效双向通信的机制。每个使用者都可以读取写入数据,但是所有程序之间必须达成并遵守一定的协议,以防止诸如在 读取信息之前覆写内存空间等竞争状态的出现。不幸的是,Linux无法严格保证提供对共享内存块的独占访问,甚至是在您通过使用IPC_PRIVATE创 建新的共享内存块的时候也不能保证访问的独占性。 同时,多个使用共享内存块的进程之间必须协调使用同一个键值。
5.讲下堆的作用。
6.堆的垃圾回收对象选择原则。
所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。垃 圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根 集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。下面介绍几个常用的算法。
7 进程间通信详细叙述
8 tcp udp 区别 UDP应用场景
UDP一般用于即时通信(QQ聊天 对数据准确性和丢包要求比较低,但速度必须快),在线视频(RTSP 速度一定要快,保证视频连续,但是偶尔花了一个图像帧,人们还是能接受的),网络语音电话(VoIP 语音数据包一般比较小,需要高速发送,偶尔断音或串音也没有问题)等等。
9 linux中文件名存储在哪里? 改变文件名之后 MD5会不会变
只有两项数据存放在目录项中:文件名和i节点编号。不会的,只有文件内容发生改变MD5才会变化。一般对文件求MD5值只取文件内容部分,像文件名、保存目录、创建时间、修改时间、权限等等的元信息都是不进行计算的。
7 linux命令相关 问用过哪些 然后展开
9 crontab 怎么设置一个每小时、每3小时的定时任务
6. 求一个struct的大小
7.Linux命令相关,问有一个文件A.txt,里面有许多行,找出其中带关键字‘B‘的行,并统计重复度。我问了下重复度是指啥,他说,这样吧,假设每一行都是由空格分隔开的若干字符,若整个文件中,有2行的最后一个字符都是‘10‘,你就输出 “10” : 2。
8.假如在服务器上执行一个进程时,你发现服务器很卡顿,你会怎么查找原因。
9.time_wait 是TCP四次握手哪个阶段的状态,为什么要有这个状态。这个状态带来的好处和坏处是什么。在网络中,什么与这个状态相似
最后这里小编整理了一套让面试不慌张的面试资料
领取步骤:
1、加微信获取
以上是关于( 百度Java面经)互联网公司校招Java面试题总结及答案——百度的主要内容,如果未能解决你的问题,请参考以下文章
亲身面经分享,校招实习面试系列每日10题,快速学习(Java基础篇)