Code Monkey home page Code Monkey logo

codeeggdailyinterview's Introduction

「码个蛋」每日一题

该项目用于记录「码个蛋打卡学习群」每日面试题。 今日份面试题戳这里

1. 想要加群怎么办?

加微信:chad_cym,并备注:加入打卡学习群

2. 群福利

  1. 良好的氛围,这点是必须滴
  2. 专属抽奖,奖品包括 N 多种市面上比较火的书籍
  3. 每日分享,也欢迎群友进行分享
  4. 还有更多福利会在后期慢慢解锁.....

历史面试题链接

目前已更新至 193 可通过 Issue 查看



118.线程和进程的区别?为什么不仅仅用进程

117.get 和 post 请求有哪些区别

116.Android10新特性及适配

115.简述Android虚拟机和JAVA虚拟机的区别

114.Wait()与Sleep()方法的区别

113.java中==和equals和hashCode的区别

112.阐述静态变量和实例变量的区别

111.简述下okhttp和retrofit的使用和联系

110.类什么时候被初始化

109.什么是不可变对象,它对写并发应用有什么帮助

108.谈谈对 java 注解的理解

107.重载(overload)和重写(override)的区别?重载的方法能否根据返回类型进行区分

106.Java创建对象的几种方式

105.并发集合与普通集合的区别

104.如何停止一个正在运行的线程

103.谈谈对 java 中反射的理解

102.Java中用到的线程调度算法是什么?并作解释说明

101.Linux自带多种进程通信方式,为什么Android都没采用而偏偏使用Binder通信

100.synchronized和volatile关键字的作用

99.Java中的异常处理机制的简单原理和应用

98.死锁与活锁的区别,死锁与饥饿的区别

97.为什么Java中不支持多重继承

96.为什么 Java 中用 char 数组比 String 更适合存储密码

95.HashMap 排序问题

94.String 为什么要设计成不可变的

93.Java nio 和 io 的区别

92.XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

91.谈谈冷启动与热启动

90.请描述一下View的绘制流程

89.请简述你对AsyncTask异步任务的理解

88.深克隆与浅克隆的区别

87.Android推送的基本原理

86.并行和并发有什么区别

85.Android主线程怎么给子线程发message

84.JVM加载class文件的原理机制

83.LinearLayout和RelativeLayout性能对比

82.并行和并发有什么区别

81.BroadcastReceiver与LocalBroadcastReceiver的区别

80.简单描述一下Intent 和IntentFilter

79.说说你对线程池的理解

78.Android WebView 的漏洞有哪几种

77.Java 对象的内存分配过程是如何保证线程安全的

76.AOT和JIT以及混合编译的区别、优劣

75.Serializable和Parcelable的区别

74.谈谈JVM的内存结构和内存分配

73.怎样避免和解决ANR

72.算法 #72

71.有了二叉查找树、平衡树为什么还需要红黑树

70.简述apk打包过程

69.http与https的区别

68.Android与服务器交互的方式中的对称加密和非对称加密是什么

67.简述 tcp 和 udp的区别

66.谈谈对命令模式的理解

65.使用Xposed为什么需要root

64.Broadcast 注册方式与区别

63.LruCache 算法源码解析

62.谈谈Android的安全机制

61.ListView如何提高效率

60.谈谈对生成器模式的理解

59.Java 中堆和栈有什么区别

58.ANR异常的产生条件及解决方案

57.谈谈热修复的原理

56.JAVA的四种引用,及应用场景

55.什么是线程安全?保障线程安全有哪些手段?

54.简述一下类加载过程

53.谈谈你对Java中Hash码的理解

52.break与continue的区别

51.谈谈 RecyclerView 的性能优化

50.如何减小apk安装包体积

49.四种LaunchMode及其使用场景

48.简述app启动过程

47.final, finally, finalize的区别

46.谈谈4种gc算法

45.Android的数据存储方式

44.https 三次握手四次挥手

43.谈谈对责任链模式的理解

42.Android进程间通信的几种姿势

41.理解Activity,View,Window三者关系

40.Android SharedPreference频繁操作有什么后果?能存多少数据?

39.守护线程与阻塞线程的四种情况

38.谈谈你对重入锁的理解

37.请介绍下Android中常用的五种布局

36.谈谈对「抽象工厂方法模式」的理解

35.谈谈数组与链表的区别

34.Android线程间通信有几种方法

33.谈一谈对Android中Context理解

32.Android 的四大组件都需要在清单文件中注册吗?并简述四大组件

31.从扑克牌中随机抽 5 张牌,判断是不是顺子,即这 5 张牌是不是连续的。 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意的 数字

30.谈谈 static 关键字的用法

29.Android平台的优势和不足

28.谈谈 JDK8 开始的双冒号 用法及详解

27.n个台阶,每次都可以走一步,走两步,或走三步,走到顶部一共有多少种走法

26.ART和Dalvik区别

25.谈谈对运行结果的理解

24.简述几种排序算法的区别

23..Android 实现异步的几种方式,原理与各自特点

22.推荐系统设计

21.谈谈Java的垃圾回收机制以及触发时机

20.谈谈对「简单工厂模式」和「工厂方法模式」的理解

19.快速查找1000万个数中,最大的100个

18.既然RecyclerView在很多方面能取代ListView,Google为什么没把ListView划上一条过时的横线?

17.谈谈 ArrayList 和 LinkList 的区别

16.简述HashMap工作原理

15.谈谈对单例的理解,以及实现方式

14.接口和抽象类有什么区别

13.如何遍历一个未知深度的树

12.谈谈 Java 中多线程实现的几种方式

11.设计模式的基本原则

10.谈谈你的职场规划

09.String,StringBuilder,StringBuffer的区别

08.ScrollView嵌套ListView的解决方案及其原理

07.HashMap和Hashtable的区别

06.Android 内存泄漏的原因以及解决方案

05.Android动画有几种,对其理解

04.谈谈Android的事件分发机制

03.谈谈你对java三大特性的理解

02.自定义控件优化方案

01.为什么在子线程创建Handler会抛异常?如何正确使用


codeeggdailyinterview's People

Contributors

cymchad avatar kukyxs avatar meteorstart avatar midnighthz avatar sudo-keke avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

codeeggdailyinterview's Issues

自定义控件优化方案

  1. 为了加速你的view,对于频繁调用的方法,需要尽量减少不必要的代码。先从onDraw开始,需要特别注意不应该在这里做内存分配的事情,因为它会导致GC,从而导致卡顿。在初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。
  2. 你还需要尽可能的减少onDraw被调用的次数,大多数时候导致onDraw都是因为调用了invalidate().因此请尽量减少调用invaildate()的次数。如果可能的话,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。
  3. 另外一个非常耗时的操作是请求layout。任何时候执行requestLayout(),会使得Android UI系统去遍历整个View的层级来计算出每一个view的大小。如果找到有冲突的值,它会需要重新计算好几次。另外需要尽量保持View的层级是扁平化的,这样对提高效率很有帮助。 如果你有一个复杂的UI,你应该考虑写一个自定义的ViewGroup来执行他的layout操作。与内置的view不同,自定义的view可以使得程序仅仅测量这一部分,这避免了遍历整个view的层级结构来计算大小。这个PieChart 例子展示了如何继承ViewGroup作为自定义view的一部分。PieChart 有子views,但是它从来不测量它们。而是根据他自身的layout法则,直接设置它们的大小。

Android动画有几种,对其理解

  1. 视图动画。视图移动、view真真的位置并未移动。
  2. 帧动画。就和放电影一样,一帧一帧的播
  3. 属性动画。视图移动、其位置也会随着移动。
  4. 触摸返回动画。发生触摸事件时有反馈效果。比如波纹效果
  5. 揭露动画。从某一个点向四周展开或者从四周向某一点聚合起来。
  6. 转场动画 & 共享元素。比如切换activity。共享元素一般我们使用在转换的前后两个页面有共同元素时。
  7. 视图状态动画。就是 View 在状态改变时执行的动画效果
  8. 矢量图动画。在图片的基础上做动画。
  9. 约束布局实现的关键帧动画。就是给需要动画效果的属性,准备一组与时间相关的值。关键的几个值。

HashMap和Hashtable的区别

  1. HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。

  2. HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,由于非线程安全,效率上可能高于Hashtable。

  3. HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。

  4. Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

  5. Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。但是如果使用Java 5或以上的话,可以用ConcurrentHashMap代替Hashtable。

  6. Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差。

String,StringBuilder,StringBuffer的区别

  1. 可变不可变
    String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。
    StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对
    象;使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。
  2. 线程是否安全
    String:对象定义后不可变,线程安全。
    StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区
    大量数据。
    StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。
  3. 共同点
    StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。
    StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append(...)。
    只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用
    StringBuilder 效率高于 StringBuffer。

为什么在子线程创建Handler会抛异常?如何正确使用

Handler的工作是依赖于Looper的,而Looper(与消息队列)又是属于某一个线程(ThreadLocal是线程内部的数据存储类,通过它可以在指定线程中存储数据,其他线程则无法获取到),其他线程不能访问。因此Handler就是间接跟线程是绑定在一起了。因此要使用Handler必须要保证Handler所创建的线程中有Looper对象并且启动循环。因为子线程中默认是没有Looper的,所以会报错。正确的使用方法是:

private final class WorkThread extends Thread {

        private Handler mHandler;

        public Handler getHandler() {
            return mHandler;
        }
          public void quit() {
            mHandler.getLooper().quit();
        }
        @Override
        public void run() {
            super.run();
            //创建该线程对应的Looper,
            // 内部实现
            // 1。new Looper()
            // 2。将1步中的lopper 放在ThreadLocal里,ThreadLocal是保存数据的,主要应用场景是:线程间数据互不影响的情况
            // 3。在1步中的Looper的构造函数中new MessageQueue();
            //其实就是创建了该线程对用的Looper,Looper里创建MessageQueue来实现消息机制
            //对消息机制不懂得同学可以查阅资料,网上很多也讲的很不错。
            Looper.prepare();
            mHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    Log.d("WorkThread", (Looper.getMainLooper() == Looper.myLooper()) + "," + msg.what);
                }
            };
            //开启消息的死循环处理即:dispatchMessage
            Looper.loop();
            //注意这3个的顺序不能颠倒
            Log.d("WorkThread", "end");
        }
    }

谈谈你对java三大特性的理解

封装

封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

继承的过程,就是从一般到特殊的过程。

多态

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

实现多态,有二种方式,覆盖,重载。

覆盖,是指子类重新定义父类的虚函数的做法。

重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

谈谈你的职场规划

这是一个比较开放的面试题

来自大佬的解析:

主要看的是面试者对自己的定位,这样便于让企业去识别这个人的培养方向。问完这个问题会有第二个问题你有没有想过如何达成你的目标,这个通常看面试者的规划能力,说的越详细越好。有目标并有清晰规划的人,通常这类人自驱力比较强的人。一般没有明确目标和清晰规划的人我是不会招的

还有企业文化,通常我问面试者是否认同我们的企业文化,不认同技术再好也不好。

https 三次握手四次挥手

请详细描述三次握手和四次挥手的过程,要求熟悉三次握手和四次挥手的机制,每一步做了什么?要求画出状态图。

系统设计

设计一套推荐系统,不需要具体/细节的实现 你可以从一个项目经理、架构师、程序员的角度来回答,也可以从一个老板/客户的角度来谈谈想要什么,也可以从任何角度来谈谈你对推荐系统的理解

Android 内存泄漏的原因以及解决方案

  1. 内存泄漏指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被JVM回收

  2. 内存泄漏的影响:

    1. 应用可用内存减少,增加堆内存压力
    2. 频繁触发GC,会降低了应用的性能
    3. 到一定程序会导致内存溢出错误
  3. Android开发中常见内存泄漏及解决办法

    1. 静态变量生命周期与应用的生命周期一样,如果静态变量持有某个Activity的上下文,则对应Activity无法释放,导致内存泄漏(单例模式)
      解决办法:使用Application的上下文
    2. 匿名内部类与非静态内部类因为都会持有外部类引用,当执行异步操作易导致内存泄漏
      解决办法:将非静态内部类转为静态内部类+WeakReferenct的方式
    3. Handler消息队列存在延时消息导致内存泄漏
      在onDestroy方法中调用Handler相应的方法移除回调和删除消息
    4. 各种注册的监听器忘记移除导致内存泄漏
      解决办法:在onDestroy方法中取消注册
    5. 资源对象未关闭导致内存泄漏,如(IO,数据库,Bitmap等)
      解决办法:及时关闭资源
    6. 属性动画未取消导致内存泄漏(如无限轮播图效果)
      解决办法:onDestroy方法中取消动画
    7. 其他解决办法:使用AAC框架
  4. 内存泄漏排查工具:
    AS Monitor,MAT,LeakCanary

  5. 扩展: Java内存管理,GC

ScrollView嵌套ListView的解决方案及其原理

自定义ListView
解决:重写其中的onMeasure()方法

原因:
ScrollView默认把Childview设置为UNSPEFEIED模式,而该模式下的ListView给自己的测量的高度就是第一个item的高度.原理:
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
这个方法的作用是根据大小和模式来生成一个int值,这个int值封装了模式和大小信息.
首先MeasureSpec类是View的一个静态内部类,MeasureSpec类封装了从父布局到子布局传递的布局需求.
每个MeasureSpec对象代表了宽度和高度的要求.
MeasureSpec用int类型表示,前2位代表模式,后30位代表大小.
第一个参数Integer.MAX_VALUE >> 2:Integer.MAX_VALUE获取到int的最大值,但是表示大小的值size是int数值的底30位,所以把这个值右移两位,留出高两位表示布局模式.
此时这个值仍旧是一个30位所能表示的最大数,用该数作为控件的size,应该足够满足控件大小的需求.
第二个参数MeasureSpec.AT_MOST:表示这个控件适配父控件的最大空间.

(以下三种仅供参考,不推荐使用)
2.手动设置ListView高度
3.使用单个ListView取代ScrollView中所有内容
4.使用LinearLayout取代ListView

参考资料:
https://juejin.im/entry/5979ab4d5188253e3271c953
https://juejin.im/post/5a322cbf6fb9a045204c3da1

谈谈对运行结果的理解

public static void main(String[] args){
    int i = 0;
    System.out.println((i++)+(++i)+(i++)+(++i));
    System.out.println(i);
}

谈谈Android的事件分发机制

事件的传递流程:
Activity(PhoneWindow)->DecorView->ViewGroup->View。
事件分发过程中三个重要的方法:
dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent();
事件传递规则
一般一次点击会有一系列的MotionEvent,可以简单分为:down->move->….->move->up,当一次event分发到ViewGroup时,ViewGroup收到事件后调用dispatchTouchEvent,在dispatchTouchEvent中先检查是否要拦截,若拦截则ViewGroup处理事件,否则交给有处理能力的子容器处理。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.