首页 > oppo一面(Java安卓)凉经?
头像
内推绿盟:NTAGkW3
编辑于 2020-08-02 14:50
+ 关注

oppo一面(Java安卓)凉经?

今天接到了oppo的一面(视频),为了这个原计划的成都车展没有好好逛...
正题;
oppo的面试官是一个小哥哥,很年轻估计毕业几年吧,全程很nice。我当时好像投错第一志愿第二志愿了(小哥说可以给我备注如果有后续的话就转成后端了《想想不应该提这个事 安卓好像竞争小很多,估计一志愿是后端,都不会收到面试通知吧》)
知道我没安卓经验就直接问java了
1.java常用集合及其区别(我大概说了一下Collection接口及Map接口下都有哪些接口及实现类,说了一下常用的Arrayllist, LInkedList,HashMap,Set,说了一下底层实现,优缺点。)
2.HashMap为什么要写hashcode()、equals();(abaaba乱说一通,判断对象相同否,不同的对象可能有相同的hash,进一步需要equals)
HashMap线程安全吗(不安全,concurrenthashmap)
3.线程池都有什么参数(没完全答出来,而且说的很乱,已经一两周没有看面试相关了),这个主要是ThreadPoolExcecutor

ThreadPoolExecutor 3 个最重要的参数:

  • corePoolSize : 核心线程数线程数定义了最小可以同时运行的线程数量。
  • maximumPoolSize : 当队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
  • workQueue: 当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。

ThreadPoolExecutor其他常见参数:

  1. keepAliveTime:当线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了 keepAliveTime才会被回收销毁;
  2. unit : keepAliveTime 参数的时间单位。
  3. threadFactory :executor 创建新线程的时候会用到。
  4. handler :饱和策略。关于饱和策略下面单独介绍一下。
4.并发中的锁有哪些,说一说。(我这个也答的及其混乱,我扯什么乐观锁一步步升级成重量级锁,说synchronized, Reentrylock?https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/Multithread/synchronized.md
5.final,finally,finallized区别(修饰符(举String的例子)、try-catch-finally、每个对象都有的finallized方法(用于JVM回收,这个没说出来))
6.说一说JVM的垃圾回收(回收针对的是Java堆,回收目标是对象,说了JVM堆的组成Eden啊 survive啊 old啊 ,说了下标记清除,复制,标记整理,说了下引用计数法,GC roots可达性分析算法。)
7.了解那些设计模式(说了单例,工厂,jdk代理;这个我都没有去看,就知道个概念好尴尬....)
8.不用“+”实现两个整数的相加(越是简单的面试的时候越不容易写...) 我只想到了要使用位运算,处理进位需要考虑
class Solution{
    public int add(int a, int b){
        if(b == 0) return a;
        int c = (a & b) << 1;
        int d = a ^ b;
        return add(d,c);
    }
}
9.看一下代码风格,让手写一个单例(脑子一打铁说我可以写个排序吗?这个简单啊)
import java.util.Arrays;

public class MySort {
	public static void main(String[] args) {
		int[] array = {10,-1,20,-20,15,30,45};
		System.out.println("before sort:"+Arrays.toString(array));
		quickSort(array, 0, array.length-1);
		System.out.println("after sort:"+Arrays.toString(array));
		
	}
	public static void quickSort(int[] arr,int start,int end) {
		if(start >= end) return;
		int left = start, right = end;
        //刚开始写个int left = arr[start],right = arr[end]...出来就越界 还没看出来 ***了
		int base = arr[start];
		while(left < right) {
			while(arr[right] >= base && left < right) right--;
			while(arr[left] <= base && left < right) left++;
			if(left > right) break;
			swap(arr,left,right);
		}
		arr[start] = arr[left];
		arr[left] = base;
		quickSort(arr, start, left-1);
		quickSort(arr, left+1, end);
		
	}
	public static void swap(int[] arr,int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}
public class Singleton{
    private volatile Singleton singleton;
    public Singleton(){};
    public static Singleton getInstance(){
        if(singleton == null){
            synchronized(Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
还有一些问题我忘了...
我这个面试的很常规简单,我看其他大佬都是什么框架啊,消息中间件啊。。。
然后就是反问环节很常规了。
菜鸡一轮游 再见hh....

就是简单记录一下。




更多模拟面试

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

热门推荐