Android题目笔记(三)

1.如何保证多线程读写文件的安全?

共享锁: 共享读操作,但只能一个写(读可以同时,但写不能)。共享锁防止其他正在运行的程序获得重复的独占锁,但是允许他们获得重复的共享锁。
独占锁: 只有一个读或一个写(读和写都不能同时)。独占锁防止其他程序获得任何类型的锁。
多线程同步:java笔记–关于线程同步(7种同步方式)
进程中文件锁:Java 进程间文件锁FileLock详解

2.线程和进程的区别?

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
参考:进程和线程的区别

3.为什么要有线程,而不是仅仅用进程?

参考:有了进程为什么还要线程?
a.进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
b.进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。

4.算法判断单链表成环与否?

参考:判断单链表是否成环算法
核心算法:

        //定义两个指针为同一起点
        Node n1 = head;   //慢指针
        Node n2 = head;   //快指针
        //只要有环的话,这个循环条件就绝对会满足,如果没有环的话,到了最后总不满足
        while(n2.next != null && n2.next.next != null) {
            n1 = n1.next; //n1一次走一步
            n2 = n2.next.next; //n2一次走两步
            if (n1 == n2) {  //如果成环,总会有一点n1==n2
                return true;
            }
        }
        return false;
5.hashmap数据结构?

参考:
面试题 HashMap 数据结构 实现原理
Java中hashCode的作用
组成:链表+数组
存储位置:【hash(key)%len】

6.arraylist 与 linkedlist 异同?

同:
①都实现了List接口。
②顺序存储接口。
③都是线程不安全的。
异:
①ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
②.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
③对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

7.object类的equal 和hashcode 方法重写,为什么?

参考:
重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源
①equals方法与‘==’运算符有什么区别?—->默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了equals方法,使其比较的是字符的序列,而不再是内存地址。
②为什么重写equals()的同时还得重写hashCode()?—->这个问题主要是针对映射相关的操作(Map接口)

8.hashmap如何put数据(从hashmap源码角度讲解)?
public V put(K key, V value) {
        //...
        int hash = sun.misc.Hashing.singleWordWangJenkinsHash(key);
        int i = indexFor(hash, table.length);//return hash & (table.length-1);
        // 查找如果已存在,则直接返回
        for (HashMapEntry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

    void addEntry(int hash, K key, V value, int bucketIndex) {
        if ((size >= threshold) && (null != table[bucketIndex])) {
            resize(2 * table.length);// 扩容
            hash = (null != key) ? sun.misc.Hashing.singleWordWangJenkinsHash(key) : 0;
            bucketIndex = indexFor(hash, table.length);
        }

        createEntry(hash, key, value, bucketIndex);
    }

    void createEntry(int hash, K key, V value, int bucketIndex) {
        HashMapEntry<K,V> e = table[bucketIndex];
        table[bucketIndex] = new HashMapEntry<>(hash, key, value, e);
        size++;
    }
9.简述IPC?

参考:IPC机制简介与基础概念
进程间通信(Inter Process Communication),指两个进程之间进行数据交换
Binder机制

10.fragment之间传递数据的方式?

①getActivity().getSupportFragmentManager().findFragmentByTag(“xxxFragment”);然后强转调方法,这个最好使用接口的形式回调。
②EventBus或者OTTO。EventBus 和Otto的区别

参考文章–>https://mp.weixin.qq.com/s/sN_i_IaLUpFBbX9UHIX4NA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值