我要做 Android 之面笔试
二:如何进制转换
- 二进制 → 十进制
方法:二进制数从低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。
例:将二进制的(101011)B转换为十进制的步骤如下:
\1. 第0位 1 x 2^0 = 1;
\2. 第1位 1 x 2^1 = 2;
\3. 第2位 0 x 2^2 = 0;
\4. 第3位 1 x 2^3 = 8;
\5. 第4位 0 x 2^4 = 0;
\6. 第5位 1 x 2^5 = 32;
\7. 读数,把结果值相加,1+2+0+8+0+32=43,即(101011)B=(43)D。
- 八进制 → 十进制
方法:八进制数从低位到高位(即从右往左)计算,第0位的权值是8的0次方,第1位的权值是8的1次方,第2位的权值是8的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。
八进制就是逢8进1,八进制数采用 0~7这八数来表达一个数。
例:将八进制的(53)O转换为十进制的步骤如下:
\1. 第0位 3 x 8^0 = 3;
\2. 第1位 5 x 8^1 = 40;
\3. 读数,把结果值相加,3+40=
(二) (十进制) → (二、八、十六进制)
![](https://yqfile.alicdn.com/img_414c206a9d6fd0dd577bbc86e4a90c07.png)
(Figure3:十进制转换为其它进制)
- 十进制 → 二进制
方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。
例:将十进制的(43)D转换为二进制的步骤如下:
\1. 将商43除以2,商21余数为1;
\2. 将商21除以2,商10余数为1;
\3. 将商10除以2,商5余数为0;
\4. 将商5除以2,商2余数为1;
\5. 将商2除以2,商1余数为0;
\6. 将商1除以2,商0余数为1;
\7. 读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,101011,即(43)D=(101011)B。
![](https://yqfile.alicdn.com/img_1b2aa3f7c412a15f58082f219a2f1c41.png)
(Figure4:图解十进制 → 二进制)
- 十进制 → 八进制
方法1:除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。
例:将十进制的(796)D转换为八进制的步骤如下:
\1. 将商796除以8,商99余数为4;
\2. 将商99除以8,商12余数为3;
\3. 将商12除以8,商1余数为4;
\4. 将商1除以8,商0余数为1;
\5. 读数,因为最后一位是经过多次除以8才得到的,因此它是最高位,读数字从最后的余数向前读,1434,即(796)D=(1434)O。
![](https://yqfile.alicdn.com/img_a6d50bfa097c7fe7763b5bc4734b0162.png)
43,即(53)O=(43)D。
算法实现:
public static void toBin(int num){StringBuffer sb = new StringBuffer();while(num>0){sb.append(num%2);num = num / 2;}System.out.ptintln(sb.reverse());
}
三:如何正确结束 Java 线程
使用标志位
很简单地设置一个标志位,名称就叫做 isCancelled。启动线程后,定期检查这个标志位。如果 isCancelled = true,那么线程就马上结束。
public class MyThread implements Runnable {private volatile boolean isCancelled;public void run() {while(!isCancelled){//do something}}public void cancel() { isCancelled=true; }
}
注意的是,isCancelled 需要为 volatile,保证线程读取时 isCancelled 是最新数据。
我以前经常用这种简单方法,在大多时候也很有效,但并不完善。考虑下,如果线程执行的方法被阻塞,那么如何执行isCancelled的检查呢?线程有可能永远不会去检查标志位,也就卡住了。
使用中断
Java提供了中断机制,Thread类下有三个重要方法。
- public void interrupt()
- public boolean isInterrupted()
- public static boolean interrupted(); // 清除中断标志,并返回原状态
每个线程都有个boolean类型的中断状态。当使用Thread的interrupt()方法时,线程的中断状态会被设置为true。
下面的例子启动了一个线程,循环执行打印一些信息。使用isInterrupted()方法判断线程是否被中断,如果是就结束线程。
public class InterruptedExample {public static void main(String[] args) throws Exception {InterruptedExample interruptedExample = new InterruptedExample();interruptedExample.start();}public void start() {MyThread myThread = new MyThread();myThread.start();try {Thread.sleep(3000);myThread.cancel();} catch (InterruptedException e) {e.printStackTrace();}}private class MyThread extends Thread {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {System.out.println("test");Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("interrupt");//抛出InterruptedException后中断标志被清除,标准做法是再次调用interrupt恢复中断Thread.currentThread().interrupt();}}System.out.println("stop");}public void cancel() {interrupt();}}
}
对线程调用interrupt()方法,不会真正中断正在运行的线程,只是发出一个请求,由线程在合适时候结束自己。
例如 Thread.sleep 这个阻塞方法,接收到中断请求,会抛出 InterruptedException,让上层代码处理。这个时候,你可以什么都不做,但等于吞掉了中断。因为抛出 InterruptedException 后,中断标记会被重新设置为false!看 sleep() 的注释,也强调了这点。
记得这个规则:什么时候都不应该吞掉中断!每个线程都应该有合适的方法响应中断!
所以在InterruptedExample例子里,在接收到中断请求时,标准做法是执行Thread.currentThread().interrupt()恢复中断,让线程退出。
从另一方面谈起,你不能吞掉中断,也不能中断你不熟悉的线程。如果线程没有响应中断的方法,你无论调用多少次interrupt()方法,也像泥牛入海。
我要做 Android 之面笔试相关推荐
- 我要做 Android 之面笔试总结
说说什么是工厂模式 ps:之前只是单纯了解过工厂模式,不知道其实有三种工厂模式 一:工厂模式 工厂模式就有三种,它们分别是简单工厂模式(并不在23中模式之中),工厂方法模式以及抽象工厂模式,其中我们通 ...
- Android之面试题总结加强版(一)
转载:http://blog.csdn.net/itachi85/article/details/7426451 自己总结的最强android应用面试题集 1.activity的生命周期. 方法 描述 ...
- Android之面试题精选,自己收藏下
1.android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念: 答:dvm是dalivk虚拟机.每一个android应用程序都在自己的进程中运行,都拥有一个dalivk虚拟机实 ...
- 我要做 Android 之 ContentProvider
相信大家对于 Android 顶顶大名的四大组件也不陌生了.今天我们来谈一谈 ContentProvider 的用法.什么东西都是基本最重要啊,可以人是一个健忘的动物,所以需要做下来笔记,常看常新.愿 ...
- android常见的面试题,Android常见笔试面试题
一.JAVA部分: (挂起) 二.Android部分: 1.Android系统的架构 2.Android常用的五大布局 3.Android四大组件是什么 4.Activity的生命周期 5.Activ ...
- 我要做 Android 之 Service
谢谢 minmin小姐姐的总结:https://www.jianshu.com/u/203b606b956c Service (服务) 是 Android 中实现程序后台运行的解决方案,它非常适合用于 ...
- [最新] Android 代码规范大全(Android开发速看),2021年最新大厂Android面试笔试题目
| 数据库类 | 功能名 + DBHelper | 新闻数据库:NewsDBHelper | | 自定义的共享基础类 | Base + 基础 | BaseActivity, BaseFragment ...
- android Java 笔试考题
前19题为常考题目!!(版本号:201108141031) 1.Android的四大组件是哪些,它们的作用? 3 2.请介绍下Android中常用的五种布局. 3 3.android中的动画有哪几类, ...
- C语言之volatile用法(二十一),2021最新Android面试笔试题目分享
int main (void) { int i = 10; int a = i; //优化 int b = i; printf ("i = %d\n", b); return 0; ...
- Android之面试题!初级到大师!!!!50道
1.怎么实现通知栏到聊天界面的跳转 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVI ...
最新文章
- 解答关于学习前端的一些问题
- mysql query 查询失败_如何在mysql进行查询缓存及失败的解决方法
- Uvalive 4043 - Ants(二分图完美匹配)
- flood fill算法
- 数据结构与算法--查找与排序另类用法-旋转数组中的最小数字
- 接力,智能指针也麻烦
- IE下jquery的fadeIn与fadeOut方法失效的BUG
- 如何在Unity项目中添加语音识别?
- 小米球Ngrok-使用方法
- #includeiostream里的定义
- 校园导航系统课程设计,#校园管理系统
- 软件架构师应该知道的 97 件事
- 【完全指南】如何在Github上使用Hexo搭建自己的Blog
- NFT Insider #48:The Sandbox发布内测版第二季,FTX Gaming与YGGIndia达成合作
- hbs模块 mysql_让koa-hbs模块支持koa2
- 计算机描述不可用步骤,Win10 1909系统中提示打印机描述不可用解决方法
- 面试官突然问我什么是后端?我通俗易懂的给他讲清楚了!
- 原地算法(In-Place Algorithm)
- 2013年:各大IT公司待遇(硕士)
- 关于HBase及HBase Shell的认识
热门文章
- MySQL主从原理,基于快速学习一门技术的3种方式
- 别再对 Istio 一脸懵了,万众期待的第一本 Istio 著作现!已!上!市
- 安全云服务的定义和特征
- .Net软件设计新思维
- 21天学通Java调用不存在的对象或成员变量
- python爬虫案例_Python“豆瓣电影TOP250爬虫案例”详解
- 如何格式化电脑_电脑硬盘不小心格式化如何恢复【恢复方法】
- Ros安装过程及sudo rosdep init失败解决方法
- JavaWeb — 获取复选框的值时,要注意不是得到显示的值,而是得到value值
- HTML5 — 知识篇总结《I》【入门知识】