Java 中的 HashMap 和 Hashtable 有什么区别?
Hashtable是同步的,反之则HashMap不是。这HashMap对于非线程应用程序来说更好,因为非同步对象通常比同步对象执行得更好。
Hashtable不允许null键或值。 HashMap允许一个null键和任意数量的null值。
HashMap 的子类之一是LinkedHashMap,因此如果您想要可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地将HashMap换成LinkedHashMap。如果您使用Hashtable.
由于同步对您来说不是问题,因此我建议HashMap. 如果同步成为问题,您还可以查看ConcurrentHashMap.
public class SOP { public static void print(String s) { System.out.println(s+"\n"); }}public class TestThread extends Thread { String name; TheDemo theDemo; public TestThread(String name,TheDemo theDemo) { this.theDemo = theDemo; this.name = name; start(); } @Override public void run() { theDemo.test(name); }}public class TheDemo { public synchronized void test(String name) { for(int i=0;i<10;i++) { SOP.print(name + " :: "+i); try{ Thread.sleep(500); } catch (Exception e) { SOP.print(e.getMessage()); } } } public static void main(String[] args) { TheDemo theDemo = new TheDemo(); new TestThread("THREAD 1",theDemo); new TestThread("THREAD 2",theDemo); new TestThread("THREAD 3",theDemo); }}
注意:synchronized只要前一个线程的执行未完成,就会阻止下一个线程对 test() 方法的调用。线程一次只能访问此方法。无需synchronized所有线程都可以同时访问此方法。
当线程调用对象的同步方法“test”时(这里对象是“TheDemo”类的实例),它会获取该对象的锁,任何新线程都不能调用同一对象的任何同步方法,只要前一个线程获得锁的对象不会释放锁。
当调用类的任何静态同步方法时,都会发生类似的情况。线程获取与该类关联的锁(在这种情况下,该类实例的任何非静态同步方法都可以由任何线程调用,因为该对象级锁仍然可用)。只要当前持有锁的线程未释放类级别锁,任何其他线程都将无法调用该类的任何静态同步方法。
同步输出
THREAD 1 :: 0 THREAD 1 :: 1 THREAD 1 :: 2 THREAD 1 :: 3 THREAD 1 :: 4 THREAD 1 :: 5 THREAD 1 :: 6 THREAD 1 :: 7 THREAD 1 :: 8 THREAD 1 :: 9 THREAD 3 :: 0 THREAD 3 :: 1 THREAD 3 :: 2 THREAD 3 :: 3 THREAD 3 :: 4 THREAD 3 :: 5 THREAD 3 :: 6 THREAD 3 :: 7 THREAD 3 :: 8 THREAD 3 :: 9 THREAD 2 :: 0 THREAD 2 :: 1 THREAD 2 :: 2 THREAD 2 :: 3 THREAD 2 :: 4 THREAD 2 :: 5 THREAD 2 :: 6 THREAD 2 :: 7 THREAD 2 :: 8 THREAD 2 :: 9
无同步输出文章来源:https://www.toymoban.com/diary/share/277.html
THREAD 1 :: 0 THREAD 2 :: 0 THREAD 3 :: 0 THREAD 1 :: 1 THREAD 2 :: 1 THREAD 3 :: 1 THREAD 1 :: 2 THREAD 2 :: 2 THREAD 3 :: 2 THREAD 1 :: 3 THREAD 2 :: 3 THREAD 3 :: 3 THREAD 1 :: 4 THREAD 2 :: 4 THREAD 3 :: 4 THREAD 1 :: 5 THREAD 2 :: 5 THREAD 3 :: 5 THREAD 1 :: 6 THREAD 2 :: 6 THREAD 3 :: 6 THREAD 1 :: 7 THREAD 2 :: 7 THREAD 3 :: 7 THREAD 1 :: 8 THREAD 2 :: 8 THREAD 3 :: 8 THREAD 1 :: 9 THREAD 2 :: 9 THREAD 3 :: 9
文章来源地址https://www.toymoban.com/diary/share/277.html
到此这篇关于Java 中的 HashMap 和 Hashtable 有什么区别?的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!