java 必备知识点

1 。 LinkedHashMap和TreeMap的区别?

首先2个都是map,所以用key取值肯定是没区别的,区别在于用Iterator遍历的时候
LinkedHashMap保存了记录的插入顺序,先插入的先遍历到
TreeMap默认是按升序排,也可以指定排序的比较器。遍历的时候按升序遍历。
例如:a是LinkedHashMap,b是TreeMap。
a.put("2","ab");
a.put("1","bc");
b.put("2","ab");
b.put("1","bc");

那么遍历a的时候,先遍历到key是2的,因为2先放进去。
遍历b的时候,先遍历到“1”,因为按顺序是先1后2

所以以后用Map的话,不要用HashMap,它没有任何优势。

2.LinkedHashMap(int initialCapacity, float loadFactor,boolean accessOrder)          构造一个带指定初始容量和加载因子的空插入顺序LinkedHashMap 实例,initialCapacity和加载因子是什么意思?如何做到删除最老的元素呢?

initialCapacity是初始容量,断点跟踪源码得知:LinkedHashMap内部有个Entry类的数组,Entry table[] ,而initialCapacity就是新建数组的大小

Entry[] table = new Entry[initialCapacity];那么这个到底占不占内存呢?我们可以这么想,new出一个class类时,其实是开辟里面成员变量的空间,也就是已经占用内存了,至于有没有给成员变量赋值是另外一回事,而new出一个Entry数组,相当于同时new出了数量是initialCapacity 个对象,每个对象中的成员变量都是要开辟空间的。所以这个

new Entry[initialCapacity]是占内存的。Entry成员变量占用的内存越大,整个对象占用的内存也就越大。

加载因子是已存和的数据容量与总容量的比率,采用小数表示,默认为   0.75,即表示当   Map   中的数据量达到总容量的   75%   时,其容量空间自动扩张至原容量的一倍。

③参数 accessOrder的作用。

true表明,是按照访问顺序排列。

(2)如何做到删除最老的元素呢?

起初我以为只要重写removeEldestEntry(),返回true就可以了。

但是我发现,现实情况并不是这样,还需要再添加2句代码,从LinkedHashMap取数据时,取到后,先

remove()掉,然后再加上。

 

    private final HashMap<String, Bitmap> sHardBitmapCache =
        new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY / 2, 0.75f, true) {
        /**
			 * 
			 */
			private static final long serialVersionUID = 1L;

		@Override
        protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) {
            if (size() > HARD_CACHE_CAPACITY) {
                // Entries push-out of hard reference cache are transferred to soft reference cache
                sSoftBitmapCache.put(eldest.getKey(), new SoftReference<Bitmap>(eldest.getValue()));
                return true;
            } else
                return false;
        }
    };

    private Bitmap getBitmapFromCache(String url) {
        // First try the hard reference cache
        synchronized (sHardBitmapCache) {
            final Bitmap bitmap = sHardBitmapCache.get(url);
            if (bitmap != null) {
                // Bitmap found in hard cache
                // Move element to first position, so that it is removed last
                sHardBitmapCache.remove(url);
                sHardBitmapCache.put(url, bitmap);
                return bitmap;
            }
        }}


 


2* initialCapacity

一般来说,没有什么特殊的要求,不建议去更改。

我们可以从LinkedHashMap的源码中证明

 

    void addEntry(int hash, K key, V value, int bucketIndex) {
        createEntry(hash, key, value, bucketIndex);

        // Remove eldest entry if instructed, else grow capacity if appropriate
        Entry<K,V> eldest = header.after;
        if (removeEldestEntry(eldest)) {
            removeEntryForKey(eldest.key);
        } else {
            if (size >= threshold) //当大于等于临界值时
                resize(2 * table.length); //其容量空间自动扩张至原容量的一倍。
        }
    }


 

LinkedHashMap()
          构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。

 3.集合类中的size()是什么意思?iterator.remove();删除的是什么?

答案:size()是指内存块数量,而不是元素数量。 iterator.remove();// 从MAP中删除引用,删除这个内存块,size()会减小

2.HashMap的无序指得是什么?

 指得 没有按插入的先后顺序排列,每次元素输出的顺序都是随机排列的。

2.Map里面的putAll( Map otherMap)存放的是另一个map的地址,还是把它的值复制了一遍?

答案:其实只是一个地址而已,并没有赋值,如果对otherMap 做删除操作,执行clear(),会直接将当前的map值也都清除

但是List的addAll()是复制值,而不是复制一个地址   

  temp.addAll(fileEntitys);
     fileEntitys2d.add(temp);
     fileEntitys.clear();//不影响

2.重写与扩展的区别

我们经常用overwrite重写方法,似乎忘了,它还有另外一层意思,那就是扩展,

即在我们添加的代码前面加上super()就是扩展原来的方法,而不是完全所谓的重写

 

3.我们可以给任意一个类定义成静态类吗?
答案:只能给内部类加上static 修饰符,如果给外部类BitmapUtil加上static修饰符时,会提示错误:Illegal modifier for the class BitmapUtil; only public, abstract & final are permitted

 

4.如何控制并发线程的数目?

①使用线程池

②把Thread线程的引用存储到集合中,在启动线程前,判断集合中的引用是否已达到规定数量。

 

5.LRU != 队列

6.java中自带的LRU(查看API文档得知)

     private static final int MAX_ENTRIES = 100;

     protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
     }
 
翻译:删除最老的条目,Eldest==Oldest都是old的最高级

如果返回 true,则开始执行删除最老的条目,如果返回false,则不删除最老的条目。

7.编程时什么时机下往上抛出异常,什么时机下处理异常?

答案:要想知道这个问题,就必须弄清楚往上抛异常和直接处理异常的重大区别:

假设有2个类,A,B,。

class A {

public readFile(){

 try {

        B bb= new Class B();

       File file =  bb.getFile();

        System.out.println(file.getName()); 

      }catch(FileNotFoundException e){

                  e.printStackTrace();

       }

}

 

}

class B throws FileNotFoundException {

public File getFile(){

    return new File("D:/aa.txt");

    }

}

其中A类调用了B类的一个方法getFile(),如果B类的方法代码出现异常则直接抛给了调用者A类的 File file = bb.getFile();那么它后面的代码    System.out.println(file.getName()); 也就不会执行了,而是跳到catch语句块中;

如果我们直接在B类中用catch处理了异常,那么A类的File file = bb.getFile(); 之后的代码

      System.out.println(file.getName()); 将会继续执行

class A {

public readFile(){

        B bb= new Class B();

       File file =  bb.getFile();

        System.out.println(file.getName()); 

      } 

}

 

class B {

    public File getFile(){

try{   

    return new File("D:/aa.txt");

    }catch(FileNotFoundException e){

                  e.printStackTrace();

       }

  }

}

以上便是这2者的区别,经我查看,别人写的代码都是底层往上抛,一直到UI层为止,然后用个Dialog来显示错误信息

 

8.本人提出的新概念 “二维集合”

例如List<List<TransfersEntity>>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值