美文网首页
面试总结

面试总结

作者: 书虫大王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