# 新浪

  1. ArrayList 和 LinkedList 的区别,它们哪个插入元素是可重复的和不可重复的,哪个是线程安全的

  2. 数据结构中有一个哈希表 HashMap,它是不是线程安全的,怎么变成线程安全的

  3. List 中存入数据,例如 int 类型的数据,是直接存入 int 类型吗?

    不是,因为存在自动装箱与拆箱,所以是存入它们的引用类型。

  4. 最近看过什么技术书,说说 MVC、MVP 和 MVVM

  5. 图片框架的缓存机制。

  6. Glide 如果加载 9 张图片,那么是从上往下加载吗?

  7. 除了 Http 连接和 TCP 连接之外,还有什么连接

  8. RxJava 和 Retrofit 用到的一些基本的方法

    RxJava 的三个概念:

    • Observable:被观察者(主题 Subject)
    • Observer/Subscriber:观察者
    • Subscribe:订阅

    Observable 和 Observer 通过 subscribe() 方法实现订阅关系

    使用的一种简单方法:

    1. 创建被观察者 Observable
    public Observable<String> getObservable() {
        return Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObserableEmitter e) throws Exception {
                // 只需要三个方法 onNext | onError | onCompleted
                e.onNext("");
                e.onNext("");
    
                e.onComplete();
    
                // e.onError();
            }
        })
    }
    
    1. 创建观察者 Observer
    public Observer<String> getObserver() {
        return new Observer<String>() {
            @Override
            public void onError(Throwable e) {
                // 发生错误时调用
            }
    
            @Override
            public void onComplete() {
                // 数据接收完成时调用
            }
    
            @Override
            public void onSubscribe(Disposable d) {
                // 移除订阅关系
                // d.dispose();
    
                // 判断是否取消订阅关系
                // d.isDisposed();
            }
    
            @Override
            public void onNext(String s) {
                // 正常接收数据时调用
            }
        }
    }
    
    1. 订阅
    Observable<String> observable = getObservable();
    Observer<String> observer = getObserver();
    
    // 关联观察者和被观察者 -> 订阅
    observable.subscribe(observer);
    

    Retrofit 的使用方法:

    1. 创建接口,设置请求类型和参数,例如
    @GET("userInfo/login")
    Call login(@Query("username") String username, @Query("password") String password);
    
    1. 创建 Retrofit 对象,设置数据解析器等
    Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();
    
    1. 生成接口对象,调用接口方法获取 Call 对象
    My my = retrofit.create(My.class);
    Call call = my.login("", "");
    
    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
    
        }
    
        @Override
        public void onFailure(Call call, Throwable e) {
    
        }
    })
    
  9. TCP 的三次握手

  10. 了解什么 Jetpack 组件吗

    LifeCycle、ViewModel、LiveData、Paging、Room、Navigation、DataBinding等

  11. 了解 Comparable 接口吗

    Comparable & Comparator 接口都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序。

  12. git mergegit rebase的区别

  13. 使用了哪种 Git 图形界面客户端

    SourceTree