您当前的位置: 首页 >  面试

庄小焱

暂无认证

  • 3浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

互联网面试问题以及答案20200508

庄小焱 发布时间:2020-05-22 09:55:05 ,浏览量:3

1.介绍一下项目(1-6)。(之后提问跟回答密切相关)

2.项目中提到spark streaming和spark,具体介绍一下技术

3.spark中常见算子,哪些算子会导致shuffle,groupbykey和reducebykey的区别

4.spark streaming容错这里卡了,跟面试官扯了扯hadoop容错

5.HBASE rowkey怎么设计的,以及项目中rowkey相关的问题扯了挺久

6.HBASE中数据读的过程,HBASE为什么快。

java:

7.java中线程安全和线程不安全的集合

 

线程安全

非线程安全

Collection

Vector

ArrayList、LinkedList

 

HashSet、TreeSet

Map

HashTable currenthashmap

HashMap、TreeMap

字符串

StringBuffer

StringBuilder

8.线程同步的具体方法,知道的方式都说说。

1同步方法,有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。

2同步代码块:即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。 注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 

3使用局部变量实现线程同步。如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

4使用特殊域变量(volatile)实现线程同步

a.volatile关键字为域变量的访问提供了一种免锁机制

b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新

c.因此每次使用该域就要重新计算,而不是使用寄存器中的值

d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量

5在java中新增了一个java.util.concurrent包来支持同步。

ReentrantLock类是可重入、互斥、实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。

6wait与notify关键字的来控制线程的同步。

7使用阻塞队列实现线程同步,前面5种同步方式都是在底层实现的线程同步,

8使用原子变量实现线程同步。在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,使用该类可以简化线程同步。

算法:9. 5G的文件排序,内存只有1G,追问 归并排序怎么实现?

将5G 数据,按照 100M 内存拆分,然后排序有序的数据,然后写入到 file1,file2…file100。传统的排序算法一般指内排序算法,针对的是数据可以一次全部载入内存中的情况。但是面对海量数据,即数据不可能一次全部载入内存,需要用到外排序的方法。外排序采用分块的方法(分而治之),首先将数据分块,对块内数据按选择一种高效的内排序策略进行排序。然后采用归并排序的思想对于所有的块进行排序,得到所有数据的一个有序序列。

10. 两数之和,追问:三数之和,三数之和回答了快排+双指针,面试官要求优化,没优化出来。

2.yarn调度原理,如何实现高可用

 

3.zookeeper怎么实现高可用:

 

4.数据结构有什么用,具体到二叉树有什么用,java中哪些地方用到了二叉树。

 数据库的存储,数据的算法的提高,算法的复杂度和空间复杂度的要求。

数据的查找利用到二分查找树 ,在hashmap中的利用的是的红黑树的来存储链表的节点大于8个的时候。等

二叉树的应用的场景:

哈夫曼编码,来源于哈夫曼树,在数据压缩上有重要应用,提高了传输的有效性,详见《信息论与编码》。 海量数据并发查询,二叉树复杂度是O(K+LgN)。二叉排序树就既有链表的好处,也有数组的好处, 在处理大批量的动态的数据是比较有用。 C++ STL中的set/multiset、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。查找最大(最小)的k个数,红黑树,红黑树中查找/删除/插入,都只需要O(logk)。 B-Tree,B+-Tree在文件系统中的目录应用。 路由器中的路由搜索引擎。

1. 介绍实验室cv算法项目,聊javaweb项目,负责的工作,项目需求功能

 

2. 权限管理模块的实现(这个地方还跟面试官argue一段时间,最终还是败下阵来)

 

3. 项目一些数据库表是如何设计的,有哪些字段

 

4. 项目的困难,如何克服 (至此40min过去了)

遇见的困难:1 没有接触微服务,springboot的相关的知识,先关的一些实际的商用软件开发没有接触过。2 以前写代码的时候没有空滤过代码的性能问题和优化的问题。3没有实际的接触过数据库的与优化问题。

解决方法:1自己下班的时间补习微服务和springboot的高级的相关的知识。自己在下班后练习一些小项目的,来补充微服务的这个知识。慢慢的接触到了微服务的springboot的相关的知识和一些高级的中间件的使用。解除了redis、MQ springboot……等相关的知识。2在自己做代码的测试的时候有意的看看程序的时间复杂度和空间复杂度,并在课后不断的刷题和学习相关的数据结构的和算法的相关的知识。3不断的学习深入的数据库的表的设计字段的优化,索引的优化操作,分库分表的优化,集群的搭建的相关操作,优化是数据的读写分离们相关操作。

5. spring中拦截器与过滤器的区别

过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。在一个请求到达Controller之前能够截获其请求,并且根据其具体情况对 HttpServletRequest 中的参数进行过滤或者修改。

如何在Filter中修改后台Controller中获取到的HttpServletRequest中的参数?只需要在Filter中自定义一个类继承于HttpServlet RequestWrapper,并复写getParameterNames、getParameter、getParameterValues等方法即可。

import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.filter.OncePerRequestFilter;

public class ModifyParametersFilter extends OncePerRequestFilter {

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		ModifyParametersWrapper mParametersWrapper = new ModifyParametersWrapper(request);
		filterChain.doFilter(mParametersWrapper, response);
	}

	/**
	 * 继承HttpServletRequestWrapper,创建装饰类,以达到修改HttpServletRequest参数的目的
	 */
	private class ModifyParametersWrapper extends HttpServletRequestWrapper {
		private Map parameterMap; // 所有参数的Map集合

		public ModifyParametersWrapper(HttpServletRequest request) {
			super(request);
			parameterMap = request.getParameterMap();
		}

		// 重写几个HttpServletRequestWrapper中的方法
		/**
		 * 获取所有参数名
		 * 
		 * @return 返回所有参数名
		 */
		@Override
		public Enumeration getParameterNames() {
			Vector vector = new Vector(parameterMap.keySet());
			return vector.elements();
		}

		/**
		 * 获取指定参数名的值,如果有重复的参数名,则返回第一个的值 接收一般变量 ,如text类型
		 * 
		 * @param name
		 *            指定参数名
		 * @return 指定参数名的值
		 */
		@Override
		public String getParameter(String name) {
			String[] results = parameterMap.get(name);
			if (results == null || results.length 
		            
关注
打赏
1657692713
查看更多评论
0.1329s