http://wiki.caucho.com/Hessian_Java_API_Overview hession wiki
IO
InputStream,OutputStream和Read,Write区别:前者读写都是以字节为单位,后者是以Unicode为单位。
java.util.concurrent-------------begin
对象在并发情况下自加计数,可以利用java.util.concurrent.atomic 包下的内容
ReentrantLock
--lock
--tryLock()(time,timeType)
--Condition
--await()(time,timeType)
ReentrantReadWriteLock 读的时候锁是共享的(多线程同时读),写的时候锁是共享的(多线程的同时写),但写的时候不能读,读的时候不能写,适用于大量读少量写要加锁的情况,例如缓存的更新。
队列不能返回空
BlockingQueue阻塞队列concurrent包中的,用来实现 生产者-消费者 模式。
BlockingQueue的特点,如果队列为空的时候取对象会一直等待直到取到对象为止,如果队列满了,往里面放对象,会一直等到放入位置.这样才体现阻塞二字.
ArrayBlockingQueue 有界,要制定容量 最快
LinkedListBlockingQueue 无界 次快
PriorityBlockingQueue 无界 最慢 不是先进先出队列,类似于PriorityQueue
1、ArrayBlockingQueue性能优于LinkedBlockingQueue,但是LinkedBlockingQueue是无界的。
2、ArrayBlockingQueue和LinkedBlockingQueue的poll方法总是比offer方法快,并发越高,差距越大
3、ArrayBlockingQueue和LinkedBlockingQueue的性能远高于PriorityBlockingQueue,显然优先队列在比较优先级上的操作上耗费太多
4、PriorityBlockingQueue的offer方法与poll方法的性能差距很小,基本维持在近似1:1
java.util.concurrent-------------end
Iterator
调用remove前必调用next
集合
所有一下非Map结尾的类都实现了Collection接口
ArrayList
自增缩类似数组的序列,删除时效率低,因为后面的元素都要往前挪位。每次插入都是到末尾。
LinkedList
类似双链表,可以在任一位置插入,且效率高。
但是一般来说插入都是到末尾,所以用ArrayList就ok了
HashSet
没用重复的无序集合,只有不在乎元素的顺序才用它
TreeSet
内部用红黑树实现,在插入数据的时候可以自动排序,迭代遍历输出有序的序列。如果需要排序的情况用他不错,排序时利用需排序元素本身的Comparable接口实现或者传入一个实现了Comparetor接口的排序策略类。
EnumSet
枚举类型元素集合
LinkedHashSet
类似于LinkedHashSet
PriorityQueue
可以高效的移除最小元素的集合,如果迭代遍历输出是无序的,它只保证add,remove时最小元素移动到根,这样每次根元素都是最小的
Set 不包含重复元素的Collection
所有的Map类有三种遍历方法:
按键遍历 Set<K> ketSet();
按值遍历 Collection<K> values();
按键值对遍历 Set<Map.Entry<K,V>> entrySet();
HashMap
是散列映射表。基于散列(哈希)结构的键值对映射表。当键冲突过多时,会自动进行再散列,防止过多键冲突。
HashSet
是树状散列表,使用键的全局顺序进行排序。而HashMap是对键进行散列。
如果不需要按排列顺序来访问键的话,就用HashMap就OK了
EmumMap
枚举类型的Map
LinkedListMap
他是个HashMap,但里面的元素却又有类似LinkedList的内部联系,在每次调用get和put方法的时候,都会把被操作的那个元素位置一道链表的尾部。这样查找的时候他具有HashMap的效率,遍历的时候又利用了LinkedList的优势。在实现高速缓存的“最近最少使用”原则非常有用。
WeakHashMap
用弱应用存放对象,当对象没有被在其它地方被应用的时候,就会被JVM自动回收。
IdentityHashMap
这个类里的键值不是由key的hashCode()函数的来的,而是由System.identityHashCode(key对象)得来的。的。
Collections排序列表,Arrays排序数组
Collections的binarySearch()必须保证传入的集合是有序的,否则会报错。
Base64 编码作用:把字符串转换成肉眼不可见的数据。如密码字段的传输。特点:加密算法简单
Base64 也會經常用作一個簡單的「加密」來保護某些數據,而真正的加密通常都比較繁瑣。
常用的对称加密算法有RC4,TEA,IDEA,AES,DES,Blowfish,Twofish等
int存放20亿,超过20亿用long
计算高精度的数BigInteger BigDecimal
数组或者先了Iterable接口的用for each遍历,优点不考虑边界。
数组copy,system.arraycopy
数组排序Arrays.sort
当类中有至少一个非默认构造器(有参数),则调用默认构造器(没有参数)来构造对象会报错
方法参数都是值传递
super只是调用超类关键字,不是引用
hashCode返回的是对象的存储地址
枚举类型比较永远不要用equals,直接用==就好了
知道该怎么处理的异常就捕获,不知道改如何处理的异常就抛出。
持久性:磁盘上布局和内存一样.例子,一个对象的引用被多个对象共享,反序列化过程保证共享对象之被加载一次(保证持久性)
序列化:内存地址转化为序列号
log原理
StackTraceElement[] stack = (new Throwable()).getStackTrace(); for(StackTraceElement s:stack){ System.out.println(s); }
当程序挂起后,输入Ctrl+\,将会得到一个所有线程的列表。每个线程都有一个堆栈踪迹,他会告诉你当前哪里阻塞了。
Unicode:这是最统一的编码字符集,可以用来表示所有语言的字符,不兼容任何前面提到的编码字符集。Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”。注意:在JAVA语言中书写时应该使用转义符‘\u’表示,如 char charA = ‘\u0041’; 这种表示方法等与 char charA = ‘A’; 。
float累述之后有个一个后缀F(例如,3.14F)。没有后缀的浮点数值(如,3.14)默认为double类型。当然也可以在后面加D表示为double类型(如,3.14D)。
try-catch-finally-return关系:
执行顺序:try catch finally try中的return
注:如果finally中有return语句,则不会执行try中的return,也不会执行catch中的return语句;
>>带符号位右移(用符号位填充左侧的位),>>>不带符号位右移(用0填充左侧的位),<<左移(用0填充左边的位),没有<<<
位运算
&与 |或 ^异或 ~非
泛型静态函数写法
public static<T> T doit(T obj,ArrayList<T> list){ list.add(obj); return list.get(0); }
注意<T>的位置
StringBuffer同步性
String格式化输出
String的compareto 内部如何比较的
Scanner类
1.5后新加入的类,主要作用是用来遍历输出传入的数据,并输出。例如
Scanner s = new Scanner("1 2 3 4"); while(s.hasNext()){ Ssytem.out.println(s.next()); }
输出结果:
1 2 3 4
例如一个的路径为d:/1.txt内容为
liu 1.2 sd 12.1 asdf 123.1
File file = new File("d:/1.txt"); Scanner s = null; try { s = new Scanner(file); while (s.hasNext()) { String name = s.next(); double percent = s.nextDouble(); System.out.println("name=" + name + ";percent=" + percent); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (s != null) s.close(); }
输出结果
liu 1.2 sd 12.1 asdf 123.1
scanner的方法还有很多例如nextLine()方法。
写equal的注意事项
由于HashMap在判断某个元素是否存在是先判断他的hashCode()函数获得它的hashcode,然后再这个hashcode对应的散列项的,和散列项比较的时候是通过equals().如果equals()比较的值为true那么,你的hashCode()函数返回的值也一定要为true,如果不为true,更具刚才HashMap的判断原则就会出现两个equals()比较的值为true的元素被插入HashMap两次。
如何利用反射动态改变数组增长获得数组
见java core p192 使用反射编写通用数组代码 Array.newInstance(Class<?> componentType, int length)
代理类的使用
如果没有代理类Proxy,直接自己用反射机制实现面向AOP编程,每个类都要为他写一个代理对象。有了Proxy,我们就只需要传入三个参数,ClassLoad(类加载器,默认null就是JVM最原始的加载器),Class[] interfaces(被代理对象的所有接口),InvocationHandler(每个代理实例都具有一个关联的调用处理程序。代理类每次调用一个方法都会激活InvocationHandler的invoke方法)
invoke(Object proxy,Method method,Object[] args)throws Throwable
这个method传入的是被代理对象的方法
异常
异常的根为Throwable类,所有的异常必须为它的子类。
Throwable之下有两个分支Error和Exception,其中Error为java运行时系统内部错误和资源耗尽最经典的就是OutOfMemorryError,一般来说无需捕获;
然后就是Exception,他又分解为两个分支:
一个为RuntimeException,如果是这个异常的子类,那末一定是你代码写的有问题,常见的有NullPointerException,IndexOutOfBoundsException,错误类型转换,一般来说这些异常你必须自己有意识去捕获。
再就是能够自动运行(代码本身没问题,是用于外部环境导致有问题),由于某些情况导致异常的异常就不属于RuntimeException,例如试图在文件尾部读数据,可打开一个不存在的URL,打开一个不存在的文件,这些情况编码时,ide会自动提示你要加入try-catch模块;
算法:快速排序 红黑树
从高到低排列是public ,protected ,friendly, private
全友好 包+子类 包