apache common book 笔记

第一章基本

对象操作

1.4自动生成 toString

ReflectionToStringBuilder.toString(this) 自动输出各属性的value

ToStringStyle:指定toStrig的格式

1.6构建hashCode

HashcodeBuilder:使用两素数作为起始,使用append增加hash的属性,如果属性值相同,则hash值相同

1.7 实现compareTo

RelectionCompareTo: 比较bean中属性的not-traisientnot-static属性,使用appendtoComparison()按指定order和值比较,orderappend的顺序相反

Array操作

1打印Array(primitive object)

ArrayUtils.toString

collection 直接用println输出即可

复制array

ArrayUtils.clone(arr):arr不变(safe-way处理null

3. 翻转array

ArrayUtils.reverse(arr):直接修改arr; Collections.reverse

查找对象

ArrayUtils.containindexOf lastIndexOf 查找使用equals进行比较

5. 多维数组中创建map

ArrayUtils.toMap(Objectobj): 将二维数组转换为map

日期处理

1.格式化Date

DateUtils.FastDateFormat 是线程安全的,在多线程中使用。sun的所有format都是非线程安全的

2.round the date

DateUtils.rount() 在秒、分、日、月级别round时钟

3.truncate date object

将不重要的字段清零,如 DateUtils.truncate(now,Calendar.HOUR)

4.使用stopwatch测量时间

函数参数

使用validate验证函数参数,可验证(empty null 集合 无null  isTrue):对(逻辑表达式、集合和对象、MapString

当验证失败时,跑出IllegalArgumentException异常,但异常不需要强制捕捉,如果不捕捉,不会有任何显示

当与各种Range,如IntRange,判断某值是否在序列中,使用isTrue

在函数内进行参数校验,而不是让调用者处理

第二章操作text

字符串

1.测试空字符串:

isBlank,在程序中避免使用null,使用“”替代

2.简写String

abbreviate() 字符串简写到20字节

当进行查找时,如indexOf() 可使用abbreviate(message,offset,width)显示查找字符串附近的上下文

3.split a String

jdk中的split是使用正则表达式,如果不想用正则,在StringUtils.split(str,“ .”) 使用空格和.分割字符串

4.查找String

containXXX(),具体有anynone only whitespace

substringBetween() 可用来从html标签中解析出content,还可解析被相同字符串分割的text

5.striptrimString

trim:从String两端去除空格和tab,还有trimToEmptytrimToNull

strip:去除指定字符,如–SHA--,去除--

6.chomping a String

String中去除\n\r 字符、自定义字符(最后一个)和最后几个字符

7,增加强调的头

StringUtils.repeat()center(在字符串首位增加内容)join的综合使用

8.按单词反转String

reverseDelimited(): String先分割为word,再对word间逆序并组合输出

9.wrap word

String自动换行为指定的宽度 WordUtils.wrap

当对web上的textwrap时,指定lineseparators是 <br/>

可实现网页上的防拷贝功能,即插入无用字符

10.String内容判断

isNumericisAlpha isAlphaNumericisAlphaSpace formname验证中,先用StringUtils.replacechars(使用字符集查找替换)替换不合适的字符,再用isAlpha判断

11.字符出现的频率

countMatches

12.按行读取数据 LineNumberReader

13.extract字符串

substringbefore after between

14.比较两个字符串的区别

indexOfDifference 获得从开始出现不同的位置, difference输出第二个不同于第一个的部分, getLevenshteinDistance() 说明相似程度

第三章操作javabean

访问属性

使用getProperties 取得simpleindex map nest属性

使用getPropertyType 得到property的类型,PropertyDescriptor提供类型、writeread方法。

使用bean属性比较和排序

BeanComparator获得两个bean的同一属性,可以为mapindexed nested simple

clone bean

  BeanUtils.cloneBean() 对于object类型属性也可以复制

使用predicatebean进行验证

  可使用BeanPredicate对属性进行判断,可对多个beanPredicate进行逻辑运算

创建一个map,包括bean的所有属性

  PropertyUtils.describe() 创建一个map包括bean的所有可读的选项

将一个bean当做map使用

  使用BeanMapwrap bean,可以以map的方式修改和读取属性,和PropertyUtils比起来具有迭代功能;而describe产生的部分与bean是分离的,修改map不会改变bean的值

运行时创建bean

  当使用bean代表datamodel,可创建一系列的DynaClass, 1)创建DynaProperty; 2)创建DynaClass 3)创建DynaBean

使用String设置和获取property

  BeanUtilsPropertyUtils中有很多相似的函数,区别是BeanUtils可使用字符串getset属性

  主要用于对输入参数的解析,比如request中国参数对bean的自动赋值

第四章 Functors

1.常见的有: 

    Comparator   Iterator    Predicate   Transformer  Factory(创建对象) and   Closure

Comparator

2.comparator取非

    ReverseComparator来翻转Comparator的结果

3.chain Comparator

  场景:使用多于一个propertycollection排序

  ComparatorChain创建一个Comparator的序列,ComparatorChain使用每一个Comparator比较两个object,直到一个比较器结果不等

  当在组合排序中,使用ComparatorChain+ReverserComparator可实现强大的排序功能,如类似于sql的 orderby  name ASC, age DESC

  当对bean排序时,使用由BeanComparator构成的ComparatorChain进行排序

4.比较null

  场景:对包含Null的数组排序,将Null放在最前和最后端

  Comparator使用NullComparator封装,如果Comparator不能处理Null,则使用NullComparator避免抛出NullPointerException

5.FixOrder Comparator

  场景:如果需要按枚举的值进行排序,比如按金、银、铜对运动员排序

  构造String数组——》构造FixedOrderComparator——》构造BeanComparator——》进行bean的排序

Predicate

  可用来filter  select  validate集合的内容,例如Equal InstanceOf   Identity(使用==比较)  空   非空  True|False  Unique(object是第一次evaluated,则返回true)

1.自定义Predicate

  继承自接口Predicate,实现evaluate函数

2.创建复杂的predicate

  AndPredicate  OrPredicate   AllPredicate  OnePredicate(精确地,有且只有一个) Any  Non  Not

Transformer

  srcobject变换为targetobjectsrc不变

1.transformer组合成链

  使用ChainedTransformer

2.conditional transformer

  使用switchTransformer:根据predicate的结果进行transformer

  Transformer.switchTransformer对于不满足Predicated不转换会返回Null,该函数适合if() else,而不适合if,如果实现if,应该先使用CollectionUtils.selectcollect完成

3.不变

  NopTransformer不进行任何转换返回源对象

closure

  在对象上执行某项操作,有if(根据predicate执行不同的closure);while(满足predicate时,一直执行closure)for(执行指定次数的closure,switch(根据predicate执行closure

1.chaining closure

2.condition

3.loop

    whileclosure

第五章 collections

Iterator

1.使用loopiterator

  对集合进行重复迭代,如ListAB C,如果迭代5次,得到AB C A B。不能使用hasNext作为终止条件,可使用reset重置

  用于:列表要重复访问  命令序列要重复执行   队列或buffer需要循环monitor

2.ArrayListIterator

  支持对ArrayList进行部分迭代,有用函数 nextIndex  next    set(设置当前元素的值)

  Iteratorit=new ArrayListIterator(list, 3,6);

  ArrayIteratorObjectArrayIterator在数组上进行迭代

3.使用predicate对集合进行过滤

  1)使用FilterIteratorpredicatetrue的元素迭代

  2)删除collection中不满足条件的元素 CollectionUtils.filter

  3)不修改原collection,返回过滤结果   CollectionUtils.select   CollectionUtils.selectRejected

4.只迭代不同的元素

  UniqueFilterIterator装饰Iterator,然后调用uniquenext()实现只有未出现的对象会访问,相当于使用UniquePredicateFilterIterator

Bag

  可存放同一对象多次,并跟踪有多少个相同对象,可用函数有:

  add(一次增加多个相同对象)

  remove(删除指定数目的特定对象)

 getCount(特定对象的个数)

 取得uniqueset,并在其上迭代

 containAll(足够数量的该对象)

 removeAll(指定数量的该对象)

 以上一些函数和Collection中的同名函数不同,在使用这些函数时,不要将Bag转换为Collection

Map

1.一个key多个valuemap 

  MultiMap

2.valuekey keyvalue的双向映射

  BidiMapvaluekey都是唯一的)BidiMap.inverseBidiMap()

  BidiMap有三个实现,DualHashBidiMap比较简单,使用两个HashMap存放keyvalueDualHashMap适用于不保存插入顺序;DualTreeBidiMap使用TreeMap保存顺序;TreeBidiMap保存节点时使用红-黑树,每个节点使用key-value标识,和DualTreeBIdiMap相比,当调用put花费两倍时间,1/2的内存,表格如下:

DualHashBidiMap

hashMap底层

时间少,空间多

DualHashMap

hashMap底层

时间多,空间少

DualTreeBidiMap

TreeMap底层

时间少,空间多

DualTreeMap

TreeMap底层

时间多,空间少

3.大小写不区分

  CaseInsensitiveMap 使用Stringkey

  适用于:用户输入的提示,或无视大小写返回结果

4.确保map中所有value满足条件

  使用PredicateMap验证keyvalue,当一个entry输入时,不满足条件,会抛出IllegalArgumentException

  PredicateMap.decorate(newHashMap(), oneP,twoP)

5.实现LRUcache

  LRUMap:保存固定容量的entry,当插入新的entry时覆盖原来的,

  用于:向用户显示数据,如排行榜的实现

  如果使用很多cache,可考虑专门的缓存实现

6.lazyMap

  实现懒加载,如操作数据库,通过primarykey获取对象时,在内部通过tranformer获取真正的records

7.MapUtils

  mapDouble——double  Integer——int

List

1. 使用PredicateList

  效果同PredicateMap

2.转换

  CollectionUtils.transform()

3.统计

  CollectionUtils.countMatch :统计Colection中满足某一条件对象的个数

  CollectionUtils.getCardiralityMap 返回collection中对象频率的map

4.集合操作

  CollectionUtils.union  intersection  disjunction( aUb-a^b)   subtract

第八章 Math

1.使用分数 Traction

2.Array的最大最小值

3.Number Range的使用

  使用Range接口,及其实现NumberRange  DoubleRange   FLoatRange  IntRange 。有用函数是contain  getMin  getMax

4.产生水机变量

6.进行样本统计

7.进行线性代数运算

8.复数的数学运算

9.建立线性函数

10.估计程序运行时间

  原理:使用SimpleRegression,添加数据点后,SimpleRegression会根据数据点的值,求出y=a*x+b的线性函数,当进行数据库访问时,假设每个记录的处理时间大致相等,可使用SimpleRegression进行估算,并使用StopWatch提供SimpleRegression需要的数据点。

第十章I/O和网络

IO相关

1.Stream  bytes[]   ReaderWriter的复制

  使用CopyUtils实现各种源到目的的复制,使用4KB缓存,注意源和目的的flushclose

  使用IOUtils.toString() 复制从ReaderInputStream)——》String

2.关闭Stream Writer Reader

  使用IOUtils.closeQuietly避免捕获异常

3.测量stream的字节数

  使用CountingInputStreamCountingOutputStreamstream进行decorate,调用CountingXXXStreamwrite/read后,调用getCount可获得字节数

4.splite  outputStream

  output发送到两个OutputStream

  注意使用flush输出,并使用closeQuietly悄悄关闭

文件

1.可读方式显示文件大小

  FileUtils.byteCountToDisplaySize()

2.复制文件StringURLs

  FileUtils.copyFIle() 复制文件到另一个文件

  FileUtils.copyFileToDirectory 复制文件到目录

  FileUtils.writeStringToFile: 将String写入到文件中

  FileUtils.copyURLToFile:将URL的内容复制到文件,可用来实现保存网址内容

3.递归删除目录

  FileUtils.deleteDirectory   cleanDirectory

4.获得文件夹大小

  FileUtils.sizeOfDirectory

5.过滤Directory下的文件

  定义在commons.io.filefilter包中的filter都实现了IOFilter接口,可对filefileName进行过滤,具体有PrefixFileFilter  SuffixFileFilter   NameFileFiliter   DirectoryFilter(只接收directory参数) AndFileFilter   FileFilter    NotFileFilter



第十一章HttpWebDev

HttpClient是一个Http协议的客户端,支持getpost  put  options  headdelete。支持多种认证机制basic digestNTLM.支持httpshttp,管理session状态、cookie信息

public class MyMap<K,V> {
	
	private Map<K,V> kMap = new HashMap<K,V>();
	private Map<V,ConcurrentHashMap<K,String>> vMap = new HashMap<V,ConcurrentHashMap<K,String>>();
	private final static String VV = "1";
	
	public boolean put(K k,V v) {
		boolean result = false;
		if(null == k || null == v) return result;
		if(kMap.containsKey(k)) {
			vMap.get(kMap.get(k)).remove(k);
			//vMap.remove(kMap.get(k));
		}
		kMap.put(k, v);
		if(vMap.containsKey(v)) {
			vMap.get(v).put(k,VV);
		} else {
			ConcurrentHashMap<K,String> set = new ConcurrentHashMap<K,String>();
			set.put(k,VV);
			vMap.put(v, set);
		}
		return true;
	}
	
	public boolean containsKey(K k) {
		return kMap.containsKey(k);
	}
	public boolean containsValue(V v) {
		return vMap.containsKey(v);
	}
	
	public Set<K> keySet(){
		return kMap.keySet();
	}
	
	public Set<V> valueSet() {
		return vMap.keySet();
	}
	
	public V getByKey(K k) {
		return kMap.get(k);
	}
	
	public ConcurrentHashMap<K,String> getByValue(V v) {
		return vMap.get(v);
	}
	
	public String toString() {
		return kMap.toString();
	}
	
	public static void main(String[] args) {
		MyMap<String,String> map = new MyMap<String,String>();
		map.put("k1", "v1");
		map.put("k2", "v2");
		map.put("k3", "v1");
		map.put("k4", "v2");
		System.out.println("k1 -> " + map.getByKey("k1"));
		System.out.println("v1 -> " + map.getByValue("v1").keySet());
		System.out.println("v2 -> " + map.getByValue("v2").keySet());
		map.put("k5", "v2");
		System.out.println("v2 -> " + map.getByValue("v2").keySet());
		map.put("k5", "v1");
		System.out.println("v1 -> " + map.getByValue("v1").keySet());
		System.out.println("v2 -> " + map.getByValue("v2").keySet());
		
		//替换所有的v1为v111
		System.out.println("before update : " + map);
		for(String k : map.getByValue("v1").keySet()) {
			map.put(k, "v111");
		}
		System.out.println("after update : " + map);
		
	}
}

http://blog.csdn.net/dananhai381/article/details/38866667

猜你喜欢

转载自m635674608.iteye.com/blog/2227300