2021 面试题

一  几种Fragment懒加载方式   

资料

1 Add + hide+ show  方式 加载 fragment 时   可以搭配 onHiddenChanged (boolean  hidden)  

2 ViewPager+Fragment 模式下的老方案

使用传统方式处理 ViewPager 中 Fragment 的懒加载,我们需要控制 setUserVisibleHint(boolean isVisibleToUser) 函数

3 Androidx 下的懒加载:Androidx 在 FragmentTransaction 中增加了 setMaxLifecycle 方法来控制 Fragment 所能调用的最大的生命周期函数

         case 1ViewPager + Fragment =     

      Androidx下   设置了 ViewPager 的适配器为 FragmentPagerAdapter的构造里的值behavior     且 behavior 值为 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT【behavior_resume_only_current_fragment】

   case 2 add+ hide+show   设置 当前的fragment  设置setMaxLifecycle  resume     hide的fragment  设置 setMaxLifecycle  onStart

4 ViewPager2 本身就支持对实际可见的 Fragment 才调用 onResume 方法

二 文字顶部贴边

 

三HandlerThread 能更新ui吗

HandlerThread见解之它不是更新ui的

四 Java中的同步锁 悲观锁 乐观锁

五 okhttp里的源码 怎么处理https的证书的

 

六性能优化

例子:

1 启动速度优化         非必须的sdk初始化代码  尽量延迟初始化   或者 在子线程中初始化

性能 优化: ui 卡顿 布局优化  ; 内存 优化; 耗电优化

ui卡顿布局优化: 减少嵌套【约束性布局,include,merge,viewstub】

内存优化 : 泄漏 抖动

 

七版本适配相关

 

八Android  内存优化:内存优化

1 内存泄漏: 检测工具:leakcanary 

  1-1集合类:集合类 添加元素后,仍引用着 集合元素对象,导致该集合元素对象不可被回收,从而 导致内存泄漏

    解决方法:集合不用的时候    objectList.clear(); objectList=null;

   1-2  尽量少用  Static 关键字 修饰变量

   1-3  Handler  使用时的泄漏       使用1   静态内部类 自定义handler  2 mHandler.removeCallbacksAndMessages(null);

   1-4 io流   或者  数据库游标Cursor、图片资源Bitmap   的关闭

2 内存抖动:

优化方案:尽量避免频繁创建大量、临时的小对象

九 泛型中 ? 和 T的区别?

总结: T 实例化的时候 需要指定具体的类型   。一旦确定了  就只能操作指定类的数据

            ?并不需要实例化,,是什么都可以 它只是个占位符;

public static <T> void show1(List<T> list){
 for (Object object : list) {
        System.out.println(object.toString());
    }
}

public static void show2(List<?> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}

可以看到show1方法中我们使用了T,大家都知道这是泛型的常见写法,那么这里的T指的是某一类具体的对象,list集合里只能存放同一类型数据,如果插入不同类型数据则会报错。

那么show2方法中我们使用的是?,可以看到在void前面并没有<T>,?可以表示成占位符,它自己也不知道list集合中会存放多少种类型的数据,所以这样就表明我们的list中存放N种数据类型也是可以的。

我们通过一段测试代码来直观的感受一下二者的区别吧:
 

public static void test(){
   List<Student> list1 = new ArrayList<>();
   list1.add(new Student("zhangsan",18,0));
   list1.add(new Student("lisi",28,0));
   list1.add(new Student("wangwu",24,1));
   //这里如果add(new Teacher(...));就会报错,因为我们已经给List指定了数据类型为Student
   show1(list1);

   System.out.println("************分割线**************");

   //这里我们并没有给List指定具体的数据类型,可以存放多种类型数据
   List list2 = new ArrayList<>();
   list2.add(new Student("zhaoliu",22,1));
   list2.add(new Teacher("sunba",30,0));
   show2(list2);
}

十    如果 Handler 里发送 个延时消息,MessageQueue里有什么变化;

MessageQueue  队列里的消息 会按照时间顺序 排列,,把 延时最长的放在最末尾 

 

MessageQueue.next()取消息的话,会判断当前时间  是否大于 msg.when( 存消息的时候会记录,他是存的时间戳+ 延时delay),才会取出

十一 ThreadLocal  怎么保证 线程里变量的唯一性

概念: ThreadLocal是线程的局部变量,常用来为每个线程提供独立的变量副本(可理解拷贝),没个线程可以随意改变其副本,而不会影响原版。

ThreadLocal 实例通常是类中的私有静态字段

原理:ThreadLocal  内部通过 线程map实现      变量副本 与 线程  对应的存储,,每个线程 存取只能操作副本

十二:String中==和equals的区别

https://blog.csdn.net/weixin_42754971/article/details/113906377

    "=="操作符的作用:

  • 用于基本数据类型的比较
  • 判断引用是否指向堆内存的同一块地址
  • equals的作用:
  • 用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型

十三:if else与switch区别

十四 Activity 启动模式

十五 Activity 的启动流程

十六java类的加载机制之类的生命周期详解

类加载机制的话是双亲 委托机制:   答案:

 

十七:fragment 的 detach 和  attach  与 add  hide  事务相关的

https://blog.csdn.net/u011941673/article/details/81872272?utm_source=blogkpcl14

十八 Gradle  构建流程;

https://blog.csdn.net/rikkatheworld/article/details/88747752

十九 startService和bindService的区别

二十 LinkedhashMap  有序的原理

二十一  okhttp 连接池复用机制

二十二:RecyclerView的  复用机制

二十三  ViewPager  和 viewPager2的区别

二十四 序列化的作用 以及  两种 方式 对比

资料1                资料2

二十五  mvc  mvp  mvvm  区别 和 使用场景

资料1    资料2 

MVP优点:

model  与 view 解耦 

Presenter  重要优点: presenter 可以复用

 

MVVM 优点:

2低耦合,视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变

3可重用性,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。【ViewModel 可重用】

4独立开发,开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。


二十六 ViewGroup什么情况下 会走到 onInterceptTouchEvent()

 

二十七 哪些文件 不能混淆

二十八 怎么计算一个bitmap加载到内存中的大小

二十九  Application 的onCreate()方法会执行几次?

 

三十 JSBridge    java 与 js交换

 

三十一  jetPack

三十二  HashMap 和 hashTable的区别

1 Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些

2 HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key。

3 HashMap 内部的数据结构是 数组+ 链表        HashTable内部数据结构是数组+ 链表+ 红黑二叉树

4 HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75

5 HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1

三十三 Synchronized和Volatile的比较

1)Synchronized保证内存可见性  和  操作的原子性
2)Volatile只能保证内存可见性
3)Volatile不需要加锁,比Synchronized更轻量级,并不会阻塞线程(volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。)
4)volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化(如编译器重排序的优化).
5)volatile是变量修饰符,仅能用于变量,而synchronized是一个方法或块的修饰符。
volatile本质是在告诉JVM当前变量在寄存器中的值是不确定的,使用前,需要先从主存中读取,因此可以实现可见性。而对n=n+1,n++等操作时,volatile关键字将失效,不能起到像synchronized一样的线程同步(原子性)的效果。

三十四  在哪里 检测 app冷启动的时长    和 app渲染时长

三十五Android 中刷新 invalidate 和  postInvalidate  的区别 

 

 

三十五  context的理解   Application。context  和 Activity.context的区别

三十六 java修饰符  public  private  protect  区别

三十七 Res和 asset 的区别

三十八 SP 存数据 commit 和 apply的区别,有没有看过源码,怎么会造成anr

三十九  bitmap加载 大图片 怎么分块加载

四十 JAVA中String="abc"和String=new String("abc")的区别与联系

四十一  双重检查锁的 volatile  和  双重检查的作用?

volatile          双重检查

四十二 LayoutInflater中inflate方法两个参数和三个参数的区别

四十三 TCP和 UDP的区别

四十四 java基本数据类型占用字节数

四十五 Android String 与 java的String有什么区别?

四十六 view中invalidate()和requestLayout()的生命周期

四十七 ArrayList和 LinkedList区别?

1 ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

2 arrayList   查询快   增删慢    linkedList  增删快   查询慢

3 同步性  【都是非线程安全的】

ArrayList,LinkedList是不同步的,而Vestor是同步的。所以如果不要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。


四十八  View中的left和getx和translationx之间的区别

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值