And hello to u too:) Click the icon above for more detail

Java On Call 3

  1. Java基础知识
  2. 面向对象
  3. 常用API
  4. 集合I/O
  5. 多线程、网络编程、反射、设计模式

这是准备java面试的第二天,以上的分类的思维导图,来自->这里

集合IO

集合

泛型(Generic)
Set
Comparable, Comparator
package java.util;
public interface Comparator<T> {
 
    int compare(T o1, T o2);
    boolean equals(Object obj)
}

package test;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public class test {
	public static void main(String[] args) {
		List<UserInfo> list = new ArrayList<UserInfo>();
		list.add(new UserInfo(1,21,"name1"));
		list.add(new UserInfo(2,27,"name1"));
		list.add(new UserInfo(3,15,"name1"));
		list.add(new UserInfo(5,24,"name1"));
		list.add(new UserInfo(4,24,"name1"));
		//对该类排序
		Collections.sort(list);
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}
	}
}
 
class UserInfo implements Comparable<UserInfo>{
	private int userid;
	private int age;
	private String name;
	public UserInfo(int userid, int age, String name) {
		this.userid = userid;
		this.age = age;
		this.name = name;
	}
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString(){
		return this.userid+","+this.age+","+this.name;
	}
	@Override
	public int compareTo(UserInfo o) {
		//如果年龄相同,则比较userid,也可以直接  return this.age-o.age;
		if(this.age-o.age==0){
			return this.userid-o.userid;
		}else{
			return this.age-o.age;
		}
	}
 
}
————————————————
版权声明本文为CSDN博主tolcf的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明
原文链接https://blog.csdn.net/tolcf/article/details/52229068


package test;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
public class test1 {
	public static void main(String[] args) {
		List<UserInfo> list = new ArrayList<UserInfo>();
		list.add(new UserInfo(1,21,"name1"));
		list.add(new UserInfo(2,27,"name2"));
		list.add(new UserInfo(3,15,"name3"));
		list.add(new UserInfo(5,24,"name4"));
		list.add(new UserInfo(4,24,"name5"));
		//new一个比较器
		MyComparator comparator = new MyComparator();
		//对list排序
		Collections.sort(list,comparator);
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}
	}
}
class MyComparator implements Comparator<UserInfo>{
	@Override
	public int compare(UserInfo o1,UserInfo o2) {
		
		if(o1.getAge()-o2.getAge()==0){
			return o1.getUserid()-o2.getUserid();
		}else{
			return o1.getAge()-o2.getAge();
		}
	}
}
class UserInfo{
	private int userid;
	private int age;
	private String name;
	public UserInfo(int userid, int age, String name) {
		this.userid = userid;
		this.age = age;
		this.name = name;
	}
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString(){
		return this.userid+","+this.age+","+this.name;
	}
}

————————————————
版权声明本文为CSDN博主tolcf的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明
原文链接https://blog.csdn.net/tolcf/article/details/52229068

Map集合
HashMap
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 
static final int MAXIMUM_CAPACITY = 1 << 30;  
static final float DEFAULT_LOAD_FACTOR = 0.75f; //默认负载因子0.75
static final int TREEIFY_THRESHOLD = 8; //当某条链表中元素的个数大于8时//将转变为红黑树
transient int size;  
int threshold;      //阈值,即当table中元素个数大于这个值就要resize()
final float loadFactor;  //加载因子  

有些数据就看一眼就能懂的,需要另外注意的是:

- **loadFactor(负载因子)**:负载因子声明了一个哈希表的装填程度。**负载因子的选择可以被认为是空间与时间上的一种折中**,这是因为当负载因子较高时,一个数组能够被填的越满,所以对整体来说,空间浪费会小(不管怎么样内存都已经把这部分的空间分配给了他),但同时查找速度因为值变多而降低;而当负载因子较小时,一个数组不会被填的太满,所以它整体上对空间的浪费较大,但是查找速度会因为值变少而加快。
- **TREEIFY_THRESHOLD**:为了保证效率,当一个链表中的元素的数量大于这个阈值的时候,这个链表就会被变成一个红黑树。 - **HashMap查找的Complexity**: 要分析这个complexity很简单,hash function是o(1),找到对应的位置是o(1),如果有链表的话原来是o(n),但是因为现在限制了链表的长度,所以查找最慢的地方在于搜索红黑树,而这个需要花上o(logn),所以HashMap查找的complexity就是**o(logn)** - **为什么HashMap会造成死锁**(<a href="https://blog.csdn.net/lantian0802/article/details/42487803">原文链接</a>)
- 为了了解造成死锁的原因,首先要知道的是,为了防止一个数组过载,HashMap会经常自己检查自己的size是否超出阈值,如果超过的话,需要进行resize操作,而当resize的时候,是很简单的新建一个更大尺寸的hash表并且把数据从旧表中直接转移到新表,当转移的时候,以下的事情会发生:
	1. 对索引数组中的元素遍历
	2. 对链表上的每一个节点遍历:用 next 取得要转移那个元素的下一个,将 e 转移到新 Hash 表的头部,因为可能有元素,所以先将 e.next 指向新 Hash 表的第一个元素(如果是第一次就是 null),这时候新 Hash 的第一个元素是 e,但是 Hash 指向的却是 e 没转移时候的第一个,所以需要将 Hash 表的第一个元素指向 e
	3. 循环2,直到链表节点全部转移
	4. 循环1,直到所有索引数组全部转移
- 自己走一遍就不难发现,转移之后的链表和本来的链表顺序是相反的,而问题也出在这个地方。当多线程高并发的时候,当一个线程先完成对hash table的转移,那么链表有可能会形成环形链表,死锁就有可能会出现。
LinkedHashMap
TreeMap
Hashtable

IO

Java IO模型
  1. 关于Bio,我们需要知道什么是同步阻塞IO模型,Bio操作的对象:流,以及如何使用Bio进行网络编程,使用Bio进行网络编程的问题
  2. 关于Nio,我们需要知道什么是同步非阻塞IO模型,什么是多路复用Io模型,以及Nio中的Buffer,Channel,Selector的概念,以及如何使用Nio进行网络编程
  3. 关于Aio,我们需要知道什么是异步非阻塞IO模型,Aio可以使用几种方式实现异步操作,以及如何使用Aio进行网络编程
Blocking, Nonblocking, Asychronous