本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!
在Java中,对象的封装非常常见,今天我们可以聊下容器和泛型的问题,对对象进行更深入一点的研究。
常见窗口有Set、Queue、Map,也称为集合类,属于Collection。ArrayList属于一个“可以自动扩充自身尺寸的数组“,LinkedList具有List接口中未包含的额外方法,而TreeMap与Map也同样。Arrays.asList方法可以将一个数组或逗号分隔的元素转换成一个List对象;Queue(FIFO)只允许一端入一端出;ArrayList和LinkedList也是根据插入顺序来保存数据的,不同之处在于某些操作的性能;Set类型中,如果TreeSet可以保存顺序,且升序,LinkedHashSet按存储顺序保存,都不允许保存重复数据。
前边博文我们已经说过,LinkedList的增、删、改比较快,但ArrayList的查找比较快速,所以多的还是用后者。容器中有个很好用的东西,叫迭代器,主要用来遍历对象。LinkedList添加了将其作为栈、队列、双端队列使用的方法。Stack,压入弹出在保存Activity的状态时会经常用到。PriorityQueue描述最典型的队列规则,默认排序,每次弹出最优先元素。
HashMap设计用来快速访问,而TreeMap保持”键“始终处于排序状态,LinkedHashMap保持元素插入的顺序,但也通过散列提供快速访问的能力。LinkedHashSet按插入顺序保存元素。
异常特色,重发throw e,可以抛给上一升环境中的异常处理程序。如果try...catch...finally...try中有return,finall中也有return ,那么会先执行finally再执行try后的return。
字符串,对一个字符串操作后就生成新的串,有新的引用和对象地址。StringBuilder与StringBuffer相比,前者从始至终都是一个对象,但后者每经一个循环便产生一个新的对象;后者实现同步,线程安全,当然开销也要大些。pritnf("Row 1: [%d %f]",1,2.0f) ,%d 代表一整数,%f表示一浮点数,当然也可以将printf换成System.out.format,说到这里要讲到URLEncoder和URLDecoder分别可以将汉字转成浏览器识别汉字,和将浏览器改变的汉字还原。正则常见:d,数字;w 字母 ^表示开始 $表示结束,dw大写表示非,?表示一个字符,+表示多个。
类型信息,Java通过RTTI(Runtimer type information)和反射来识别对象类型信息,识别包含三个步骤:1、加载,classloader加载类的class文件;2、链接,验证类中字节码,解析类引用;3、初始化,执行静态数据和构造器的初始化模块。
类.class.newInstance可以初始化一个对象,instanceof用来判断对象类型.Class与java.lang.reflect使用Field、Method、Constructor分别来表示字段、方法、构造器对象。
泛型是使用擦除实现的,List<String>和List<Integer>其实是同一个对象。超类通配符<? super MyClass> 或才<? super T>指定特定类的基类。
数组是一种效率最高的存储和随机访问对象引用序列的方式。概念:标识符指向保存对象的地址,是引用;length表示数组大小,并不是实际保存元素的个数;数值默认值为0,布尔默认值为false;对一组数据用Arrays操作,一般采用Arrsys.toString,但多维数组要采用Arrays.deepToString;比较操作一维用equals,多维用deepEquals。
程序设计基本目标:将保持不变的事物与会发生改变的事物相分离,这能通常采用策略模式,将会发生变化的功能写成一个接口,让不同适应类来实现。
数组排序采用compare方法,创建一个Comparator接口来做,也可以用个个reverseOrder方法来生成一个Comparator,binarySearch方法是在排序完成后才能用的。