2019年腾讯最新Java工程师面试题

1、单选题(共21题,每题5分)

1在正则表达式当中下面那一个字符集表示非空格字符
 
A

Ajava

 
2下列叙述中,错误的是( )。
 
A

暂无linux

 
3如下哪一个排序算法中,元素的比较次数元素与元素的初始排列无关()
 
E
 
4下面程序的输出结果是什么。
下面程序的输出结果是什么。
```
 1 public class A2{ 
 2 public static void main(String[] args){
 3     int[] a={2,4,6,8,3,6,9,12};
 4     doSomething(a,0,a.length-1);
 5     for(int i=0;i=x){
 6             swap(a,i,j);
 7             i++;//交换了几回 
 8         }
 9     }//把最大的放到最后
10     swap(a,i,end);//把最大的放到i的位置 
11     return i;
12 } 
13  
14 private static void swap(int[] a,int i,int j) 
15 {
16     int tmp=a[i];
17     a[i]=a[j];
18     a[j]=tmp;
19 }
20 } 
21 ```                           

 

C
开始被注释迷惑了半天。
按快排的思想,遍历数组将比x大的按顺序存至a\[0\]a\[1\]a\[2\]..此时j负责遍历数组,i负责依次指向下一次
遍历判断获得的大于x的数该存储的位置,每一次成功存储向后移动一格
 
![](https://storage.kuibuke.com/source/1/Eawsn8OjUtldwcCznJeyAa-L2dkhbIeK.)
![](https://storage.kuibuke.com/source/1/r_qNSSJe5jKn7YAjOeVqW87cD14xy3SB.)
![](https://storage.kuibuke.com/source/1/P_3qexdojr61Po55nN0C_TegJw5vWnl_.)
swap(a,i,end);//把最大的放到i的位置
应该是将x交换至分界点,( x并不是最大 )至此一趟core完成,x左侧大于x,x右侧小于x,x左右任是无序数列
而后依据分治的思想,对左序列,右序列迭代。当分至每一个序列只有一个元素序列必然有序。
最终达到排序目的。(灵魂手绘轻喷)
 
 
 
5如下关于hive以及Hadoop生态系统中其余组件的说法正确的是
 
B

Hbase是一个面向列分布式数据库,和hive不一样的是,hbase可以在它的数据库上实时运行,而不是运行mapreduce任务发生的git

 
6如下JAVA程序的输出是什么()

如下JAVA程序的输出是什么()程序员

 1 <pre class="prettyprint">public class HelloSogou{
 2      public static synchronized void main(String[] a){
 3          Thread t=new Thread(){
 4              public void run(){Sogou();}
 5      };
 6      t.run();
 7      System.out.print("Hello");
 8      }
 9      static synchronized void Sogou(){
10      System.out.print("Sogou");
11     }
12 }

 

B
我以为误区有两个:一个是run和start区别,Thread.run()是调用方法,Thread. start()是启动线程;另外一个是锁持有问题。这个题是调用方法,和多线程就无关。本题只有一个线程,持有HelloSogou.class锁。那么,就是另外一个问题:同步方法调用另外一个同步方法的锁问题?
 
public synchronized void methodA(int a, int b){} public synchronized void methodB(int a){ methodA(a, 0);
}
首先要明白两个问题,**1.锁的对象是谁?2.谁持有了锁?**
假设方法A和B是在同一个类Test中的两个方法。 Test t=new Test(); t.methodB();
调用methodB()方法,得到锁,锁是对象**t**;锁谁持有?当前线程(不能够说是methodB持有该锁),methodB又调用methodA,也须要锁**t**,该线程已持有**t**,固然能够直接调用methodA。
 
类比到此题,只有一个主线程,调用main,持有HelloSogou.class锁,那固然能够直接调用Sogou方法。
 
第二,若是是**t.statrt()**,那么这个题,**静态同步函数的锁是该类的字节码文件.class。**此题中,main函数和Sogou方法都是static的,因此持有相同**锁** **HelloSogou.class** ,那么,在main线程(main 是一个线程也是一个进程 )中又开了一个线程,调用Sogou方法,锁会冲突。
 
个人分析是:调用main函数(一个线程),main函数开启另外一个线程,并启动,可是main函数和Sogou方法是同一个锁,因此main函数执行完毕后才会释放锁,Sogou方法才会执行,这就是为何,换成start,是HelloSogou。
第三,将Sogou方法的锁改成其余.class锁,那么,HelloSogou和SogouHello均可能出现。由于没有互斥现象了,变为抢占式的了。
 
7下列关于Java语言中线程的叙述中,正确的是(  )。
 
D

本题考查线程的基本知识。线程与进程在概念上是相关的,线程是由表示程序运行状态的寄存器、程序计数器、栈指针以及堆栈组成,它不包含进程地址空间中的代码 和数据。代码所操做的数据是Java线程模型中的一个组成部分,数据与代码是独立的。数据能够被多个线程共享,也可不共享。Java语言中提供两种建立线 程的方法,-种是经过继承Thread类建立线程,另-种是经过实现Runnable接口来建立线程。正则表达式

 
 
8经过Intent传递一些二进制数据的方法有哪些?
经过Intent传递一些二进制数据的方法有哪些?
A、使用Serializable接口实现序列化,这是java经常使用的方法
B、实现Parcelable接口,这里Andriod的部分分类好比Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见
C

Android中实现序列化有两个选择:一是实现Serializable接口(是JavaSE自己就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也能够用于进程间通讯(IPC))。实现Serializable接口很是简单,声明一下就能够了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提升性能。redis

注:Android中Intent传递对象有两种方法:一是Bundle.putSerializable(Key,Object),另外一种是Bundle.putParcelable(Key,Object)。固然这些Object是有必定的条件的,前者是实现了Serializable接口,然后者是实现了Parcelable接口。算法

 
9在Java中,JDBC API定义了一组用于与数据库进行通讯的接口和类,它们包括在(   )包中。
 
B

暂无sql

 
10关于计算机网络,如下说法正确的是 (1)在向下的过程当中,须要添加下层...
关于计算机网络,如下说法正确的是
(1)在向下的过程当中,须要添加下层协议所须要的首部或者尾部
(2)在向上的过程当中不断拆开首部和尾部
(3)在向上的过程当中,须要添加下层协议所须要的首部或者尾部
(4)在向下的过程当中不断拆开首部和尾部
(5)SMTP属于TCP协议
(6)POP3属于UDP协议
(7)DNS属于TCP协议
(8)Telnet属于UDP协议
A
1)TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于[传输层](https://baike.baidu.com/item/%E4%BC%A0%E8%BE%93%E5%B1%82)协议。
2)其中TCP提供IP环境下的数据[可靠传输](https://baike.baidu.com/item/%E5%8F%AF%E9%9D%A0%E4%BC%A0%E8%BE%93),它提供的服务包括[数据流](https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E6%B5%81)传送、可靠性、有效流控、全双工操做和多路复用。经过面向链接、端到端和可靠的[数据包](https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%8C%85)发送。通俗说,它是事先为所发送的数据开辟出链接好的通道,而后再进行数据发送;通常来讲,TCP对应的是可靠性要求高的应用。
3)而UDP则不为IP提供可靠性、流控或差错恢复功能。UDP对应的则是可靠性要求低、传输经济的应用。
4)TCP支持的应用协议主要有:Telnet、FTP、SMTP等;
5) TCP对应的协议: (1) FTP:定义了文件传输协议,使用21端口。 (2) Telnet:一种用于远程登录的端口,使用23端口,用户能够以本身的身份远程链接到计算机上,可提供基于DOS模式下的通讯服务。 (3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。 (4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。 (5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。 UDP对应的协议: (1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。 (2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。因为网络设备不少,无链接的服务就体现出其优点。 (3) TFTP(Trival File Tran敏感词er Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
 
11Java是一门面向对象的编程语言,下面关键字中可以表示Java面向对象的特...

Java是一门面向对象的编程语言,下面关键字中可以表示Java面向对象的特性是()数据库

A

A编程

 
12下面关于操做系统的进程说法正确的有?
 
B

死锁不只能够发生在多线程中,也能够发生在多个进程中。只要是因争抢资源致使互相等待,无外力做用没法前进的均可以称为死锁

 
13下列关于Java布尔类型的描述中,正确的是(  )。
 
A

暂无

 
14下面有关java classloader说法错误的是?
 
C

一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职:

  • Bootstrap ClassLoader 负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
  • Extension ClassLoader 负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
  • App ClassLoader 负责加载当前java应用的classpath中的全部类。

classloader 加载类用的是全盘负责委托机制。所谓全盘负责,便是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的全部 Class也由这个classloader负责载入,除非是显式的使用另一个classloader载入。
因此,当咱们自定义的classloader加载成功了com.company.MyClass之后,MyClass里全部依赖的class都由这个classLoader来加载完成。

 
15HTTPS是一种安全的HTTP协议,它使用 ( ) 来保证信息安全?
 
B

SSL是解决传输层安全问题的一个主要协议,其设计的初衷是基于TCP协议之上提供可靠的端到端安全服务。应用SSL协议最普遍的是HTTPS,它为客户浏览器和Web服务器之间交换信息提供安全通讯支持。它使用TCP的443端口发送和接收报文。

 
16下列可以正确建立线程的方法是 ?
  • ①.继承java.lang.Thread类,并重写run(  )方法
  • ②.继承java.lang.Runnable类,并重写start(  )方法
  • ③.实现java.lang.Thread接口,并实现run(  )方法
  • ④.实现java.lang.Runable接口.并实现run(  )方法
D

用Thread类的构造方法Thread(Runnable target)建立线程对象时,构造方法中的参数必须是一个具体的对象,该对象称做线程的目标对象,建立目标对象的类必需要实现Runnable接口。

 
 
17given the following code,what will be the output?
 1 class Value{
 2     public int i=15;
 3 }
 4 public class Test{
 5     public static void main(String argv[]){
 6         Test t=new Test( );
 7         t.first( );
 8     }
 9 
10 public void first( ){
11     int i=5;
12     Value v=new Value( );
13     v.i=25;
14     second(v,i);
15     System.out.println(v.i);
16 }
17 
18 public void second(Value v,int i){
19     i = 0;
20     v.i = 20;
21     Value val = new Value( );
22     v = val;
23     System.out.println(v.i+" "+i);
24    }
25 }

 

 
A
 
18若是但愿在网络中经过某个类的对象包装数据进行传输,那么这个类须要实现下面哪...

若是但愿在网络中经过某个类的对象包装数据进行传输,那么这个类须要实现下面哪一个接口?()

C
 
19linux查看系统IP地址以及网卡流量可使用如下哪一个命令
 
B

Windows下是ipconfig,Linux下是ifconfig

 
20数据的存储结构是指____。
 
D

暂无

 
21封装、继承和多态是面向对象编程的三大特征,在java 开发过程当中有着普遍应用。如下关于它们的描述不正确的是: ( )
 
B

答案:B解析:根据《系统集成项目管理工程师教程(第2版)》第137页,继承表示类之间的层次关系(父类与子类),这种关系使得某类对象能够集成另一类对象的特征。因此继承关系中共有类属性只要在父类中进行说明便可,子类不须要了。

 

2、多选题(共8题,每题5分)

1在Java语言中,下列关于字符集编码(Character set encoding)和国际化(i18n)的问题,哪些是正确的?
 
C,D

收到不少赞,感谢诸君阅读捧场
在此针对评论区的一些意见发表以下声明:

  1. 这个回答不会给你解释题目与分析解题过程。这个回答的目的是科普。为的是从根本上向你们解释清楚Unicode的玩法。若是读者只是想了解解题过程和选项分析,请看本题的推荐答案。
  2. 一些朋友说这个答案是复制粘贴过来的。我想一千个读者有一千个哈姆雷特。我不管说什么其实都没法改变读者心里认定的那个结论。因此,你们开心就好。为了这个目的,你们不妨先问问本身是否是真的想要了解Unicode的基础知识?若是是,那么欢迎您继续下面的旅程。

不少人都把Unicode编码挂在嘴边,其实我们现实生活中遇到的编码基本都是Unicode的

由于Unicode兼容了大多数老版本的编码规范例如 ASCII

Unicode编码定义了这个世界上几乎全部字符(就是你眼睛看到的长那个样子的符号)的数字表示

也就是说Unicode为每一个字符发了一张身份证,这张身份证上有一串惟一的数字ID肯定了这个字符

在这个纷乱世界上存在的惟一性。Unicode给这串数字ID起了个名字叫[码点](Code Point)

而不少人说的编码实际上是想表达[Unicode转换格式](即UTF,Unicode Transformation Formats)

有没有以为眼前一亮豁然开朗?没错 这就是咱们看到的UTF-8/UTF-16/UTF-32的前缀来源

这个[Unicode转换格式]的存在是为了解决[码点]在计算机中的二进制表现形式而设计的

毕竟咱们的机内表示涉及存储位宽,兼容古老编码格式,码点是数值过大的罕见字符等问题

[码点]通过映射后获得的二进制串的转换格式单位称之为[码元](Code Unit)。也就是说若是有一种UTF的码点二进制表示有n字节,其码元为8位(1个byte),那么其拥有码元n个。每种UTF的码元都不一样,其宽度被做为区分写在了UTF的后缀——这就是UTF-8/UTF-16/UTF-32的由来。UTF-8的码元是8位的,UTF-16的码元是16位的。大部分的编程语言采用16位的码元做为机内表示。这就是咱们在各类语言中调用获取一个字符串中character的数量时会出现这么多混乱的缘由。事实上咱们调用这些方法时取得的不是字符个数,而是码元个数!一旦咱们的字符串中包含了位于基本平面以外的码点,那么就会须要更多的码元来表示,这个时候就会出现测试时常见的困惑——为什么return的字符数比实际字符数要多?因此实际写代码时要特别注意这个问题。

采起不一样的映射方式能够获得不一样格式的二进制串,可是他们背后所表示的[码点]永远是一致的就好像你换身份证可是身份证号不变同样。因为平时人们误把[转换格式]也称为[编码],因此形成今天Unicode/UTF傻傻分不清楚且遣词造句运用混乱的悲桑局面。

Unicode 编码 发展到今天 扩展到了 21 位(从 U+0000 到 U+10FFFF )。这一点很重要: Unicode 不是 16 位的编码, 它是 21 位的。这 21 位提供了 1,114,112 个码点,其中,只有大概 10% 正在使用,因此还有至关大的扩充空间。

编码空间被分红 17 个平面(plane),每一个平面有 65,536 个字符(正好填充2个字节,16位)。0 号平面叫作「基本多文种平面」( BMP, Basic Multilingual Plane ,涵盖了几乎全部你能遇到的字符,除了 emoji(emoji位于1号平面 - -)。其它平面叫作补充平面,大可能是空的。

总结一下各类编码格式的特质:

UTF-32

最清楚明了的一个 UTF 就是 UTF-32 :它在每一个码点上使用整 32 位。32 大于 21,所以每个 UTF-32 值均可以直接表示对应的码点。尽管简单,UTF-32却几乎历来不在实际中使用,由于每一个字符占用 4 字节太浪费空间了。

UTF-16 以及「代理对」( Surrogate Pairs )的概念

UTF-16要常见得多,它是根据有 16 位固定长度的码元( code units 定义的。UTF-16 自己是一种长度可变的编码。基本多文种平面(BMP)中的每个码点都直接与一个码元相映射。鉴于 BMP 几乎囊括了全部常见字符,UTF-16 通常只须要 UTF-32 一半的空间。其它平面里不多使用的码点都是用两个 16 位的码元来编码的,这两个合起来表示一个码点的码元就叫作代理对( surrogate pair 

UTF-8

UTF-8 使用一到四个字节来编码一个码点。从 0 到 127 的这些码点直接映射成 1 个字节(对于只包含这个范围字符的文原本说,这一点使得 UTF-8 和 ASCII 彻底相同)。接下来的 1,920 个码点映射成 2 个字节,在 BMP 里全部剩下的码点须要 3 个字节。Unicode 的其余平面里的码点则须要 4 个字节。UTF-8 是基于 8 位的码元的,所以它并不须要关心字节顺序(不过仍有一些程序会在 UTF-8 文件里加上多余的 BOM)。

有效率的空间使用(仅就西方语言来说),以及不须要操心字节顺序问题使得 UTF-8 成为存储和交流 Unicode 文本方面的最佳编码。它也已是文件格式、网络协议以及 Web API 领域里事实上的标准了。

咱们的JVM中保存码点是UTF16的转换格式,从char的位宽为16位也能够看得出来。因为绝大部分编码的码点位于基本平面,因此使用16位能够几乎表示全部经常使用字符。这就是许多语言编译器或运行时都使用UTF16的缘由。英文在使用UTF16时也是2字节表示的。当咱们想要使用其余平面的字符时,码元超过2个字节,就须要使用代理对在语言中的特定表示方式,譬如‘\U112233’之类的。

使用UTF8时,经常使用的Alphabet和Numeric都在前127字节,被有效率地用一个字节表示。而咱们的中文因为排在1920个码点以后,因此使用3个字节表示,这方面就比UTF16转换格式耗费更多空间。

最后,不论使用哪一种UTF转换格式,都是程序员本身能够选择的一种表达方式而已。咱们能够经过Java方便的API进行自如转换。

 
2下列说法错误的有( )
 
A,B,C,D

答案:ABCD 作这题其实要区分:C的过程,C++的函数,Java的方法。再看题目,就知道考点了。 java不容许单独的方法,过程或函数存在,须要隶属于某一类中。——AB错 java语言中的方法属于对象的成员,而不是类的成员。不过,其中静态方法属于类的成员。——C错 D问的是java调用方法和C调用过程,C+ + 的函数同样?确定不同。错

 
3关于Java中的字符串,下列说法错误的是
 
B,C

暂无

 
4Java异常处理的过程当中,那些实践是值得推荐的?
 
A,B,D

异常处理的过程当中,你遵循那些好的实践?

  • 异常处理在项目设计中是很是关键的,因此精通异常处理是十分必要的。异常处理有不少最佳实践,下面列举集中,它们提升你代码的健壮性和灵活性:
  • 调用方法的时候返回布尔值来代替返回null,这样能够 NullPointerException。因为空指针是java异常里最恶心的异常。
  • catch块里别不写代码。空catch块是异常处理里的错误事件,由于它只是捕获了异常,却没有任何处理或者提示。一般你起码要打印出异常信息,固然你最好根据需求对异常信息进行处理。
  • 能抛受控异常(checked Exception)就尽可能不抛受非控异常(checked Exception)。经过去掉重复的异常处理代码,能够提升代码的可读性。
  • 绝对不要让你的数据库相关异常显示到客户端。因为绝大多数数据库和SQLException异常都是受控异常,在Java中,你应该在DAO层把异常信息处理,而后返回处理过的能让用户看懂并根据异常提示信息改正操做的异常信息。
  • 在Java中,必定要在数据库链接,数据库查询,流处理后,在finally块中调用close()方法。
 
5如下JSP代码定义了一个变量,如何输出这个变量的值?
 
B,C,D

bean是Struts1的标签,先下载struts-taglib-1.3.10.jar,而后添加到lib.
测试代码:
pageEncoding="gbk"%>

 
jdk1.8中,下面有关java 抽象类和接口的区别,说法错误的是?
 
B,D
**接口能够有default、static方法,因此B是错的。** > interface A { > abstract void a(); > static void s() { > } > default void d(){ > > } > void b();//默认用abstract修饰 > int a = 0;//默认用static final 修饰 > }
 
7如下关于Redis的RDB 优缺点的说法正确的有?
 
A,B,C,D

RDB 优缺点

  • RDB 会生成多个数据文件,每一个数据文件都表明了某一个时刻中 redis 的数据,这种多个数据文件的方式,很是适合作冷备,能够将这种完整的数据文件发送到一些远程的安全存储上去,好比说 Amazon 的 S3 云服务上去,在国内能够是阿里云的 ODPS 分布式存储上,以预约好的备份策略来按期备份 redis 中的数据。
  • RDB 对 redis 对外提供的读写服务,影响很是小,可让 redis 保持高性能,由于 redis 主进程只须要 fork 一个子进程,让子进程执行磁盘 IO 操做来进行 RDB 持久化便可。
  • 相对于 AOF 持久化机制来讲,直接基于 RDB 数据文件来重启和恢复 redis 进程,更加快速。
  • 若是想要在 redis 故障时,尽量少的丢失数据,那么 RDB 没有 AOF 好。通常来讲,RDB 数据快照文件,都是每隔 5 分钟,或者更长时间生成一次,这个时候就得接受一旦 redis 进程宕机,那么会丢失最近 5 分钟的数据。
  • RDB 每次在 fork 子进程来执行 RDB 快照数据文件生成的时候,若是数据文件特别大,可能会致使对客户端提供的服务暂停数毫秒,或者甚至数秒。
 
8OutOfMemoryError异常在哪些数据区域中可能会出现?
 
A,C,D

程序计数器通常不会溢出。

 

3、判断题(共1题,每题5分)

1天猫双十一有个积分换墨盒的活动,总共有50万台天猫魔盒(box),每一个用户(user)能够用99个天猫积分(point)兑换一台魔盒,且每人限换一台。 请设计一套java接口并实现下单(order)逻辑。 参考(但不局限于)下面的下单逻辑: 一、建立订单 二、扣减用户积分 三、扣减魔盒库存 四、下单成功 同时请回答: 一、数据库表结构如何设计,有哪些表,分别有什么做用? 二、下单过程当中哪些地方可能成为瓶颈?如何解决或改善? 三、是否会用到数据库事务,哪些地方会用到?若是不用数据库事务,如何保证数据的一致性?
 
A

一、表的设计:①用户表usertable ,字段id,name,point,以及记录该用户是否曾经兑换过魔盒的标志字段hasdown,用0表示没有下过,1表示下过②魔盒表boxtable,字段allnumber表示总数,remainnumber表示所省的魔盒数量③订单表ordertable,字段id,userid,ordertime表示下单时间二、并发过程,当全部用户同时访问数据库,操做魔盒表和用户表时为了保证事务的一致性,有必要在业务逻辑处理的地方,即更改魔盒表中魔盒数量的代码块或接口和对用户表信息的处理地方处都要加上同步机制,事务回滚等措施三、用到的事务判断用户信息:积分是否大于99,是否曾经兑换过魔盒(hasdown是否为0),若是积分够又没兑换过,那么在兑换时用户表里的积分数要减去99,而且置hasdown为1操做魔盒表:判断魔盒剩余数是否大于0,若是大于0就进行兑换,并使魔盒数减1,订单表:当以上两个事务均完成时再向订单表里插入一条记录,包括用户id,下单时间附:接口Public void order(User user, Box box);

相关文章
相关标签/搜索