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的区别