一、功能类的基本源码
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的唯一性要求;