java基础知识总结

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
全友好 包+子类  包

 

 

你可能感兴趣的:(java,jvm,AOP,多线程,算法)