JAVA API文档自主学习与研究2

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) {

        Object[] a = array;
        int s = size;

        if (s == a.length) {

//会对数组进行扩容,如果容量不够就会增加一倍.再把原来的数组copy到新的扩容后的数组中.

            Object[] newArray = new Object[s +
                    (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;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值