java 编程方法_java中的高效编程方法

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一次。(这段似乎有点多余了

0818b9ca8b590ca3270a3433284dd417.png )

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。

所有字面值字符串和字符串赋值常量表达式都是内部的。

返回:

一个字符串,内容与此字符串相同,但它保证来自字符串池中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值