博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试总结一
阅读量:5341 次
发布时间:2019-06-15

本文共 4676 字,大约阅读时间需要 15 分钟。

这两天面试了5家公司,其中两家自研公司,3家外包到项目,总体面试情况还是不错,拿到了5个offfer,下面把

面试内容总结一下:

一:北京某自研公司(主要做虚拟机服务器)

到了公司就是填写资料,然后给了一份java试题,都是选择题,都是一些考察java基础的试题,总体上感觉没有

难度,主要考一些java基础语法以及javaseAPI的用法之类的。

1:静态代码块的用法,static{}主要是这个类第一次被使用时加载,可以是使用这个类的构造方法创建对象,也可以

是类.静态方法触发,静态代码块只会被加载一次,静态代码块初始化后存储在内存中方法区,所有

该类实例化的对象共享该代码块,一般情况下static代码块可以用来初始化容器资源。

class ClassDemo {		public static final String NUM = "1";		static {		System.out.println("===加载静态代码块===");	}	public static void test1() {		System.out.println("===静态方法===");	}}

可以在创建对象的时候触发,因为用到了ClassDemo类:

public class TestClass {	public static void main(String[] args) {		System.out.println("===执行main方法入口===");		new ClassDemo();	}}
===执行main方法入口======加载静态代码块===

  

也可以在 类.静态方法的时候触发:

public class TestClass {	public static void main(String[] args) {		System.out.println("===执行main方法入口===");		//new ClassDemo();		ClassDemo.test1();	}}
===执行main方法入口======加载静态代码块======静态方法===

  

但是在类.常量的时候不会触发:

public class TestClass {	public static void main(String[] args) {		System.out.println("===执行main方法入口===");		//new ClassDemo();		//ClassDemo.test1();		String num = ClassDemo.NUM;		System.out.println(num);	}}
===执行main方法入口===1

  

2:代码块的用法,{}主要在每次创建对象的时候被加载,用来对对象进行初始化,一般情况下是所以对象都共有的特征属性

可以放到代码块中,在匿名内部类用的比较多。

class ClassDemo {		public static final String NUM = "1";		static {		System.out.println("===加载静态代码块===");	}		{		System.out.println("===代码块用来初始化对象===");	}		public ClassDemo(){		System.out.println("===构造方法实例化对象===");	}		public static void test1() {		System.out.println("===静态方法===");	}}public class TestClass {	public static void main(String[] args) {		System.out.println("===执行main方法入口===");		new ClassDemo();	}}

运行结果:

===执行main方法入口======加载静态代码块======代码块用来初始化对象======构造方法实例化对象===

  

3:对象属性和方法都是封装到对象内部,然后放置在堆内存中,如果将栈中指向方法的引用(首地址)作为形式参数传递

给另一个方法,在另一个方法中修改该对象的成员属性,其实值会改变的,因为它操作的是同一个对象。

4:作用域的问题,局部变量(函数内部或者代码块内部,只在{}起作用)

5:子类继承父类后,实例化子类,加载过程是怎样的?实例化父类,只需要调用父类的构造方法即可,如果该类有静态代码块

先加载之,然后可以执行代码块,再然后是初始化成员变量,因为成员变量默认是有初始值的,然后在调用构造方法实例化对象。

如果调用子类的构造方法,那么在父类的构造方法的第一行其实有一个默认的语句super();就是隐式构造方法,然后在调用子类

构造方法。

6:接口与抽象类区别

接口:接口中只有抽象方法和常量,不能有普通方法,不能实例化对象

抽象类:更多的可以把它理解为一个父类,可以包含抽象方法,也可以包含普通方法,还可以包含普通成员变量,不能实例化

对象,但是可以有构造方法,由子类继承实例化对象。

 

试题都是比较基础的,然后人事和技术有沟通了一会,感觉都ok,但是由于期望薪资他们公司给不了,只是说目前只能给那么多,后期表现

好可以加薪(这个谁信啊,都是骗人的伎俩,之前就是吃这个亏),所以表示不能接受。

 

二:某国家电网项目(外包)

1:首先是自我介绍

2:大数据量,高并发的情况如何处理?

然后就是结合自己手头上正在做的项目介绍一下,我们主要做的是批量接口,上游系统推送数据给我们系统,我们进行处理,上游是定时器推送,

大概5分钟1000条以上,我们是根据每条单据涉及到的数据库表做一个汇总,涉及到多少表就启动多少个线程去处理(使用线程池分配线程),主要

是update或者是insert的操作,使用ibatis的批量操作接口,数据库层面主要是采用分表存储(设计多张数据结构相同的表)

3:redis服务器的搭建

由于处理的数据量比较大,所以对于查询接口可以将数据缓存到redis中,实现原理:每次上游系统调用查询接口,都会先到redis服务器中取查询,

如果有就直接返回数据,如果没有则到数据库中查询,返回给上游(同时向redis中放置一份)。当插入或者更新的时候,要及时把redis中的数据删除,

这样才能保证数据库中的数据是最新的。

4:bootstrap框架中一些常用的样式?

随便列举几个,比如table table-strip table-dotted等

 

这家面试给的等级是中级,待遇还可以接受,就是感觉电网方面技术不是很新。

 

三:某金融公司

1:自我介绍

2:内存模型

jvm虚拟机的内存分为几个区域:栈、堆、方法区、寄存器等,首先寄存器内存空间比较小,主要用来存放

指令,就是程序运行的一些命令,栈用来存放基本数据的值以及引用类型对象的地址,栈内存不是很灵活,通过

上下移动指针达到效果,然后就是堆,堆内存操作灵活,主要用来存储对象,其实堆内存中还开辟了一个常量池,

比如String常量池、Integer的常量池,用来存放经常用到的对象,如果常量池中存在,那么直接从常量池中获取,

如果不存在,则直接new一个,然后向常量池中放置一份。方法区主要用来存储静态变量。

3:垃圾回收机制

垃圾回收机制是java语句区别与C或者C++,C++中必须手动回收,如果程序员没有及时回收对象,当内存中的对象

堆积到一定程度时就会内存泄漏。但是jvm中有垃圾回收机制,在cpu空闲或者内存不足时,守候线程会启动垃圾回收,

但是即使有垃圾回收机制,还是有可能会有内存溢出的情况,因为对于强引用的对象是不会被回收的。

引用类型:

强引用:栈中有地址的指向的对象引用,正在使用的引用,这种引用即使内存不足,也不会被回收,会造成内存泄漏。

软引用:软引用需要引入softReference类,它是在内存充足的情况下不会被回收,但是在内存不足的情况下会被回收掉。

弱引用:weakHashMap类就是弱引用,弱引用不管内存是否充足,只要一被扫描到,都会被回收。

虚引用(幽灵引用):在内存中找不到对象,get值获取的都是null,可以用来判断该对象是否已经被回收。

4:concurrentHashMap的用法

首先讲一下HashMap与Hashtable的区别,HashMap类实现Map接口,存储key-value映射关系,内部的方法没有

synchronized修饰,所以都是非线程安全的,而且key或者value 的值可以为null。Hashtable类也是存储key-value

映射关系,内部方法都是synchronized修饰,所以都是线程安全的,key或者value都不能为null,否则抛空指针异常。

但是Hashtable使用的比较少,即使在并发量比较大的情况下一般也不会使用Hashtable,因为效率太低,这是就会考虑

使用concurrentHashMap,该类内部维护segment片段,每个片段的作用就相当于hashtable,这样不同的线程访问

时会操作不同的片段,就不存在线程安全问题,也不会降低存储效率。

5:异步线程与同步线程

在需要异步启动线程时,需要实现Runnable,然后将线程对象添加到线程池中,这样主线程返回结果,但是异步线程继续

执行。而同步线程实现callable,它需要多个线程执行完各自的任务后,将结果返回,又返回值的线程,其中get可以起到阻塞

线程的作用,类似于计数器的作用。

6:创建异步线程的几种方式

a:继承extends Thread,这种方式最后不要用,因为java中子父类的继承只支持单继承,所以子类继承thread类后,就没有

办法在继承其他的类

b:实现implements  Runnable接口,这样方式用的比较多,然后将子类对象作为参数传给Thread对象,然后调用start方法

就会启动run方法

c:线程池实现,java.util.concurrent,java并发包中future,futuretask,Executors,ExecutorService类都是支持线程池

创建的类,我们可以通过b创建线程对象,然后丢到线程池中运行。

使用线程池的好处就是减少内存的开销,因为创建线程以及销毁线程都需要占用内存,而线程池管理,来一个请求只需要分配一个

线程,执行任务完毕后,再将线程回收即可。

7:线程运行的几种状态?

a:实现Runnable后,调用start方法,此时线程处理待运行状态,等待cpu分配时间片

b:running状态,线程正在运行,执行任务

c:wait,等待状态,强制使线程等待,这种状态,需要notify,或者是notifyAll通知,才能再次回到a状态

d:sleep睡眠状态,强制使当前线程睡眠多长时间,时间到之后,到达a状态,等待分配时间片 

e:同步阻塞状态,例如两个线程同时访问公共资源,公共资源已经上锁synchronized,那么一个线程获取锁之后,运行

公共资源,那么另一个线程就会被阻塞在门外

f:dead状态,任务执行完毕,线程销毁

转载于:https://www.cnblogs.com/warrior4236/p/6819147.html

你可能感兴趣的文章
zoj 1232 Adventure of Super Mario
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
web.xml 中加载顺序
查看>>
pycharm激活地址
查看>>
hdu 1207 四柱汉诺塔
查看>>