美文网首页
面试总结

面试总结

作者: 书虫大王X | 来源:发表于2021-06-27 23:26 被阅读0次

2、什么情况下会让线程进入死亡状态:

1.线程中的代码执行完毕
2.执行线程的代码时抛出异常

3、线程的interrupt方法:简书

4、线程池:线程池的核心
5、当要在网络请求数据并渲染时,你会怎么做(在子线程获取数据,然后用接口将数据回调给UI线程)

但是在接口方法中,由于是子线程调用的该方法,所以该方法还是在子线程运行,所以在该方法中操作UI之前,需要先调用RunOnUIThread方法

6、handler是怎么从子线程切换到主线程的:

  • Handler的使用方式可以根据发送消息的方式不同而分为两种:
    Handler.sendMessage()和Handler.post()

  • Handler.sendMessage()方式:

在定义自己的Handler的时候重写Handler的handleMessage()方法来对拿到的消息进行处理,因此这个方法应该是运行在接收消息的线程的。(例如下载内容->更新UI,handleMessage()运行在主线程)。

一,创建Handler子类
1、自定义Handler子类,并重写handleMessage()方法
    class mHandler extends Handler {
       //重写handleMessage()方法
         @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //执行的UI操作 (在主线程执行)
        }
    }
2、主线程中创建mHandler的实例
    private mHandler mhandler = new mHandler();
3、在子线程中创建需要发送的消息对象
    Message msg = Message.obtain();
    msg.what = 1;
4、在子线程中通过Hander发送消息到消息队列
    mhandler .sendMessage(msg);
5、启动子线程
 
二、使用匿名Handler子类
1、在主线程中通过匿名内部类创建Handler类对象
    Handler mhandler =  new Handler(){
        //重写handleMessage()方法
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //执行的UI操作  (在主线程执行)
        }
    };
2、在子线程中创建需要发送的消息对象
    Message msg = Message.obtain();
    msg.what = 1;
3、在子线程中通过Hander发送消息到消息队列
    mhandler .sendMessage(msg);
4、启动子线程
  • Handler.post()方式:
1、在主线程中创建Handler实例
    private Handler mhandler = new Handler();
2、在子线程中使用Handler.post()
     mhandler.post(new Runnable() {
                                @Override
                            public void run() {
                                 //执行的UI操作 (在主线程执行)
                            }
                        });
3、启动子线程
  • sendMessage方法需要在提前定义好要执行的UI操作,然后在得到子线程的相应信息时,在main线程执行该UI操作;但是post方法实用的多:可以在post方法中定义UI操作,然后自动在main执行

7、 主线程调用子线程去获取网络数据,当得到数据后,通过接口回到将子线程获取的到的数据传递给主线程:

  • 用获取数据的类继承Callback.CommonCallback<String>接口,实现它的监听方法:监听网络数据的获取状态

8、关于线程安全、线程通信的代码(两个线程交替打印1到100)
9、haspmap的使用,下去操作一下
10、hashmap:红黑树的平均查找时间复杂度,改变为红黑树的目的(方便进行查找),红黑树的定义,hashmap扩容的过程 ,hashmap的使用,hashmap线程安全吗,怎么保证它的线程安全(分段锁)
11、自定义控件对应的三个方法对应的作用,三种布局模式在不同情况下的选择

二次:

1、对于实习你有什么诉求:希望在实习过程中可以转正并留在字节
2、说一下你的项目,涉及到的知识点
3、recycleView的原理: 简书 - 写文章 (jianshu.com)
4、finel关键字(对象加finel可以改变吗,finel类的内部变量可以改变吗(变量没有加finel),这是什么特性导致的)
5、变量有哪些类型
6、 == 与 equals的区别
7、Java中如何判断两个对象是否相等(Java equals and ==)

  • 判断两个对象的路径名是否相同,然后在判断两个的类加载器是否相同

8、字符串内部是有数组进行实现的,保存字符的数组:String为什么不可变

  • string类的成员变量:value[ ] 、offset、count、hash,这些成员变量都是用 private finel 修饰的,所以外部无法访问他们的set方法,他们在创建之后也没办法再改变。
  • value是String封装的数组,offset是String在这个value数组中的起始位置,count是String所占的字符的个数。 还有一个hash成员变量,是该String对象的哈希值的缓存
  • value实际是一个字符数组,我们对string修改值时,实际是修改了value数组的指向
  • 用反射可以访问string内部的私有变量,可以真正的改变string的值

9、string a = "yk" 与 string b = new sting("yk")的区别
10、string这个类是线程安全的吗
11、java中的异常类有哪些(具体点),空指针属于哪种异常
12、垃圾回收算法有哪些;引用计数有什么问题吗

  • 会造成循环引用
  • 无法区分强、软、弱、虚引用

13、activity的启动模式有哪些
14、自定义控件,为什么要自定义控件
15、怎么从手机里面加载一张图片(bitmap类)

  • Android程序去手机相册获取图片:

1、通过隐式跳转到相机,选择一张图片后返回,然后回到onActivityResult方法中
1、定义一个资源标识符接收onActivityResult方法传递回来的数据
2、然后用contentResolver和uri创建一个数据流
3、用BitmapFactory的解析这个输入流
4、最后将解析过后的输入流设置到图片上去

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
//      相册
            IMAGE_CODE -> {
                if (resultCode != Activity.RESULT_CANCELED) {
                    val uri: Uri? = data?.data
                    Log.v("yk", "你好啊: $data")
                    Log.v("yk", data?.data.toString())
                    uri?.let {
                        contentResolver.openInputStream(uri).use {
                            BitmapFactory.decodeStream(it).apply {
//                                显示图片
                                ykImage.setImageBitmap(this)
//                                缓存图片: 创建保存图片的文件
                                var file = File(filesDir, "header.jpg")
                                FileOutputStream(file).also { yk2 ->
//                                    将图片保存到对应的路径中
                                    compress(Bitmap.CompressFormat.JPEG, 50, yk2)
                                }
                            }
                        }
                    }
                }
            }
  • 从文件中获取图片:
        //        获取头像图片(下一次进入程序时,去获取图片)
        File(filesDir, "header.jpg").also {
            if (it.exists()) {
                BitmapFactory.decodeFile(it.path).also { yk ->
                    ykImage.setImageBitmap(yk)
                }
            }
        }
    }

16、计算机网络:三次握手、四次挥手(具体到指令)、tcp udp的区别及应用情景;为什么是三次、四次;网络状态码(具体到单位)
17、进程和线程的区别
18、并发和并行(单核和多核角度来讲),32位的操作系统可以最大可以支持多大的内存
19、设计模式(代码实现、作用)、编码原则: 简书 - 写文章 (jianshu.com)

相关文章

网友评论

      本文标题:面试总结

      本文链接:https://www.haomeiwen.com/subject/cpqdfltx.html