1.linkedList和ArrayList区别
ArrayList实际上是动态数组 LinkedList是个链表结构
插人删除操作不频繁,get()等查询多的的用ArrayList就行 LinkedList的优势是插入删除效率比较高.
2.ConcurrentHashMap
是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。
ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。
有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁,在ConcurrentHashMap内部,段数组是final的,并且其成员变量实际上也是final的,但是,仅仅是将数组声明为final的并不保证数组成员也是final的,这需要实现上的保证。这可以确保不会出现死锁,因为获得锁的顺序是固定的。
为了加快定位段以及段中hash槽的速度,每个段hash槽的的个数都是2^n,这使得通过位运算就可以定位段和段中hash槽的位置。当并发级别为默认值16时,也就是段的个数,hash值的高4位决定分配在哪个段中。但是我们也不要忘记《算法导论》给我们的教训:hash槽的的个数不应该是2^n,这可能导致hash槽分配不均,这需要对hash值重新再hash一次。(这段似乎有点多余了
)
3.Singleton
//饿汉式单例类.在类初始化时,已经自行实例化2 public class Singleton1 {
3 //私有的默认构造子4 private Singleton1() {}
5 //已经自行实例化6 private static final Singleton1 single = new Singleton1();
7 //静态工厂方法8 public static Singleton1 getInstance() {
9 return single;
10 }
11 }
//懒汉式单例类.在第一次调用的时候实例化2 public class Singleton2 {
3 //私有的默认构造子4 private Singleton2() {}
5 //注意,这里没有final6 private static Singleton2 single=null;
7 //静态工厂方法8 public synchronized static Singleton2 getInstance() {
9 if (single == null) {
10 single = new Singleton2();
11 }
12 return single;
13 }
14 }
1 import java.util.HashMap;
2 import java.util.Map;
3 //登记式单例类.4 //类似Spring里面的方法,将类名注册,下次从里面直接获取。5 public class Singleton3 {
6 private static Map map = new HashMap();
7 static{
8 Singleton3 single = new Singleton3();
9 map.put(single.getClass().getName(), single);
10 }
11 //保护的默认构造子12 protected Singleton3(){}
13 //静态工厂方法,返还此类惟一的实例14 public static Singleton3 getInstance(String name) {
15 if(name == null) {
16 name = Singleton3.class.getName();
17 System.out.println("name == null"+"--->name="+name);
18 }
19 if(map.get(name) == null) {
20 try {
21 map.put(name, (Singleton3) Class.forName(name).newInstance());
22 } catch (InstantiationException e) {
23 e.printStackTrace();
24 } catch (IllegalAccessException e) {
25 e.printStackTrace();
26 } catch (ClassNotFoundException e) {
27 e.printStackTrace();
28 }
29 }
30 return map.get(name);
31 }
32 //一个示意性的商业方法33 public String about() {
34 return "Hello, I am RegSingleton.";
35 }
36 public static void main(String[] args) {
37 Singleton3 single3 = Singleton3.getInstance(null);
38 System.out.println(single3.about());
39 }
40 }
-----------------------------------
首先查看官方API那个的解释:
———————————————————————————————————————
intern
public String intern()
返回字符串对象的规范化表示形式。
一个初始时为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都是内部的。
返回:
一个字符串,内容与此字符串相同,但它保证来自字符串池中。