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