map、string、array、list等工具类、Java源码

一、功能类的基本源码

1、MapUtils

获取Map中指定key的value

使用getString(final Map map, final Object key)方法,当然,也可使用getString( Map map, Object key, String defaultValue )方法,当我们get属性值时候发生了转换异常的就会报错,为了避免这种报错,可以使用默认值的方法解决。

当我们获取Integer类型的时候,当类型不能转换时候报java.lang.NullPointerException如下:

int money = MapUtils.getInteger(map,"money");

就可以使用getInteger( Map map, Object key, Integer defaultValue )方法解决。

int money = MapUtils.getInteger(map,"money",23);

具体代码如下:

/**
 * Gets a Integer from a Map in a null-safe manner.
 * <p>
 * The Integer is obtained from the results of {@link #getNumber(Map,Object)}.
 *
 * @param map  the map to use
 * @param key  the key to look up
 * @return the value in the Map as a Integer, <code>null</code> if null map input
 */
public static Integer getInteger(final Map map, final Object key) {
    Number answer = getNumber(map, key);
    if (answer == null) {
        return null;
    } else if (answer instanceof Integer) {
        return (Integer) answer;
    }
    return new Integer(answer.intValue());
}

MapUtils中其他的get属性值的方法还有如下这些,使用方法和MapUtils.getString一样,这里就不再一一举例说明,

  • Object getObject(final Map map, final Object key):获取Object类型的值。
  • String getString(final Map map, final Object key):获取String类型的值。
  • Boolean getBoolean(final Map map, final Object key):获取Boolean类型的值。
  • Number getNumber(final Map map, final Object key):获取Number类型的值。
  • Byte getByte(final Map map, final Object key):获取Byte类型的值。
  • Short getShort(final Map map, final Object key):获取Short类型的值。
  • Integer getInteger(final Map map, final Object key):获取Integer类型的值。
  • Long getLong(final Map map, final Object key):获取Long类型的值。
  • Float getFloat(final Map map, final Object key):获取Float类型的值。
  • Double getDouble(final Map map, final Object key):获取Double类型的值。
  • Map getMap(final Map map, final Object key):获取Map类型的值。

2、StringUtils

/**
     * <p>Checks if a String is whitespace, empty ("") or null.</p>
     *
     * <pre>
     * StringUtils.isBlank(null)      = true
     * StringUtils.isBlank("")        = true
     * StringUtils.isBlank(" ")       = true
     * StringUtils.isBlank("bob")     = false
     * StringUtils.isBlank("  bob  ") = false
     * </pre>
     *
     * @param str  the String to check, may be null
     * @return <code>true</code> if the String is null, empty or whitespace
     * @since 2.0
     */
    public static boolean isBlank(String str) {
        int strLen;
        if (str == null || (strLen = str.length()) == 0) {
            return true;
        }
        for (int i = 0; i < strLen; i++) {
            if ((Character.isWhitespace(str.charAt(i)) == false)) {
                return false;
            }
        }
        return true;
    }

3、ArrayUtil

/**
     * 连接字符串 如: join([1,2,3,4],"x"]) 将会返回"1x2x3x4"
     *
     * @param arr
     *            an array of {@link java.lang.Object} objects.
     * @param joinStr
     *            a {@link java.lang.String} object.
     * @return a {@link java.lang.String} object.
     */
    public static final String join(final Object[] arr, final String joinStr) {
        if (arr == null || arr.length < 1) {
            return StringUtils.EMPTY;
        }
        final StringBuffer sb = new StringBuffer(String.valueOf(arr[0]));
        for (int i = 1, len = arr.length; i < len; i++) {
            sb.append(StringUtils.isNotEmpty(joinStr) ? joinStr : StringUtils.EMPTY).append(String.valueOf(arr[i]));
        }
        return sb.toString();
    }

4、ListUtils

/** 
     * Returns a new list containing all elements that are contained in 
     * both given lists. 
     * 
     * @param list1  the first list 
     * @param list2  the second list 
     * @return  the intersection of those two lists 
     * @throws NullPointerException if either list is null 
     */  
    public static List intersection(final List list1, final List list2) {  
        final ArrayList result = new ArrayList();  
        final Iterator iterator = list2.iterator();  
  
        while (iterator.hasNext()) {  
            final Object o = iterator.next();  
  
            if (list1.contains(o)) {  
                result.add(o);  
            }  
        }  
  
        return result;  
    }  

二、java:源码解读

1、String类的不可变特性

String类不可变的含义:String对象创建之后便不会再改变,任何看起来的变化都是通过创建新的String对象来完成的。

举例:

String a = new String("abc");a = a + "d";

第一个语句创建了一个String 对象abc,a是指向这个对象的引用

第二个语句右边创建了另外一个String对象abcd;

执行第二个语句时,并不会修改原先的对象abc;

 

不可变是如何实现的

这里有三个关键点:

1、String类被final修饰,不可被继承;因为一旦允许继承的化,那么方法就有可能被重写,也就有可能会破坏不可变性,这就是为什么用final修饰的原因;

2、private final修饰char[] 数组;字符串底层使用字符数组来存储,这个字符数组通过private final修饰,防止外部对字符串做出改变;

3、String类种的任何方法都不会对字符串进行改动;

为什么设计为不可变的:

主要还是为了性能方面的考虑,因为在java语言设计之初,就认为String将会被频繁的使用,所以设定了常量池,目的是为了尽可能的复用已有对象,这就要求已有对象是不可变的;

当然设计成不可变对象,一定程度上也可以增加代码的安全性,比如可变对象作为hashMap的key时,如果先放入map之后,再改变对象,那么可能就会破坏Map对key的唯一性要求;

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值