ClassLoader:
类加载器是用来加载类的对象的。
类加载的过程中注意点:
先通过类的二进制名称查找到这个类。API中说
A typical strategy is to transform the name into a file name and then read a "class file" of that name from a file system
意思是说通过这个类的名字,找到对应的文件(所以在创建java的时候类的名字一定要和.java文件的文件名一样,不然无法找到这个类)
ENUM:
枚举类型不支持的方法:
clone():保证枚举类的唯一,无法复制
finalize():
Map:
K:the type of keys maintained by this map(键)
V:the type of mapped values(值)
Key与Value是对应的,Key是唯一的,而value不是.
HashMap:
&运算符:将前后两个参数转化为二进制,如果相同的位置上都是1,那么结果就是1.否则就是0.
put()方法的源码:
public V put(K key,V value){
// key为空时
if(key ==null )
return putForNullKey(value);
//取得key的hashcode
int hash = hash(key.hashCode());
//通过hashcode找到这个对象在链表中的位置
int i = indexFor(hash,table.length);
//通过这个位置,取出这个对象,然后再循环链表。
for(Entry<K,V> e=table[i];e!=null;e=e.next){
Object k;
//当hashcode相同,key也相同时,在原来位置上用新的值替换,但是返回oldvalue。
(put()这个方法返回的是原来没修改过的值,但是get()方法返回的是新的!!!!!)
if(e.hash==hash&&((k=e.key)==key||key.equals(k))){
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
//当不存在相同的Key时,直接添加entry
modCount++;
addEntry(hash,key,value,i);
return null;
}
get()方法的源码:类似与put()方法。
remove()方法也一样.
Set:
Set是一个无序且不重复的集合。
HashSet: 按照哈希算法来存储对象。(个人感觉hashcode是用来定位对象的地址,以方便快速存取,hashcode相同,对象不一样相同)
其实hashSet的底层就是通过调用hashMap的许多方法来实现自身的一些方法,是被封装在了一个HashMap中:
public HashSet() {
this(new HashMap<E, HashSet<E>>());
}
add()方法的源码:
public boolean add(E e){
//这个底层代码还是调用的Map里面的put()方法.因为Map里面的键是唯一的,所以,当重复的时候是无法添加进去的,这符合Set的需要---无序不可重复。
//当重复的时候map返回的是原值,当不重复时返回的是null
return map.put(e,PRESENT)==null;
}
remove()方法的源码:
public boolean remove(Object object) {
//调用HashMap中的remove方法实现.
return backingMap.remove(object) != null;
}
List:
ArrayList是一个有序且可以重复的集合。数据是线性存储的,底层其实就是一个可变长的数组。
构造方法:
public ArrayList(int initialCapacity){
super();
if(initialCapacity<0)
throw new Exception();
//其实是一个Object数组,默认的初始长度是10;
this.elementData = new Object[initialCapacity];
}
public ArrayList(){
this(10);
}
add()方法:
public boolean add(E object) {
int s = size;
if (s == a.length) {
//会对数组进行扩容,如果容量不够就会增加一倍.再把原来的数组copy到新的扩容后的数组中.
(s < (MIN_CAPACITY_INCREMENT / 2) ?
MIN_CAPACITY_INCREMENT : s >> 1)];
System.arraycopy(a, 0, newArray, 0, s);
array = a = newArray;
}
a[s] = object;
size = s + 1;
modCount++;
return true;
}
romve()方法:
public E remove(int index){
//先判断要Remove的这个元素是否存在,不存在则数组越界的问题
RangeCheck(index);
modCount++;
//取出要remove的元素
E oldValue = (E)elementData[index];
int numMoved=size-index-1;
if(numMoved>0)
//如果不是最后一个元素,那么从remove元素的后一位开始copy
system.arraycopy(elementData,index+1,elementData,index,numMoved);
//最后一个元素设置为空
elementData[--size]=null;
return oldValue;
}