秋招Android常见笔试题合集--Binrry(冰蕊)

阅文集团笔试题

单选题

  1. 数组初始化 给定如下代码:int x[4]={0};int y[4]={1};数组x和y的值为:

{0,0,0,0},{1,0,0,0}

  1. 十进制30转换成十六进制数是:

1E

  1. 下面哪个选择器可以选择同层级中所有第二个及其以后的

    元素:

这div p{}:选择

内所有

元素,不会是局限在

的下一级,而是不过

元素在第几级都会找到。
div>p{}: 表示儿子辈的p元素 ☑️

  1. 程序运行时,独占系统资源,只有程序本身能改变系统资源状态,这是指:

程序顺序执行的封闭性

  1. 衡量查找算法效率的主要标准是:

均匀查找长度

  1. 多播IP用的是哪类地址?

IPv4地址分为5类,其中A类、B类和C类地址为单播地址,E类地址为保留地址,IP组播使用的是D类IP地址。

  1. 规范了计算机之间的通讯的协议是?

TCP/IP

  1. 现有《择天记》,《我欲封天》两本小说,甲乙丙三人只能选择一本,则甲乙两人都选择《我欲封天》这本小说的概率为:

1/4。1*1*2 / 2*2*2

  1. 有如下代码,若n>=0; x=2;while(x

O(log₂n)

  1. 下面哪个HTML在大部分浏览器中是隐藏的?
    A.  
    B.  
    C.  
    D.  ☑️

多选题

  1. 高级语言编译一般包括哪些步骤?
    A.  预编译✖️
    B.   链接 ☑️
    C.  汇编✖️
    D.  编译☑️

高级语言源程序经编译后得到目标码程序,但它还不能立即装入机器执行,编译后得到的目标模块还需进行连接。连接程序找出需要连接的外部模块并到模块库中找出被调用的模块,调入内存并连接到目标模块上,形成可执行程序。执行时,把可执行程序加载到内存中合适的位置(此时得到的是内存中的绝对地址)就可执行产生运行结果。
在这里插入图片描述

  1. std::vector::iterator重载了下面哪些运算符?
    A.  ++ ☑️
    B.   >>✖️
    C.  == ☑️
    D.  *(前置) ☑️

  2. 哪些Linux命令可以用于文件读取?
    cat,tac,nl,more,less,head,tail

  3. 哪些属于JVM物理结构?
    堆、栈、本地方法栈、方法区

  4. 算法中可以利用分治法的场景是
    快速排序、二分搜索、大整数乘法、合并排序

判断题

  1. 万维网WWW所使用的协议是ftp?否✖️
  2. 所以苹果都是香蕉,所以西瓜都是苹果,所以所有西瓜都是香蕉?否✖️
  3. 添加链接描述在linux的kill命令中,INT信号可以强制终止进程?否✖️
  4. 计算机能直接识别汇编程序?否✖️
  5. TCP/IP协议的建立需要3次握手,而断开连接只需要2次?否✖️

问答题

  1. 阐述Java类加载流程?
    参考答案链接
  2. 简述下HandlerThread内部实现机制以及它的优缺点?
    参考答案链接
    优缺点
  3. 数据结构中,队列的核心思想是什么?Java中BlockingQueue的实现类有哪些(至少列3个)?阻塞队列与普通队列的区别是什么?
    参考答案链接
  4. Android系统或者App中用到的设计模式,至少写5个,列举使用场景。
    参考答案链接0
    参考答案链接1
  5. 请简述下android的listview的缓存原理和优化listview的方式,以及和recycleview的异同?
    参考答案链接0
    参考答案链接1
    参考答案链接2

同花顺笔试题

阅读题

  1. 以下展示的两个线程交互代码有什么问题
    public class Test
    {
    private static Object key=new Object();
    public static void main(String[] args)
    {
    SubThread t=new SubThread();
    t.start();
    try
    {
    key.wait();
    System.out.println(“主线程被唤醒”);
    }catch(InterruptedException e)
    {
    e.printStackTrace();
    }
    }

    public static class SubThread extends Thread
    {
    public void run()
    {
    System.out.println(“开启子线程”);
    synchronized(key)
    {
    try {
    Thread.sleep(3000);
    key.notify();
    } catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    }
    }
    }
    }

运行结果:
秋招Android常见笔试题合集--Binrry(冰蕊)_第1张图片
答案解析:
秋招Android常见笔试题合集--Binrry(冰蕊)_第2张图片
秋招Android常见笔试题合集--Binrry(冰蕊)_第3张图片中文解释:

wait()方法> 使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。换句话说,这个方法的行为就像它只是执行调用等待(0)一样。

当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器唤醒的线程。然后线程等待,直到它能够重新获得监视器的所有权并恢复执行。

此方法只能由作为此对象监视器所有者的线程调用。有关线程可以成为监视器所有者的方法的描述,请参阅通知方法。

IllegalMonitorStateException-如果当前线程不是对象监视器的所有者。
InterruptedException-如果任何线程在当前线程等待通知之前或当前线程中断当前线程。引发此异常时,当前线程的中断状态将被清除。

notify()方法
唤醒等待此对象监视器的单个线程。如果有任何线程正在等待这个对象,则选择其中一个线程被唤醒。选择是任意的,由实现者自行决定。线程通过调用其中一个等待方法来等待对象的监视器。
在当前线程放弃对该对象的锁定之前,唤醒的线程将无法继续。唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极竞争以在此对象上同步;例如,唤醒的线程在成为下一个锁定此对象的线程时没有可靠的特权或劣势。

此方法只能由作为此对象监视器所有者的线程调用。线程通过以下三种方式之一成为对象监视器的所有者:
1.通过执行该对象的同步实例方法。
2.通过执行同步对象的同步语句的主体。
3.对于类类型的对象,通过执行该类的同步静态方法。
每次只有一个线程可以拥有对象的监视器。

IllegalMonitorStateException-如果当前线程不是此对象监视器的所有者。

参考答案:
两个线程交互会抛出IllegalMonitorStateException,因为key.wait()在主线程,而key.notify()在子线程,所以key.wait()在主线程调用时key不是此对象监视器的所有者,所以抛出IllegalMonitorStateException。

  1. 有三个bean A,B,C;其中A依赖于B,B依赖于C,C又依赖于A;这样是否能正常启动?如果不能,阐明原因和解决方法。

基础题

  1. 将一个fragment加入回退栈时,它会经历哪些生命周期?将它从回退栈中恢复出来时,会经历哪些生命周期?

参考答案:
add Fragment的时候,不管加不加入回退栈都一样,经历的生命周期如下:onAttach、onCreate、onCreateView、onActivityCreate、onStart、onResume;
removeFragment的时候,经历的生命周期如下:onPause、onStop、onDestroyView,如果不加回退栈还会继续走onDestroy、onDetach;remove的时候不仅从mAdded中移除fragment,也从mActive中移除了
attach/detach Fragment的前提都是已经add了的fragment,其生命周期回调不受回退栈影响。attach的时候onCreateView、onActivityCreate、onStart、onResume会被调用;detach的时候onPause、onStop、onDestroyView会被调用,onDestroy、onDetach不会被调用;对应的fragment只是从mAdded中移除了;

  1. 简述Java中ConcurrentHashMap数据写入Put方法的逻辑过程

  2. 利用反射机制获取某个类的构造方法有哪些?

  3. 描述一下HotSpot JVM的内存结构,说明每块区域对应的功能。

  4. jvm中如何确定一个对象可以被垃圾回收器回收,如果不了解jvm的实现,也可以讲述一下你自己的想法。

  5. 列出一些常用的jvm参数,并描述每个参数的作用。
    JVM参数详细列表

  6. 下面制定jvm参数 -Xmx50M,执行结果是什么?为什么?

import java.lang.ref.SoftReference;

public class Test1 {

	private static class Bigger
	{
		public int[] values;
		public String name;
		public Bigger(String name)
		{
			this.name=name;
			values=new int[1024];
		}
		
	}

	public static void main(String[] args) {
		int count =100000;
		SoftReference[] values=new SoftReference[count];
		for(int i=0;i(new Bigger("Bigger-"+i));
		}
		for(int i=0;i<10;i++)
		{
			System.out.println(((Bigger)(values[i].get())).name);
		}
	}

}

eclipse设置jvm参数 -Xmx50M,执行结果是
在这里插入图片描述
答案解析:
-Xmx :设置最大的java堆大小
秋招Android常见笔试题合集--Binrry(冰蕊)_第4张图片
中文解释:
软引用对象,由垃圾收集器根据内存需求自行清除。软引用通常用于实现内存敏感缓存。

假设垃圾收集器在某个时间点确定一个对象可以软访问。此时,它可以选择原子地清除对该对象的所有软引用,以及对通过强引用链可以从中访问该对象的任何其他软可访问对象的所有软引用。同时或在以后的某个时间,它将把那些新清除的、在引用队列中注册的软引用排队。

在虚拟机抛出OutOfMemoryError之前,对软访问对象的所有软引用都将被清除。否则,不会对清除软引用的时间或清除对不同对象的一组此类引用的顺序设置约束。然而,鼓励虚拟机实现偏向于清除最近创建或最近使用的软引用。

此类的直接实例可用于实现简单缓存;此类或派生子类也可用于更大的数据结构中,以实现更复杂的缓存。只要软引用的引用是强可达的,也就是说,它实际上正在使用中,就不会被清除。因此,例如,复杂的高速缓存可以防止其最近使用的条目被丢弃,通过保持强引用到这些条目,剩下的条目将被丢弃在垃圾收集器的自由裁量权。

参考答案:
因为把设置最大的java堆大小为50M,而且创建100000个软引用过程中前面的引用已经被回收了,所以只剩第94127-99999个存在了,其他不存在,所以访问第0-9个是会抛出空指针异常。
秋招Android常见笔试题合集--Binrry(冰蕊)_第5张图片
秋招Android常见笔试题合集--Binrry(冰蕊)_第6张图片

  1. Service有几种启动方式,不同的启动方式生命周期有何区别?

  2. 描述一个进程在内存中的布局和具体的作用。一个进程能使用的内存地址空间有多大?如果超出这个限制,程序会报什么错误?如何访问(读、写)另外一个进程的内存?

  3. 我们知道,本机拷贝执行cp指令,linux上从另一个服务器上拷贝文件到本机应该执行什么指令?

  4. 一个在被其他程序占有(打开,甚至还在读写)的文件,能删除这个文件吗?假如不能删除,说说为什么?假如能删除,说说程序后续怎么对文件读写?

  5. 有一串数字100,15,20,17,16,23,使用快速排序算法从小到大进行排序,经过两轮循环后的数字顺序是?

  6. 类中的静态函数为什么不能操作对象的非静态成员?

  7. 函数模版与类模版有什么区别?

  8. 针对你熟悉的编程语言,说一下全局变量和局部变量有什么区别?

  9. 你知道有哪些字符集编码格式?常见的乱码原因有哪些?

  10. 类成员函数的重载、覆盖和隐藏区别?并说明主要的应用场合?

开放逻辑题

  1. Spring bean如何保持线程安全,为什么?

编程题

  1. 现有集合:ArrayList list=new ArrayList();利用反射机制在这个泛型为Integer 的ArrayList中存放一个String类型的对象。

  2. 写一个多线程下会造成死锁的代码示例,并说明如何避免这类问题的发生。

  3. 合并两个有序数组

  4. 整数n的因子的最小和

度小满笔试

单选题

  1. 对于非对称形式的对偶规划,下列说法错误的是:
    A.  原规划中的约束条件为等式约束,对偶规划中与此对应的变量取值一定非负✖️
    B.  原模型约束条件为小于等于,对偶约束条件为大于等于☑️
    C.  原规划的某个变量的值没有非负限制,对偶问题中与此变量对应的约束为等式☑️
    D.  模型的目标为max,对偶模型的目标为min☑️

秋招Android常见笔试题合集--Binrry(冰蕊)_第7张图片秋招Android常见笔试题合集--Binrry(冰蕊)_第8张图片详情见「运筹学 ( 对偶问题及性质)」

  1. 在一个双链表中,若删除P所指结点,则执行
    A.  p->next=p->next->next
          delete p;
    B.  p->next=p->prior;
          delete p;
    C.  p->next->prior=p->next;
          p->next=p->prior;
          delete p;
    D.  p->prior->next=p->next;
          p->next->prior=p->prior;
          delete p;

秋招Android常见笔试题合集--Binrry(冰蕊)_第9张图片

  1. 下面程序段输出的结果为
    秋招Android常见笔试题合集--Binrry(冰蕊)_第10张图片A.  [Wat,Wat]
    B.  [Wat,CAT]
    C.  [CAT,Wat]
    D.  [CAT,CAT]

个人理解:
String aStr是变量,放在栈中,而new String(“CAT”)是对象,放在堆中,“CAT"是常量,放在常量池(方法区)中,aStr.toLowerCase()是新生成了"cat"常量,但是没有把aStr引用重新指向"cat”,所以aStr仍然指向"CAT"常量,aStr.replace(“c”, “W”);同理。而String bStr也是变量,放在栈中,String bStr=aStr;是把 bStr指向与aStr相同的常量,即"CAT"。
秋招Android常见笔试题合集--Binrry(冰蕊)_第11张图片
秋招Android常见笔试题合集--Binrry(冰蕊)_第12张图片

  1. 表达式a*(b+c)-d*(e-f)的后缀表达式是( )
    A.  abc*+def*--
    B.  bc+a*ef-d*-
    C.  ab+c*de-f*-
    D.  abc+*def-*-

详情见「实现中缀表达式转后缀表达式」秋招Android常见笔试题合集--Binrry(冰蕊)_第13张图片

  1. 在编译打包Android资源的过程中,下列哪一项为打包资源的第一步?
    A.  编译Java文件,生成对应的.class文件
    B.  编译AIDL文件,生成对应的.java文件
    C.  打包生成未签名的.apk文件
    D.  打包资源文件,生成R.java文件

第一步:打包资源文件,生成R.java文件
第二步:编译AIDL文件,生成对应的.java文件
第三步:编译Java文件,生成对应的.class文件
第四步:将.class文件转化成Davik VMd的.dex文件
第五步:打包生成未签名的.apk文件
第六步:对未签名的.apk文件签名
第七步:对已签名的.apk文件对齐处理
详情见「Android应用程序(APK)的编译打包过程」

  1. 含有n个顶点、e条边的有向图采用邻接表存储,若删除与某个顶点V相关出边的时间复杂度为( )
    A.  O(n)
    B.  O(n+e)
    C.  O(n*e)
    D.  O(e)☑️

详情见「参考1、参考2」

  1. 在现实开发中,往往要设置不同屏幕中,元素的位置不会发生改变,所使用的技术是( )
    A.  @media screen☑️
    B.  @media mouse
    C.  @media print
    D.  @media key

详情见「牛客网试题」秋招Android常见笔试题合集--Binrry(冰蕊)_第14张图片

  1. 对于Socket的描述正确的是()
    A.  只能使用TCP协议
    B.  安全性较高
    C.  只能使用UDP协议
    D.  是一种较为底层的网络开发技术☑️

详情见「Socket与底层数据传输实现、Socket实现通信」

  1. 在MySQL数据库中,返回表TABLE_NAME中字段col的结果唯一,去除此字段重复的记录,下面哪个选项的查询语句是正确的?
    A.  select UNIQUE col from TABLE_NAME;
    B.  select ONE col from TABLE_NAME;
    C.  select DISTINCT col from TABLE_NAME;☑️
    D.  select SINGLE col from TABLE_NAME;

详情见「MySQL Distinct 去掉查询结果重复记录」

  1. 在超文本传输协议中,http2.0响应速度明显比http1.1快,主要原因是( )
    A.  http 2.0 使用ASII码传输
    B.  http 2.0 使用二进制分帧☑️
    C.  http 2.0 使用多次TCP连接
    D.  http 2.0 使用传输层UDP协议

http 2.0 的核心优势有:

  1. 使用二进制格式传输首部和实体数据,而非http1.1的实体文本格式,二进制格式解析更高效,更紧凑,错误更少。
  2. 使用多路复用,而非有序并阻塞的——一个连接一次只能提交一个请求,虽高效但多了会慢。多路复用是一个通道可以让多条线路同时占用而不搞混,主要通过为每个请求带一个编号,这样服务器会根据编号回应或找回该请求。
  3. 对消息头采用Hpack进行压缩传输,节省消息头占用的网络流量和带宽资源。
  4. 服务器推送,服务器主动向客户端推送所需要的资源到客户端的缓存,减少来回请求响应的时间。
  5. 对http1.1向下兼容
    详情见「核心优势在哪里、HTTP/2.0与HTTP/1.1协议区别」
  1. 有关于Android项目工程的assets目录的作用,以下正确的是
    A.  放置字符串等常量数据
    B.  放置布局文件
    C.  放置多媒体等文件☑️
    D.  放置应用的图片资源

详情见「牛客网试题」

  1. 在Java中,关于集合ArrayList,LinkedList和Vector三者说法正确的是( )
    A.  LinkedList因为底层实现为双向链表,所以在做查询的时候效率高
    B.  ArrayList是一个动态数组,可以放任意对象,而且线程安全的
    C.  Vector也是一个动态集合类,而且是线程安全的,底层使用的Map实现的
    D.  ArrayList的底层实现是Object[],放入ArrayList的对象,都存储在Object[]中

  2. 以下( )不是反射机制的主要功能
    A.  在运行时调用任意一个类所具有的成员变量和方法
    B.  在运行时构造任意一个类的对象
    C.  在运行时判断任意一个对象所属的类☑️
    D.  在运行时调用任意一个对象的方法,生成静态代理

  3. 序列{9,3,21,9,15,13}的最长上升子序列长度为( )
    A.  4
    B.  3☑️
    C.  2
    D.  5

多选题

  1. 在正常网络环境下,如果程序无法连接网络,可能的问题是
    A.  未在Manifest文件中请求网络权限☑️
    B.  与其他应用发生冲突
    C.  偶发事件,刷新即可
    D.  用户在安卓设置中屏蔽了该程序的网络权限☑️

在AndroidManifest.xml文件里设置权限:

  1. 以下哪些文件可以放在assets目录下面
    A.  test.mp3☑️
    B.  test.3gp☑️
    C.  test.xml☑️
    D.  test.png☑️

assets和res目录的区别在于Android不为assets目录下的文件生成ID,访问需指定文件路径和文件名。详情见「android 中assets的作用和用法」
视频(3gp、mp4、wmv)、图片、xml文件等都可以放在assets目录下

  1. linux服务器已经启动apache服务,查看apache服务的进程,仅输出此服务的进程ID,以下语句正确的是
    A.  ps -ef | \grep httpd | \grep -v grep | \awk ‘{print $2}’
    B.  ps -ef | grep httpd | grep -v grep | awk '{print $2}'☑️
    C.  ps -ef | grep httpd | grep -v grep | awk ‘{print $1}’
    D.  ps -ef | grep httpd | awk ‘{print $2}’

ps -ef | grep httpd查看httpd的进程,详情见「Linux下Apache服务的查看和启动」
kill -9 ps -ef|grep cpu|grep -v grep|awk '{print $2}'命令解析

  1. 下列关于拓扑排序说法错误的有( )
    A.  拓扑排序的有向图中,最多存在一条环路✖️
    B.  若一个有向图无环,则它一定有唯一的拓扑序列✖️
    C.  一个有向无环图的拓扑排序序列一定是唯一的✖️
    D.  在有向图G的拓扑序列中,若顶点Vi在顶点Vj之前,则G中可能没有弧

拓扑排序只适用于有向无环图,详情见「A关于拓扑排序的几点总结、B牛客网、C牛客网、D填空题」

  1. 使用Intel HAXM加速器,宿主机必须满足的条件有( )
    A.  必须使用Intel CPU☑️
    B.  必须将Android Studio安装在系统盘✖️
    C.  至少有8GB物理内存✖️
    D.  必须支持硬件虚拟化☑️

详情见「使用 Intel HAXM 为 Android 模拟器加速,媲美真机、Intel HAXM的那些坑」

  1. HTML5可以更简单的让你开发应用时( )
    A.  删除本地缓存
    B.  访问本地文件☑️
    C.  进行本地数据存储
    D.  更快速的加载页面☑️

详情见「AC、B、C、DandD」
更多详情见「HTML5开发移动应用有哪些优点、Html5与App的优缺点」

编程题

  1. 棋盘遍历

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB

题目描述:
棋盘由N行M列的方格组成,棋盘上只有一个棋子,初始时棋子位于第一行第一列的方格上,每次可以将棋子往上下左右中的一个方向移动到相邻方格上。现在要求不断移动棋子使其经过每个方格至少一次且最后回到第一行第一列的方格上,那么至少需要移动多少次?

输入
输入两个空格隔开的整数N和M,1≤N,M≤109。
输出
输出最少的移动次数。

样例输入
2 2
样例输出
4

核心思路
分成4种情况:N==1,M==1,N%2==0||M%2==0,N和M都是奇数。

正确代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int N=in.nextInt();
int M=in.nextInt();
if(N==1)
{
if(M<=2)
{
System.out.println(M);
}
else
{
System.out.println((M-1)*2);
}
}
else if(M==1)
{
if(N<=2)
{
System.out.println(N);
}
else
{
System.out.println((N-1)*2);
}
}
else if(N%2==0||M%2==0)
{
System.out.println(N*M);
}
else
{
System.out.println(N*M+1);
}
}
}

  1. 隔山打牛

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
“你可曾听闻一招从天而降大掌法?”
在一部游戏中有这样一个技能,假设地图是一条直线,长度为n,人物所处的位置是x,则可以对x,2x和2x+1三格内的敌人分别造成一点伤害,要求2*x+1<=n。
设为这个地图的格子做标记为1-n,第i个格子中有一个血量为a_i的敌人。请问你至少使用多少次技能,可以杀死这个地图上所有敌人。
输入
输入第一行包含一个正整数n,表示格子的数量(1<=n<=100)
输入第二行包含n个正整数a_i,表示第i个格子中敌人的血量。
输出
输出仅包含一个正整数,即至少使用多少次技能。
样例输入
5
1 2 3 4 5
样例输出
8

核心思路

参考代码(可能有错):
import java.util.;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] num=new int[n+1];
for(int i=1;i<=n;i++)
{
num[i]=in.nextInt();
}
int sum=0;
int xmax=(n-1)/2;
for(int i=1;i<=xmax;)
{
int two=i
2,three=i*2+1;
if(num[i]>0 || num[three]>0)
{
sum++;
if(num[i]>0)
{
num[i]–;
}
if(num[two]>0)
{
num[two]–;
}
if(num[three]>0)
{
num[three]–;
}
}
else
{
i++;
}
}
for(int i=1;i<=n;i++)
{
if(num[i]>0)
{
sum+=num[i];
}
}
System.out.println(sum);
}
}

百度笔试

单选题

  1. 以下代码的执行结果是()
public class B {

	public static void main(String[] args) {
		StringBuffer a=new StringBuffer("A");
		StringBuffer b=new StringBuffer("B");
		operate(a,b);
		System.out.println(a+","+b);

	}

	private static void operate(StringBuffer x, StringBuffer y) 
	{
		x.append(y);
		y=x;
	}

}

A.  AB,AB
B.  AB,B☑️
C.  A,AB
D.  AB,A

下面?是手写答案过程的GIF动图
秋招Android常见笔试题合集--Binrry(冰蕊)_第15张图片

题目更多理解详情见「一道面试题、java+内存分配及变量存储位置的区别、String,StringBuffer,StringBuilder三者的使用方法和区别、证明StringBuffer线程安全,StringBuilder线程不安全」

  1. 下图中,从A点开始使用Prim算法,构成最小生成树,请按顺序写出添加的边为( )
    秋招Android常见笔试题合集--Binrry(冰蕊)_第16张图片
    A.  (A,B),(B,C),(A,F),(A,G),(F,H),(H,E),(C,D)☑️
    B.  (A,B),(B,C),(A,G),(A,F),(F,H),(F,E),(C,D)
    C.  (A,B),(A,F),(A,G),(B,C),(C,D),(C,E),(E,H)
    D.  (A,B),(B,C),(A,F),(F,H),(H,E),(E.C),(C,D)

详情见「 Java 图的最小生成树 — prim算法和kruskal算法」

  1. 假设G是无向连接图,且G的所有边具有正权重,则以下论述错误的是( )
    A.  如果G的边有不同权重,则G的最小生成树是唯一的
    B.  如果G的边有不同权重,即使对G的所有边权重进行平方,G的最小生成树也是不变的
    C.  如果G的边有不同权重,且e是G中最大权重,则不存在包含e的最小生成树✖️
    D.  如果e是G中最小权重边,则不一定存在包含e的最小生成树

C中若该e是割边,最算它是G中最大权重,也必须选择。
D中若e边的两个顶点其它边的权重与e相同,则不一定选择e

  1. 查找students表中班级中年龄大于18的人数大于等于10的班级,以下查询语句正确的是( )
    A.  SELECT class,COUNT() AS num_stu FROM students GROUP BY class HAVING COUNT() >=10 WHERE age>18
    B.  SELECT class,COUNT() AS num_stu FROM students WHERE age>18 HAVING COUNT() >=10 GROUP BY class
    C.  SELECT class,COUNT() AS num_stu FROM students WHERE age>18 GROUP BY class HAVING COUNT() >=10☑️
    D.  SELECT class,COUNT() AS num_stu FROM students GROUP BY class WHERE age>18 HAVING COUNT() >=10

执行顺序:select --> where --> group by --> having --> order by
详情见「SQL中where, group by, having的用法和区别」

  1. -0.1011的补码为( )
    A.  0.0101
    B.  1.1011
    C.  1.0101
    D.  0.1011

详情见「原码、反码、补码知识详细讲解」

  1. 假设G是无向连接带权图,且G的所有边有不同的权重,权重可正可负,则以下论述正确的是( )
    A.  对G的所有边权重进行平方,G的最小生成树也是可能改变
    B.  e是G中最大权重边,则不存在包含e的最小生成树
    C.  G的最小生成树不是唯一的
    D.  如果e是G中最小权重边,则存在包含e的最小生成树

  2. 某算法的时间复杂度为T(n)=4n²,在某台计算机上实现并完成该算法需要t秒时间,另一台计算机的运行速度为该计算机100倍,则用这台计算机实现该算法,t秒内能解输入规模为多大的问题?
    A.  n
    B.  n²
    C.  10n
    D.  4n

  3. 一个从0开始计数存储空间为6的循环队列,当前front的rear的值分别为5和2,则加入两个元素又删除一个元素后的front和rear值分别为( )
    A.  0,3
    B.  4,0
    C.  0,4
    D.  3,0

  4. 权值W={3,2,7,1,4,5,9}的结点生成一棵哈夫曼树,则所生成哈夫曼树的带权路径长度为( )
    A.  80
    B.  77
    C.  65
    D.  79

  5. 上述程序的输入为:2 7 1 4 5 9 3 10 4 6程序的输出为( )

#include
using namespace std;
int c[1000];
int lowbit(int x)
{
return x&(-x);
}
void add(int x, int n)
{
while(x<=n)
{
c[x]+=1;
x+=lowbit(x);
}
}
int sum(int x)
{
    int ans=0;
    while (x>0) {
        ans += c[x];
        x -= lowbit(x);
    }
    return ans;
}
int main()
{
    int n=10,x;
    memset(c,0,sizeof(c));
    int ans=0;
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&x);
        ans += sum(x-1);
        add(x, n)
    }
    cout<<ans<<endl;
    return 0;
}

A.  29
B.  27
C.  30
D.  28

  1. 设一组初始记录关键字序列为(40,70,50,30,35,80,65,55,60,45),则堆排序法建立的初始堆为()
    A.  80,70,65,60,45,50,55,40,30,35
    B.  80,70,65,60,55,50,40,45,30,35
    C.  80,70,40,60,45,50,65,55,30,35
    D.  80,70,65,60,45,50,40,55,30,35

多选题

  1. 属于"10.10.72.176/28"同一网段的有效IP地址是( )
    A.  10.10.72.179
    B.  10.10.72.174
    C.  10.10.72.190
    D.  10.10.72.191

  2. 以下SharePreference.Edtor的apply和commit方法描述错误的是( )
    A.  commit方法有返回值
    B.  apply方法有返回值
    C.  apply原子操作后保存到内存
    D.  commit原子操作后保存到内存

  3. 常见的基本块优化项目包括:( )
    A.  合并已知量
    B.  删除无用赋值
    C.  删除子模块
    D.  删除多余运算

编程题

  1. List item

A.  
B.  
C.  
D.  

☑️✖️详情见「」

百度面试

  1. Android Handler消息机制原理

  2. 有哪些排序,归并和快排的实现

  3. HashMap的链表作用

    解决哈希冲突。 1、JDK1.7的HashMap是由数组+链表构成的,新增一个数通过哈希算法,计算出对应存放在数组的某个位置,如果这个位置已经存在数据了,也就是说存在了哈希冲突,这时候JDK1.7就将新增的数和原来的数构成一个链表放在数组这个位置,后面冲突的数依次都放入链表中。
    2、通常解决哈希冲突有两种办法,上面所说的通过链表的形式称为链地址法;还有一种方法称为开放地址法,也就是说如果存在哈希冲突了,那么将新增的值在用一个新的哈希算法算出所存的位置插入,但是这还会构成二次冲突,三次冲突…
    3、JDK1.8的HashMap是由数组+链表+红黑树构成,当链表长度超过8会自动转换成红黑树,红黑树节点个数小于6,又自动转换为链表。这是为了提高检索效率(红黑树检索效率明显是高于链表的)

  4. 哈希表的hashcode咋来的
    哈希表原理

  5. 同步和互斥

  6. 死锁

  7. HTTP常用方法

    > GET与POST的区别:
    GET在浏览器回退时是无害的,而POST会再次提交请求(★)
    GET产生的URL地址可以被收藏,而POST不可以
    GET请求会被浏览器主动缓存,而POST不可以(★)

    GET请求只能进行url编码,而POST支持多种编码方式

    GET请求参数会被完整保留在浏览器的历史记录里,而POST中的参数不会被保留(★)

    GET请求在URL中传送的参数是有长度限制的,而POST没有限制(★)

    对参数的数据类型,GET值接收ASCII字符,而POST没有限制

    对参数的数据类型,GET只接收ASCII字符,而POST没有限制

    GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息

    GET参数通过URL传递,POST放在Request body中(★)

  8. http协议中post方法发出请求 后端发送httpPost请求的2种方式
    http协议中post方法发出请求
    HttpPost请求将json作为请求体传入的简单处理方法

  9. 理解单链表的反转(java实现)

  10. activity和fragment的生命周期

  11. Service的启动方式
    Service的两种启动模式
    Service 理解和两种启动方式

  12. Socket套接字 socket通讯原理及例程(一看就懂)
    什么是Socket?

  13. 进程和线程

什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。

现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢?

答案就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。

有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。

由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。

我们前面编写的所有的Python程序,都是执行单任务的进程,也就是只有一个线程。如果我们要同时执行多个任务怎么办?

有两种解决方案:
一种是启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。

还有一种方法是启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。

当然还有第三种方法,就是启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用。

总结一下就是,多任务的实现有3种方式:
多进程模式; 多线程模式; 多进程+多线程模式。
同时执行多个任务通常各个任务之间并不是没有关联的,而是需要相互通信和协调,有时,任务1必须暂停等待任务2完成后才能继续执行,有时,任务3和任务4又不能同时执行,所以,多进程和多线程的程序的复杂度要远远高于我们前面写的单进程单线程的程序。

因为复杂度高,调试困难,所以,不是迫不得已,我们也不想编写多任务。但是,有很多时候,没有多任务还真不行。想想在电脑上看电影,就必须由一个线程播放视频,另一个线程播放音频,否则,单线程实现的话就只能先把视频播放完再播放音频,或者先把音频播放完再播放视频,这显然是不行的。

Python既支持多进程,又支持多线程,我们会讨论如何编写这两种多任务程序。
小结
线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。

Java进程与线程的区别 进程之间共享信息可通过TCP/IP协议,线程间共享信息可通过共用内存
进程是资源分配的最小单位,线程是CPU调度的最小单位。错误:线程是系统进行资源分配和调度的一个独立单位

进程是抢占处理机的调度单位;线程属于某个进程,共享其资源
线程是程序的多个顺序的流动态执行

线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径
线程没有自己独立的地址空间,多进程的程序比多线程的程序健壮

进程的切换比线程的切换开销大

Java进程和线程的关系
Java对操作系统提供的功能进行封装,包括进程和线程
运行一个程序会产生一个进程,进程包含至少一个线程
每个进程对应一个JVM实例,多个线程共享JVM里的堆

Java采用单线程编程模型,程序会自动创建主线程
主线程可以创建子线程,原则上要后于子线程完成执行
进程与线程的区别 进程的通信方式 线程的通信方式

  1. 数据结构面试题

  2. Java中关于内存泄漏出现的原因以及如何避免内存泄漏

  3. UDP&TCP的区别

  4. 数据库中的索引

    索引的优点
    1.通过创建唯一索引,可以保证数据库每一行数据的唯一性2.可以大大提高查询速度3.可以加速表与表的连接4.可以显著的减少查询中分组和排序的时间。

    索引的缺点
    1.创建索引和维护索引需要时间,而且数据量越大时间越长2.创建索引需要占据磁盘的空间,如果有大量的索引,可能比数据文件更快达到最大文件尺寸3.当对表中的数据进行增加,修改,删除的时候,索引也要同时进行维护,降低了数据的维护速度

  5. MySQL数据库优化的八种方式(经典必看)

  6. MySQL数据库事务的四大特性以及事务的隔离级别

  7. 多线程实现的四种方式

  8. 线程池-Java-五种线程池,四种拒绝策略,三种阻塞队列

  9. java泛型

  10. Java基础之—反射

  11. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

  12. java堆栈

  13. 操作系统中分段和分页的区别

  14. 为什么要使用对象包装器自动装箱拆箱

  15. TCP/IP模型分别有几层
    答:应用层、传输层、网络层、数据链路层

  16. synchronized和volatile:

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是
立即可见的。
2)禁止进行指令重排序。
volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
区别:
1.volatile仅能使用在变量级别;
synchronized则可以使用在变量、方法、和类级别的

2.volatile仅能实现变量的修改可见性,并不能保证原子性;
synchronized则可以保证变量的修改可见性和原子性

3.volatile不会造成线程的阻塞;
synchronized可能会造成线程的阻塞。

4.volatile标记的变量不会被编译器优化;
synchronized标记的变量可以被编译器优化

  1. 同步和异步的概念

招银电话面试

  1. java有几种实现线程的方式

答:四种,第一个是继承Thread类,第二个是实现Runnable接口,第三个是实现Callable接口,第四个是线程池,详情见「多线程实现的四种方式、 线程池-Java-五种线程池,四种拒绝策略,三种阻塞队列」

  1. Map的实现类,哪些线程安全

答:HashMap、HashTable、TreeMap、CurrentHashMap、LinkedHashMap、WeekHashMap,HashTable和CurrentHashMap是线程安全的,详情见「java中Map有哪些实现类和使用场景」

  1. 什么叫线程安全

答:当一个类能被多个线程进行访问和操作还能正确运行,那它就是线程安全。当多个线程访问某个类时,不管运行时环境采用何种调度方式和这些线程如何交替执行,并且在主调代码中不需要额外的同步和协同,这个类都能正常的执行,就称这个类是线程安全的。详情见「Java并发 - 什么是线程安全(一)」

  1. 事务的四种隔离级别

答:Read UnCommited读取未提交内容(啥都不可保证)、Read Committed读取已提交内容(可避免脏读)、Repeatable Read可重读(可避免脏读、不可重读)、Serializable可串行化(可避免脏读、不可重读、幻读)。详情见「 MySQL数据库事务的四大特性以及事务的隔离级别」

  1. 索引的优缺点

答:优点:(1)在查询时提高检索的速度(2)使用唯一索引保证表中每一行数据的唯一性(3)使用外健索引可以增强表与表的连接(4)在使用分组和排序查询语句时,可以减少分组和排序的时间(5)在查询时可以优化隐藏器,提升系统性能。
缺点:(1)创建索引需要时间,数据量越多需要时间越多(2)索引需要物理空间,聚集索引需要更多(3)数据增删改时需要动态维护索引,降低数据维护速度。
详情见「索引的优点和缺点」

  1. 怎么用队列实现栈

答:使用两个队列,主队列充当入栈,当要出栈时,先把主队列的数据一个个放到辅助队列中,直到主队列剩下最后一个元素时弹出该元素,再把辅助队列的元素一个个放回主队列中。详情见「用栈实现队列和用队列实现栈」

  1. 哪些排序,希尔排序,冒泡排序的时间复杂度

答:冒泡排序、选择排序、插入排序、希尔排序、归并排序、堆排序、快速排序、桶排序、计数排序、基数排序。详情见「数据结构十大经典算法(面试常问)」
秋招Android常见笔试题合集--Binrry(冰蕊)_第17张图片

  1. 冒泡排序的优化方法?

第一种:添加一个boolean值,在每一轮开始时设置为true,判断当前是否已经全部有序,当需要转换时设置为false表示未完全有序,如果当前一轮结束完boolean为true则跳出后面所有循环。

第二种:在第一种的基础上添加一个int值记录边界,在当需要转换时把最新的位置赋值给边界,这轮循环后更新边界值。

详情见「冒泡排序算法优化」

  1. 多态的实现方式

答:多态的前提:(1)要有继承关系(2)子类重写父类方法(3)父类引用指向子类对象

Java引用类型有两种:编译时类型和运行时类型
【例如】a对象编译时类型是Animal,运行时类型是Dog;
b对象编译时类型是Animal,运行时类型是Cat。
当运行时引用变量调用方法时,总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就表现出:相同类型的引用变量在调同一个方法表现出不同的行为特征,这就是多态。但对象的实例变量不具备多态性。详情见「多态性」

多态的出现在成员调用上的特点
在多态中,成员函数在多态调用时,编译看左边,运行看右边。成员变量和静态函数,无论编译和运行,都参考左边(引用型变量所属的类)。详情见「多态以及其优缺点」

多态调用方式表现为类引用调用和接口引用调用。(动态多态和静态多态)详情见「Java多态实现原理」
类引用调用主要用了上转型对象实现多态
上转型与下转型的区别:
上转型是把子类创建的对象赋值给父类的声明变量,比如Animal a=new Dog();//a为上转型对象
下转型是把上转型对象再还原为子类对象,比如:Dog d=(Dog)a;//d为下转型对象
接口引用调用:把接口声明的变量指向其实现类实例化的对象,那么接口就可以调用接口的抽象方法秋招Android常见笔试题合集--Binrry(冰蕊)_第18张图片
接口回调与上转型对象实现多态的区别与联系
①上转型对象多态的父类是普通类,接口回调都是父类是接口;
②接口回调父类方法更加的简洁,是抽象方法不需要有方法体;
③都是编译时显示父类方法行为特征,运行时显示子类行为特征。
详情见「实现多态的两种方式」

多个类中的多态实现方式可以通过实现接口、继承父类并重写方法、抽象类和抽象方法。单个类的多态实现方式表现为方法的重载。详情见「Java 多态」
重写与重载的区别:
(1)重写为子类方法和父类方法名、参数的个数和类型及顺序都与父类相同,访问权限不能低于父类,返回类型可以不同。final和private和static方法和构造方法不能被子类重写。
(2)重载的参数类型或个数或顺序必须不同,访问权限可以不同。返回类型不能做重载的判断。
详情见「Java 重写(Override)与重载(Overload)」
多态的出现在成员调用上的特点

多态的优缺点
优点:(1)减少类型之间的耦合度(2)提高了代码维护性(3)可替换性(4)可扩展性(5)灵活性(6)接口性(7)简洁性
缺点:(1)父类不能使用子类特有的成员变量和方法,必须向下转型成子类才可以。(2)对象的实例变量不具备多态性

  1. JRE和JDK

答:JRE(Java Runtime Environment) 是java的运行环境,包括虚拟机JVM和Java平台核心类jar文件和class文件,还有支持文件。
JDK(Java Development Kit)是java的开发工具包,包括jre和各种类库和工具(编辑器javac.exe,调试器java.exe),即JDK=JRE+标准类库+开发工具tools。

只安装过了jre,没安装jdk,能运行java程序吗?
可以,安装jre后system32里面有java.exe。
一种不安装JRE环境即可运行Java应用程序的方法

用jdk在cmd下运行编译java程序
javac HelloWorld.java
java HelloWorld

  1. HTTP报文首部有什么内容?

答:报文首部分为请求报文首部和响应报文首部,请求报文首部有:请求行(Http版本、URI、请求方法)、请求首部字段、通用首部字段、实体首部字段和其它;响应报文首部包括响应行(状态码、Http版本)、响应首部字段、通用首部字段、实体首部字段和其它。详情见「HTTP首部」
秋招Android常见笔试题合集--Binrry(冰蕊)_第19张图片

招商局金融技术

  1. 对字符串abc的排序输出所有可能
    详情见「全排列」
  2. 输入整数集合[1,2,3]
    输出所有可能的子集[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]
    详情见「Java中回溯问题的一般方法(子集,排列,回文分区)」
  3. 复制单链表
    详情见「笔试考点大全Java实现之链表」
  4. 计算学科的计算研究
    秋招Android常见笔试题合集--Binrry(冰蕊)_第20张图片
  5. linux复制文件若存在则报告信息语句

补充cp该命令的各选项含义如下
-a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
-d 拷贝时保留链接。
-f 删除已经存在的目标文件而不提示。
-i 和-f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
-p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
-r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
-l 不作拷贝,只是链接文件。
详情见「linux下移动或者复制文件」

  1. 8点开始等待,持续1小时,十点开始执行,他们的响应比

响应比=(等待时间+要求服务时间)/要求服务时间
该题中等待时间为2小时,要求服务时间为1小时,所以响应比=(2+1)/1=3

平安智慧城市笔试

简答题

  1. 结构化程序
  2. 数字签名描述
  3. ServiceConnection接口的onServiceConnecte
  4. 哪种进程最重要,最后被回收
  5. 进程和作业是一一对应?
  6. HTTP状态码 202
  7. having函数表达式
  8. 一张表可以有多个unique约束吗?
  9. 发布订阅模式
  10. SimpleAdapter行布局支持哪些组件
  11. 数据持久化
  12. ListView中行布局某些行只有ImageView,某些行只有TextView,需要重写哪几个方法
  13. style/theme的区别

编程题

1 23 4
1234
只过了66.7%

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Test {

	public static void main(String[] args) {
		int[] a = {2 , 11 , 01 , 52};
		String s=PrintMinNumber(a);
		int re=Integer.parseInt(s);
		System.out.print(s);
	}

	private static String PrintMinNumber(int[] numbers) {
		int n;
		String s="";
		ArrayList<Integer> list= new ArrayList<Integer>();
		n=numbers.length;
		for(int i=0;i<n;i++)
		{
		list.add(numbers[i]);
		}

		Collections.sort(list, new Comparator<Integer>(){
		public int compare(Integer str1,Integer str2)
		{
		String s1=str1+""+str2;
		String s2=str2+""+str1;
		return s1.compareTo(s2);
		}
		});

		for(int j:list)
		{
			if(j!=0)
			  s+=j;
		}

		return s;
	}

}
  1. 找出第一个重复数字,找不到输出-1
    2 1 3 4 2 5
    2
    具体代码不记得了,用HashMap就好

  2. 给一句英文,反转这句话并输出
    I am a student
    student a am I
    具体代码不记得了,根据空格分割存入一个数组,从后往前输出即可

笔面试

一些好的参考

  1. Java 面试知识点解析(一)——基础知识篇
  2. Java 面试知识点解析(二)——高并发编程篇
  3. Java 面试知识点解析(三)——JVM篇
  4. Java 面试知识点解析(四)——版本特性篇
  5. Java 面试知识点解析(五)——网络协议篇
  6. Java 面试知识点解析(六)——数据库篇
  7. Java 面试知识点解析(七)——Web篇
  8. JAVA面试基础题
  9. 面试,妥妥的
  10. Android开发面试经——2.常见Android基础笔试题
  11. Android 面试准备进行曲
  12. 30张图带你彻底理解红黑树
  13. Java 图的最小生成树 — prim算法和kruskal算法
  14. Java实现深度优先遍历和广度优先遍历
  15. java-动态规划算法学习笔记
  16. 操作系统面试问题集锦
  17. 操作系统常见面试题
  18. Intent支持传递的数据类型

答:详情见「」
(1)(2)(3)(4)(5)(6)(7)

笔面试

单选题

多选题

选择题

编程题

    哈哈

A.  
B.  
C.  
D.  

hh☑️✖️详情见「」

你可能感兴趣的:(Android笔试面试题)