1.调用system.gc()是否会立即回收垃圾?
其实当我们调用system.gc()的时候并不会马上进行垃圾回收,甚至是最终是否进行垃圾回收都是未知数。
boolean shouldRunGC;
synchronized(lock) {
shouldRunGC = justRanFinalization;
if (shouldRunGC) {
justRanFinalization = false;
} else {
runGC = true;
}
}
if (shouldRunGC) {
Runtime.getRuntime().gc();
}
}
当justRanFinalization=true的时候才会执行
正确做法如下:
System.gc();
runtime.runFinalizationSync();
System.gc();
不到万不得已不要调用,因为jvm有自己的gc策略,根本不需要我们来手动
2.Hashmap和hashtable的区别是什么
HashMap和HashTable都实现了Map接口,但是两者的区别在于有以下几点点:
(线程安全性,同步,以及速度)
1.HashMap几乎等价于HashTable,HashMap是非线程安全的,并且介意为null值,
HashMap可以接受为null的key value 而HashTable不行。
2.HashTable是线程安全的多个线程可以共用一个HashTable,如果没有正确的同步,
多线程是不能共享HashMapJava5提供了CurrentHashMap去替代HashTable,比HashTable
的扩展性更好。
3.HashMap的迭代器是fail_fast的,而HashTable的enumerator迭代器不是fail_fast
4.HashTa环境下ble是线程安全的,所以在单线程环境下HashTable的速度
比单线程下的HashMap要慢。
5.HashMap不能保证随着时间的推移,Map中的元素次序是不变的。
3.我们能否让HashMap同步?
Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的
线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用
ConcurrentHashMap吧。
4.Hashmap默认大小是多少?什么时候会resize?
什么是resize:
重新计算容量。
容量默认为16,负载因子(loadFactor)默认是0.75;
阈值 = 容量 X 负载因子;
threshold = (int)(capacity * loadFactor);
什么时候会resize:
当Map里面的元素个数size大于一个阈值(threshold)的时候map将自动扩容。
5.你知道哪些设计模式,有哪些是在工作中用到的?如何实现一个简单的单例、Spring多例怎么实现(@Scope注解)
设计模式有:单例模式,工厂模式,代理模式,命令模式,策略模式,门面模式,桥接模式等23种常用的设计模式:单例模式,工厂模式,代理模式。
单例:确保某一个类只有一个实例,自行实例化并且向整个系统提供这个实例。
单例:饿汉模式
private static ImageLoader instance = new ImageLoader();
private ImageLoader(){}
public static ImageLoader getInstance(){
return instance;
}
}
单例:懒汉式
public class ImageLoader{
private static ImageLoader instance;
private ImageLoader(){}
public static synchronized ImageLoader getInstance(){
if(instance == null){
instance = new ImageLoader();
}
return instance;
}
}
Spring多例怎么实现(@Scope注解)
@Scope 拥有多个属性,默认为singleton(单例模式)其中:@Scope("prototype")表示的是多例模式