面试 Notes|2021 年秋季 Android 求职记。。。

2021-12-12 09:35:24 浏览数 (2)

扯犊子之前,先放一张面试图吧:

在这里插入图片描述在这里插入图片描述

求职?求生?Start...


说来也怪,从入职的第一天就觉得很不舒服,然后慢慢产生离开的念头,随后转变思想,回去打算按照步骤继续学习,避免下次求职尴尬。奈何。

过去的事儿,不想再说太多了,挺坑的,也挺现实的。

孰是孰非,深究无意,备好行囊,继续出发~

感兴趣的可以点击查看:

  • 面试|2021 菜鸟金三银四铜五 Android 被锤历程出炉...

其实上家公司带来的影响蛮大的,可能也算是成长的代价吧,还好。

本来想着,找个工作,然后好好喷喷,将那副丑恶的嘴脸曝光。直到现在确定入职公司了,电脑面前,却不知道说啥了。

人在做天在看吧,好自为之。。。

本次真实记录面试历程,希望对求职的你有一些帮助。。。

干货面试好文


不错的面试大纲:

  • https://juejin.cn/post/6844904079177547789
  • https://www.kancloud.cn/aslai/interview-guide/1113658

另外还有一些营销号发布的一些技能点,也可以作为面试复习参考。

下面有自己目前整理的面试文档,后续会找个合适的方式好好整理一波。

  • 个人飞书文档整理地址:https://aorni1vik4.feishu.cn/docs/doccnTIPSuCC3T1filA9PDhOCQe

2021 - 09 - 29


又重新开始面试,刚开始有点蒙,不过慢慢就会好起来的~

阿凡提 - 供应链物流 避坑

有些无奈,项目着急缺人,草草结束面试环节。

到楼下抽了两根烟,依然处于懵逼环节。

  • 简单介绍下项目经历。
  • 熟悉 Kotlin 吗?简单说下 let、apply、run 区别。
    • 它们是 Kotlin 提供的作用域函数,也就是在对象的上下文中执行代码块。
    • 可以从函数内使用区分进行理解:this、it
    • this:
      • with: 内联函数,函数内使用 this 来访问该对象属性方法,返回值为函数块最后一行或指定的 return;
      • run: with、let 结合体,可以通过 this 来访问该对象属性方法,也可以通过像 let 一样进行对象统一判空处理,返回值为函数块最后一行或指定的 return;
      • apply: 和 run 相似,区别在于返回的是传入对象本身;
    • it:
      • let: 扩展函数,可以对被扩展的对象进行统一判空,函数内通过 it 访问其对象属性方法,返回值为函数块最后一行或者指定的 return 表达式;
      • also: 和 apply 类似,不同是函数内通过 it 访问该对象,同样返回为传入对象。
  • 你们的网络请求异步回调怎么处理的?
  • Kotlin 协程用过吗?Kotlin 协程深入研究过吗?
代码语言:txt复制
- 轻量级线程,创建协程不需要分配新的线程。默认使用已经定义好的线程池,智能调度。并且协程提供挂起(suspend)和恢复(resume)操作。
    - **挂起(suspend):** 挂起当前执行的协同程序,并且保存此刻的所有本地变量。协程内部是使用状态机来管理协程的各个挂起点;
    - **恢复(resume):** 从它被挂起的位置继续执行,并且挂起时保存的数据也被还原。
    - [Kotlin协程实现原理:挂起与恢复](https://www.rousetime.com/2020/11/23/Kotlin协程实现原理-挂起与恢复/)
  • 你是怎么做的 Apk 瘦身。
代码语言:txt复制
- 首先通过 Android Studio 提供的 Apk 分析器去获取当前 Apk 包中各个占比情况,然后根据占比进行对应处理。主要分为以下几个方面:
- So 方面:对标微信,查看对应兼容 So 情况,这里排除 So 动态加载方式,最后选择只保留 arm64-v8a。
- 资源方面:这块内容较多,可分情况举例说明。
    - 开启 lint 严苛模式,物理移除用不到的资源文件,记得单独 git commit;
    - 有损压缩 png 图片[TinyPng](https://tinypng.com/)。项目较大的情况可通插件的方式进行处理压缩,主要是在 processDebugResources Task 后进行对应资源处理;
    - 部分 icon 类型图片替换 svg,注意使用时需要通过 compat 方式使用,src 低版本会有兼容问题;
    - 部分 gif、png 升级 WebP 格式图片;
    - 采用微信资源压缩,主要是通过将资源路径变短的方式以达到缩小 Apk 大小的方式。 [AndResGuard](https://codechina.csdn.net/mirrors/shwenzhang/AndResGuard)
    - build 开启语言限制,代码、zip 压缩等常规基础配置;
    - 限制当前 app 支持国家语言。
- 代码方面:
    - 代码优化,减少冗余代码;
    - 配合以上 build 常规基础配置。
  • 依赖注入框架 Dagger 用过嘛?
  • 地图相关开发过吗?都做过哪儿些东西?你做过地图行程路径规划吗?
  • 大概什么时候能入职?加班怎么看?

其实最好还是线上沟通,后续看情况选择是否进行二次线下,这样至少对于双方而言,成本更低,面试者也不需要来来回回很多时间花费在路上,结果草草了事。

明日世界 - 直播/社交

进门需要写面试题,分为单选、多选、简答。前两项都是网上多年之前的老题目,我这估计没能全对。

  • 用你最熟悉的排序算法对下列排序 {1,3,3,2}
代码语言:txt复制
- 双指针、冒泡、递归 
  • 说下 Java、Android 中常见的内存泄露的方式和解决办法
代码语言:txt复制
- 常见的内存泄漏方式:
    - 非静态内部类、匿名内部类
    - 静态的 View
    - Handler
    - 监听器(各种需要注册的 Listener、Watcher 等)
    - 操作资源对象没关闭
    - 属性动画
    - 低版本的 WebView 会发生内存泄漏,主要是持有 Context 导致,高版本已修复。 [Android-WebView还会存在内存泄漏吗?](https://juejin.cn/post/6901487965562732551)
- 解决办法:
    - 内部类加 static,内部使用外部类对象时,同时需要设置为弱引用;
    - 及时进行对应操作的回收操作,例如:IO 流、取消注册监听、关闭动画等; 
    - 如果需要兼容这部分低版本机型,可以通过首先移除 WebView 后续通过 WebView 的 destroy 进行对应销毁处理。
- [Android中常见的内存泄露及解决办法汇总](https://blog.csdn.net/unicorn97/article/details/81009204)

据说是面试官是九秀直播的负责人,前期车载业务方面多聊了一会儿,剩下技术蛮深入的。

  • 自我介绍,公司主要负责哪儿方面业务的开发。
  • 省略前期讨论的车载相关的整个业务流程以及相关细节。
  • 假设现在有这么几个 Activity,A 为 singTask,B 为 singTop,当我从 A 启动 B,然后现在点击 Home 键返回后台,随后点击桌面 Icon 启动 App,那么这时候呈现在用户面前是哪儿个页面。
代码语言:txt复制
- A 页面。
  • 你知道当点击 Icon 启动 App,系统如何将应用从后台转为前台的么?
  • HashSet 和 HashMap 的区别,从数据结构方面来描述。
代码语言:txt复制
- HashMap 1.7 版本之前底层数据结构为:数组   链表,1.8 后变为 数组   链表   红黑树。由于 HashSet 底层也是 HashMap 实现,所以两者底层数据结构一致。
  • 你能说下对 Bitmap 的理解么?
  • 如何优化 Bitmap 在内存中占用的大小呢?
代码语言:txt复制
- 首先拓展如何计算 Bitmap 所占用内存大小:Bitmap 宽度(px)* Bitmap 高度(px)* 像素点占用字节数
- 优化思路:
    - 通过采样率压缩改变 Bitmap 宽高;
    - 通过 matrix 压缩(createBitmap)Bitmap;
    - 改变 Bitmap Config 为占用字节更少的 ARGB_4444 或者 RGB_565
- [性能优化:Bitmap内存大小优化的几种常见方式](https://blog.csdn.net/qq_26287435/article/details/106603029)
  • ARGB_8888 在内存中占比是最大的,还是最小的?
代码语言:txt复制
- 最大的。ARGB_8888 占用 4 个字节,ARGB_4444 和 RGB_565 占用 2 个字节。
  • 如何实现 Bitmap 的复用。
代码语言:txt复制
- 借助 Lru 算法以及弱引用
  • 你知道你在使用帧动画的时候为什么内存居高不下吗?如何进行优化呢?
  • 一张图片转换为 Bitmap 对象,你知道这里面存放的都是什么信息么?
代码语言:txt复制
- 当前图片颜色值,存放类型取决于使用的是什么类型的 Config。
  • Bitmap 存储信息的数据结构是怎样的?
  • 我创建一个对象,当我不使用的时候,并且将它置空,这时候就会立即被回收吗?
  • 现在有这样的一个需求,我在 Activity 中的 View 中添加一个浮窗小球,并且让其随着手指移动,你有什么方式实现?移动点击的时候,又该如何处理?
  • 在自定义 View 中,你是会在内部重写 onTouchEvent 还是在外层进行处理?
  • 内部重写 onTouchEvent() 和外层调用 setOnTouchListener() 有什么区别?
代码语言:txt复制
- **onTouchEvent():** 处理屏幕上的操作,例如点击、长按、滑动等;
- **setOnTouchListener():** 获取某一个控件的点击监控。
- 两者之间区别:
    - 外层 setOnTouchListener() 优先级要高于内部 onTouchEvent();
    - setOnTouchListener() onTouch 返回 true(事件被消费),则 onTouchEvent() 不会执行。反之,onTouchEvent() 才会执行。
- [Android onTouchEvent和setOnTouchListener中onTouch的区别](https://blog.csdn.net/shineflowers/article/details/41080435)
  • onTouchEvent 如何实现自定义 View 的点击操作?
  • 假设我在自定义 View 中内部消费掉了这个事件,那么我在外层去设置 setOnTouchEvent 监听,还能监听到吗?那么如果在内部不消费这个事件,外层监听还有效吗?
  • 你能大概的说下 RecyclerView 的用法吗?
  • 大概说下 RecyclerView 的缓存机制。
  • 假设我现在的 RecyclerView 有三种 item layout,现在我开始滑动,那么这期间的缓存变化是怎样的?
  • 假设现在有五条数据,我往上滑动一条,这时候缓存变化是怎样?
  • 你知道 RecyclerView 的一级缓存容量多大吗?
  • 假设,我现在又新增了一种 item layout,那么这个新的 item layout 是什么时候会被缓存?
  • 假设我现在 item layout 只有一种,我页面上显示了五个 item,那么这个时候 RecyclerView 的一级缓存中存放了几个 ViewHolder?
  • 假设我现在的 App 存在如下两个问题:
    • 启动比较慢
    • 应用使用过程中会出现卡顿 针对以上两个问题,结合你之前的经验,你会通过哪儿些方面去解决这两个问题?
  • 如何精准定位具体卡顿地方呢?通过哪儿些方式?维度?
  • 你是如何检测屏幕卡顿?思路、方案简述。
  • 具体离职时间和离职原因。车载目前团队配比怎样?
  • 你 MVVM 用的多吗?
  • 你对加班怎么看?期望薪资,入职时间。

晚上回家的时候 HR 小姐姐打来电话,大概沟通了半个小时左右吧。聊了很多方面,具体印象不太深了。

小姐姐声音蛮好听的,轻声细语的,很温柔,嗷嗷嗷~

后续貌似是入职时间较晚,还是业务什么原因,暂时未能牵手成功。

问了下朋友,之前面试也是被同样的理由回绝的,ummm。

害。

达不溜科技 - 短视频/社交

上家面试有点超时,后续找个哈啰,刹车还不好使,最后还跑偏了。

公司正在装修,面试过程中被装修工人打扰了几次。

面试官温文尔雅的,聊的整体还凑合吧,会的都说了,不会的也坦然说明了。

  • 你是自学的开发吗?自我介绍。
  • 大概介绍下公司的项目和情况。
  • 简述 Activity 启动模式。
代码语言:txt复制
- Activity 有四种启动模式,分别为:standard、singleTop、singleTask、singleInstance。
- **standard:** 默认启动模式,每次都会新建一个 Activity 实例放入栈中;
- **singleTop:** 栈顶复用模式,当前 Activity 位于栈顶,不会创建新的 Activity 实例,而是会回调 onNewIntent()。反之,当前 Activity 位于栈内非栈顶,效果同 standard;**适用于推送详情页**
- **singleTask:** 跳转该模式的 Activity 时,首先会在任务栈中查看是否存在该实例,如果存在则会将位于这个 Activity 实例上的 Activity 全部结束,并将当前 Activity 位于栈顶;**适用于主页**
- **singleInstance:** 新创建一个任务栈,单独存放该 Activity。
  • 详细介绍下 Handler。
  • UI 页面是如何进行回收的呢?
  • 简单描述下你了解的垃圾回收。
  • 内存中的那儿些地方可以作为 GC root?它可回收的一些点。
代码语言:txt复制
1. Java 虚拟机栈(局部变量表)中引用的对象;
2. 方法区中静态引用指向的对象;
3. 仍处于存活状态中的线程对象;
4. Native 方法中 JNI 引用的对象。
  • 垃圾回收不当会造成内存泄漏,你是如何检测和治理的?
  • 假设用户设备上出现崩溃闪退的情况,你是如何能了解到这个情况呢?
  • OkHttp 和系统提供的网络访问框架有什么区别?
  • RecyclerView 和 ListView 区别。
  • 当用户点击桌面 icon 启动 app,这个过程是怎么样的?
  • 针对启动 app 的时间又是如何优化的呢?
  • 针对 UI 卡顿有没有心得体会?比如说列表卡顿?动画卡顿等?
  • 短视频缓存这块做过哪儿些操作?
  • MVC、MVP 和 MVVM 有什么区别?
  • Flutter 主要你做了哪儿些内容?
  • 大概说下你是怎么做的 Apk 瘦身?
  • 具体说下如何实现大图加载。
  • 简单说下学历情况,离职原因大概说下。

多元主义 - 数码产品社区

初创公司,莫名的感受到不愉快,后续的面试也没用心了。mmp,请的假,白花花的现大洋出去了。

这块主要分为技术 HR 聊,技术主要是根据他的点回去问一些东西,时不时的打断这点有点烦人,打断的频率高了之后明显个人有点不耐烦了。而 HR 会说一些公司以及项目情况,顺便也会问一些杂七杂八的东西。

工资构成主要为:基本工资 加班费。大小周,大周会有加班费(这点还是蛮不错的,比起那些情怀、大饼公司而言,这点确实实实在在)。

  • 自我介绍以及项目描述。
  • Flutter 你是如何减少嵌套。
  • 你是如何做的 Apk 瘦身。
  • svg、jpg 和 png 有什么区别?
  • HashMap 和 HashTable 区别。
代码语言:txt复制
两者主要区别在于:
代码语言:txt复制
- Hashtable 内部实现添加了 synchronized 来确保线程同步,所以它是线程安全的,而 HashMap 则是线程非安全的。
代码语言:txt复制
其它区别如下:
代码语言:txt复制
- HashMap key 可以为 null,Hashtable key 不允许为 null; 
- HashMap 实现了 Map 接口,而 Hashtable 则实现了 Map 接口以及 Dictionary 抽象类;
- HashMap 初始容量为 16,Hashtable 初始容量为 11,两者默认填充因子都是 0.75;
- HashMap 2 倍扩容,而 Hashtable 则是 2 倍扩容   1;
- HashMap 获取 hash,先对 key 的 hashcode 进行二次 hash,已获得更好的散列值,然后对 table 数组长度取模。而 Hashtable 则直接使用 key 的 hashcode 对数组长度进行取模以获取 hash。
  • HashMap 是线程安全的吗?
代码语言:txt复制
HashMap 是非线程安全的。
  • 数组的查询和插入/删除哪儿种更高效。
代码语言:txt复制
查询更为高效,其本质通过寻址定位法去进行数据查找,效率较高。而针对插入/删除,则需要移动后续的数组下标,效率较低。
  • 链表和数组有什么区别?
  • 查询的话,数组和链表哪儿个更快?
  • 设计模式你了解的以及用过的哪儿个比较多?
  • 单例模式的饿汉和懒汉有什么区别?在线程安全和不安全下的表现又是如何?
  • 工厂模式适用哪儿些场景业务?
  • 抽象工厂模式有了解过吗?
  • MVC、MVP 以及 MVVM 简述。
  • Http 和 Https 有什么区别。
  • 你了解对称加密和非对称加密么?
代码语言:txt复制
对称加密和非对称加密在加解密过程、速度、传输的安全性都有不同:
代码语言:txt复制
- 对称加密加解密的过程都是使用同一个密钥,且加解密的速度较快,适合数据量大时候使用,但是加密过程中无法确保密钥被安全传递,一旦泄漏,整个通信就会被破解;
- 非对称加密采用公私钥的方式,公钥加密私钥进行解密,加解密时间较长,适合数据量小的时候使用。而关于安全性而言,私钥是基于不同的算法生成不同的随机数,也就是说私钥通过一定的加密算法可以推导出公钥,但是私钥到公钥的推导过程是单向的,也就是说公钥无法反推导私钥,所以安全性较高。
- 对称加密算法:DES、AES 等,非对称加密:RSA 等。
- [非对称加密和对称加密的区别](https://www.jianshu.com/p/de50d1489359)
  • 公私钥加密过程是怎样?
  • 二叉树的遍历方式。
  • 如何实现数组反转?
  • 有了解过自动化打包工具吗?

2021 - 09 - 30


晚上就要回家啦~ 开森~

打算白天干完农活,晚上抽空看看题~

希望能坚持下来哇~

六间房 - 直播/社交

地铁没挤上,加上路上耽搁,晚了半个小时多,进去 HR 小姐姐直接安排开始面试了,给了一瓶水,整体来说面试官蛮不错的。个人感觉比较注重基础一些东西吧。

有条件的还是要去大公司看看,至少经历的和实战的,的确不是一回事儿。长时间的日积月累,确实底蕴在那。

  • 最近在做什么呀?有 Flutter 开发经验么?混合开发还是原生开发?Flutter 项目采用的是什么架构类型?Flutter 状态管理怎么做的?如何实现通过状态更新达到事件触发?Flutter 中 Weight 有状态和无状态的区别是什么?
  • Kotlin 用了多久了?
  • Apk 瘦身你主要做了哪儿些操作?
  • 用到过插件化或者组件化吗?
  • 启动优化做了哪儿些?有考虑过线程池的方案吗?
  • 假设我现在需要在闲暇时进行初始化,你有哪儿些方案?
  • UI 布局如何优化的?
  • 比如我现在需要监控 UI 卡顿,你有哪儿些方案?那如果我想监控具体的列表卡顿呢?
  • 宽带优化怎么做的?
  • LeakCanary 底层源码怎么实现的有了解过吗?
  • 为什么会出现内存泄漏情况?举个具体例子。
  • Handler 内部的一些关系。
  • Handler 中的 Message 如何保证发送的和拿到的是一致的?
  • 大概了解哪儿些设计模式?具体应用哪儿些场景?
  • 手绘责任链的类图。
  • 实现多线程的方式。
  • OkHttp 使用的线程池是什么类型的?
  • 如何在 Theard 中停止这个线程?
  • AsyncTask 底层如何实现的多线程?
  • MVVM 官方框架图是什么?哪儿几层?他们之前的关系是怎样,如何交互,如何实现的 MVVM,MVVM 的核心是什么。ViewHolder 如何获取到的数据?
  • Activity 和 Fragment 如何共享 ViewHodler 数据?ViewModel 层如何实现数据共享?
  • 组件化如何使用的?如何划分的?
  • module 之间如何进行通信的?
  • 直播怎么做的?有用过 Flutter 开发直播项目么?
  • 你对 GC 了解多少?
  • HashMap 底层实现原理是什么?HashMap 和 HashTable 有什么区别?
  • IntentService 主要做什么操作?
  • Handler、Thread、HandlerThread 三者之间区别?
代码语言:txt复制
- **Handler:** 主要是在 Android 中负责消息处理,通过它可以实现线程之间的消息通讯;
- **Thread:** Java 进程中执行运算的最小单位,也就是执行处理机调度的基本单位;
- **HandlerThread:** 一个继承自 Thread 的 HandlerThread,Android 中没有对 Java 中的 Thread 进行任何封装,而是提供了一个继承自 Thread 的 HandlerThread 类。由于它本身继承自 Thread,所以本质就是个 Thread。与普通的 Thread 的区别在于,其内部直接实现了 Looper 的实现,有了 Looper 就可以让我们在线程中进行消息处理,如果不使用 HandlerThread 的话,需要手动调用 Looper.prepare() 和 Looper.loop()。 
- [Handler、Thread和HandlerThread的差别](https://juejin.cn/post/6844904079160770568#heading-107)
  • Android 进程间通信方式。
代码语言:txt复制
- **文件共享**
- **AIDL**
- **Bundle**
- **ContentProvider**
- **Socket**
- **Messenger** 
- [Android进程间通信](http://liuwangshu.cn/tags/Android进程间通信/)、[记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了](https://blog.csdn.net/hollis_chuang/article/details/107776832)
  • 消息信使了解多少?
  • 什么是线程安全?什么样不是线程安全?如何实现线程安全?
  • volatile 价值是什么?
  • 禁止重排序还有什么方式可以实现?
  • Flutter 任务管理怎么封装的?
  • 对于加班怎么理解的?期望薪资。

面试结束的时候,门口保安大爷询问情况,还安慰半天,哈哈哈,好贴心。

可爱的大爷~

万度健康 - 医疗健康 避坑!!!

整场面试下来,感觉很轻松。

面试官一直像个大哥一样再问自己想问的,顺便深入解惑。很不错的一场面试体验。

  • 自我介绍。
  • 解释下依赖注入。
  • 一个对象会在什么情况下会被内存会收掉?
  • 弱引用,弱在什么地方了?
  • 如何证明一个对象被引用了?
  • 假设我现在正常引用一个对象,在另一个地方使用弱引用去引用这个对象,当我释放掉了这个强引用对象的时候,那边可能会出现什么问题?
  • 什么情况下会出现野指针?
  • String 是可变的吗?为什么设计成为这样?
  • 常量池有了解吗?
  • 为什么说子线程不能更新 UI?为什么设计成这个样子?
  • 数组和链表有什么区别?
代码语言:txt复制
- 从**逻辑结构**来说,这两种数据结构都属于线性表;
- 从**物理内存**中来说,数组占用的是一块连续的内存区,而链表则是分散的,所以链表比数组多了一个指向下一个节点的指针(单向链表);
- 数组通过寻址快速定位,链表则需要依次遍历指针节点,所以数组的查询效率更高一些,其对应的时间复杂度为 O(1) 和 O(n);
- 在插入、删除时,由于数组是连续空间,会导致后续节点依次后移,而链表则只需要修改对应的指针即可,所以插入、删除的情况下链表的性能更优;
- 从**操作系统的内存管理**来说,内存管理会将连续空间提前读入缓存,已进一步提高访问效率。而链表由于在内存中是分散的,则不会都读入内存中。
- [数组与链表的区别](https://zhuanlan.zhihu.com/p/52440208)
  • 数组本身是什么?还可变吗?
代码语言:txt复制
数组本身是个对象,由 JVM 创建,而这个直接创建的对象父类就是 Object。
代码语言:txt复制
数组本身是不可变的,初始化的时候便会设置容量大小。但是后期可以通过扩容的方式改变大小,比如 copyOf 数组拷贝,或者 ArrayList 动态扩容。
代码语言:txt复制
- [JAVA中的数组是对象吗?](https://www.zhihu.com/question/26297216)
  • 单向链表和双向链表有什么区别?
代码语言:txt复制
单向链表:只有一个指向下一个节点的指针。 适用于节点增加、删除。
代码语言:txt复制
    - 优点:增加删除节点简单,遍历不会死循环。
    - 缺点:只能从头到尾遍历。
代码语言:txt复制
双向链表:有两个指针,一个指向前一个节点,一个指向后一个节点。 适用于双向查找节点的情况。
代码语言:txt复制
    - 优点:可以找到前驱和后驱,可进可退。
    - 缺点:增加删除节点复杂度,需要额外多分配一个指针存储空间。
    
  • Apk 瘦身怎么做的。
  • so 具体是什么东西?
  • 矢量图和位图的区别?
  • Activity A 切换到后台,随后切换到前台,接着启动 Activity B,这时候它们的生命周期是怎样的?
  • Touch 事件的传递流程。
  • 老家哪儿的?结婚了么?平时会玩游戏吗?
  • 假设现在有一个 7L 的桶和 5L 的桶,如何倒出 6L 的水?
  • 两数交换。
  • 三个人三天喝三桶水,九个人九天喝几桶水?

临走的时候,小姐姐还会让站在公司前台拍个照,

0 人点赞