Skip to content

Instantly share code, notes, and snippets.

@why168
Last active August 10, 2017 08:30
Show Gist options
  • Save why168/1a388c35fc3a27a85490dea2a1d94230 to your computer and use it in GitHub Desktop.
Save why168/1a388c35fc3a27a85490dea2a1d94230 to your computer and use it in GitHub Desktop.
面试题

1、synchronized函数和synchronized代码块的区别

synchronized函数: 在方法的声明前加入synchronized关键字实现加同步锁. 这个方法在同一时刻只能被一个线程访问,从而保证了多线程访问的安全性。 然而,当一个方法体规模非常大时,把该方法声明为synchronized会大大影响程序的执行效率。

synchronized代码块: 可以把任意的代码段声明为synchronized,也可以指定上锁的对象,有非常高的灵活性。

为什么要使用同步代码块呢? 首先对程序来讲同步的部分很影响运行效率,而一个方法通常是先创建一些局部变量,再对这些变量做一些操作,如运算,显示等等; 而同步所覆盖的代码越多,对效率的影响就越严重,因此我们通常尽量缩小其影响范围。 如何做?同步代码块。我们只把一个方法中该同步的地方同步,比如运算。 很明显,同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好。

2、如何判断一个对象是可以被回收的

  1. 首先第一种是虚拟机栈中的引用的对象,我们在程序中正常创建一个对象,对象会在堆上开辟一块空间,同时会将这块空间的地址作为引用保存到虚拟机栈中,如果对象生命周期结束了,那么引用就会从虚拟机栈中出栈,因此如果在虚拟机栈中有引用,就说明这个对象还是有用的,这种情况是最常见的。
  2. 第二种是我们在类中定义了全局的静态的对象,也就是使用了static关键字,由于虚拟机栈是线程私有的,所以这种对象的引用会保存在共有的方法区中,显然将方法区中的静态引用作为GC Roots是必须的。
  3. 第三种便是常量引用,就是使用了static final关键字,由于这种引用初始化之后不会修改,所以方法区常量池里的引用的对象也应该作为GC Roots。

Java中的引用一共有强引用、软引用、弱引用和虚引用4种引用:

  1. 强引用,强引用就是我们平常用的类似于“Object obj = new Object()”的引用,只要obj的生命周期没结束,或者没有显示地把obj指向为null,那么JVM就永远不会回收这种对象。
  2. 软引用相对强引用来说就要脆弱一点,JVM正常运行时,软引用和强引用没什么区别,但是当内存不够用时,濒临逸出的情况下,JVM的垃圾收集器就会把软引用的对象回收。
  3. 弱引用比软引用更加脆弱,弱引用的对象将会在下一次的gc被回收,不管JVM内存被占用多还是少。在JDK中使用WeakReference来实现弱引用
  4. 虚引用是最脆弱的引用,我们没有办法通过一个虚引用来获得对象,即使在没有gc之前。虚引用需要和一个引用队列配合使用,在JDK中提供了PhantomReference来实现虚引用

3、使用过哪些开源项目

HttpClient、xUtils、Volley、okHttp、Retrofit、OrmLite、Glide、Luban、WheelPicker、EventBus、RxJava、RxAndroid、RxLifecycle、Logger等等...

4、Android从8.0后增加了哪些新的特性,有哪些改变的地方需要注意

通过Google官网网站了解:https://developer.android.com/preview/index.html

新的特性:

  1. 后台位置更新频率下降
  2. 不再支持 net.hostname
  3. send(DatagramPacket) 引发新异常
  4. AbstractCollection 方法引发正常的 NullPointerException
  5. Currency.getDisplayName(null) 引发正常的 NullPointerException
  6. 只有 Android Studio 3.0 包含对 Android O 提供的所有新开发者功能的支持
  7. 更新构建配置将 compileSdkVersion、buildToolsVersion、targetSdkVersion 和 Support Library 版本更新
  8. 从清单文件中移除广播接收器
  9. 蓝牙方面有些变化
  10. 安全性提高
  11. MediaPlayer事件按钮,API更改
  12. 集合的一些API处理
  13. 类加载行为有所改变
  14. 多显示器支持
  15. 新的 StrictMode 检测程序
  16. 自定义数据存储
  17. findViewById() 签名变更
  18. 增强的媒体文件访问功能
  19. 智能共享

注意的地方:

  1. 后台执行限制,提高电池续航能力,当您的应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。
  • 在后台运行的应用对后台服务的访问受到限制。
  • 应用无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)。
  • 如果针对 Android O 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。
  • 新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。
  • Android 后台位置限制,此类变更会影响以下 API
    • Fused Location Provider (FLP)
    • Geofencing
    • GNSS Measurements
    • Location Manager
    • Wi-Fi Manager
  1. 应用快捷键做出了以下变更
  2. 语言区域和国际化
  • Android O 中,以下函数使用 Locale.getDefault(Category.DISPLAY) 来代替 Locale.getDefault()
    • Currency.getDisplayName()
    • Currency.getSymbol()
    • Locale.getDisplayScript()
  • 当为 Locale 参数指定的 displayScript 值不可用时,Locale.getDisplayScript(Locale) 同样回退到 Locale.getDefault()。
  • 调用 Currency.getDisplayName(null) 会引发 NullPointerException,以与文档规定的行为保持一致。
  • 时区方面使用SimpleDateFormat 此结果可能与之前的 Android 版本不同。
  • Android O 将 ICU 的版本更新至版本 58。
  1. 提醒窗口,使用TYPE_APPLICATION_OVERLAY 窗口类型来显示提醒窗口
  2. WebView网页表单自动填充
  • WebSettings
    • getSaveFormData() 函数现在返回 false。之前,此函数返回 true。
    • 调用 setSaveFormData() 不再有任何效果。
  • WebViewDatabase
    • 调用 clearFormData() 不再有任何效果。
    • hasFormData() 函数现在返回 false。之前,当表单包含数据时,此函数返回 true。
  1. 无障碍功能:现在,无障碍服务可识别应用的 TextView 对象内部的所有 ClickableSpan 实例。
  2. 网络连接和 HTTP(S) 连接
  • HttpURLConnection 在包含斜线的主机或颁发机构名称后面附加一条斜线,使包含空路径的网址规范化。例如,它将 http://example.com 转化为 http://example.com/。
  • OPTIONS 请求具有 Content-Length: 0 标头。之前,这些请求没有 Content-Length 标头现在必须加上。
  1. 权限纠正
  • Android O 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。
  • 对于针对 Android O 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。
  1. 强烈注意!WebView API增加
  • Version API
  • Google SafeBrowsing API
  • Termination Handle API
  • Renderer Importance API
  1. 安全性与隐私:Android O 引入了多个与电话有关的新权限:这些权限均被划分为危险类别,属于 PHONE 权限组。
  • ANSWER_PHONE_CALLS 允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可以使用 acceptRingingCall() 函数。
  • READ_PHONE_NUMBERS 权限允许您的应用读取设备中存储的电话号码。

5、写一个函数,输入一个数如38,拆分 3 + 8 = 11,1 + 1 = 2,最后2无法拆分就返回

/**
 * 输入一个数如38,拆分 3 + 8 = 11,1 + 1 = 2,最后2无法拆分就返回
 *
 * @param number 数字
 * @return 小于10之后无法拆分
 */
public static synchronized int splitNumber(int number) {
    if (number < 10)
        return number;
    number = number / 10 + number % 10;
    return splitNumber(number);
}

6、有无相关自己的技术博客或github开源项目

有的如下:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment