Java 基础部分
object对象中默认的方法
~ | 名称 | 功能 |
---|---|---|
1 | wait | 线程通信,阻塞线程,默认释放锁,sleep不释放 |
2 | notify | 唤醒线程 |
3 | notifyAll | 唤醒所有线程 |
4 | hashCode | 返回对象哈希码,一般要重写,相同对象的hashcode一定相同,hashcode相同的对象不一定相同 |
5 | equals | 一般用来比较两个对象是否相等,如在map、set中要重写eqauls,重写之后判断对象是否相等 |
6 | clone | 浅拷贝,拷贝的是一个引用,深拷贝,重新开辟内存地址,一般实现cloneable接口重写clone函数 |
7 | finalize | 垃圾回收时会执行一次,会被加入一个FQueue,但不保证一定会执行,执行完毕后被回收,可能在此方法中重新获得引用产生逃逸 |
8 | getClass | 获得calss对象 |
9 | toString | 生成String对象,主要用作日志等信息的打印展示等 |
Arrays.sort( );
* Arrays.sort 对基本类型是三向切分排序,引用类型是并归排序
* 也可传入自己的比较器
String相关
/ * 后两个继承AbstractStringBuilder
* string是final char value[],不可变!!!,可以用来存哈希值*/
new StringBuffer();//synchronized 修饰方法
new StringBuilder();//线程不安全
new StringBuffer();//synchronized 修饰方法
new StringBuilder();//线程不安全
String str = "offer";//自动放入字符串常量池
String str1 = new String("offer");//两个对象,字符串常量池中一个,对象一个
String intern = str1.intern();//入池,返回的是常量池中对象引用
System.out.println(str == intern);//true
基本类型
* 基本类型
* byte 8
* char 16
* short 16
* int 32
* float 32
* double 64
* long 64
* boolean 不确定,编译后会变成int ture=1,false=0
自动装箱与拆箱
* 自动装箱与拆箱
* integer缓存池大小是-128-127,但是它特殊在上届可调-XX:AutoBoxCacheMax=<size>
* Integer a=1;内部会调用valueOf方法从缓存池返回值同一个对象引用,没有就new Integer()
* Integer b = new Integer():创建两个对象缓存池中一个字面量、堆上一个对象、引用
* int c=1,引用缓存池
抽象类与接口:
* 抽象类和抽象方法用Abstract,抽象类可以没有抽象方法,抽象方法必须在抽象类中,可以有自己的私有方法,不能直接实例化,只能被子类继承在实例化
* 接口可以看成完全的抽象类,java8以后也可以有默认的实现,方法都是public,字段默认static final;
*
* 子类必须必须能替换掉所有父抽象类,接口只是提供约定
* 接口可以多继承,抽象类只能单继承
* 接口可以让不相关的类实现同一种方法
* 抽象类适合几个相关类之间共享代码,继承非静态和常量字段,权限非public
重写与重载:
* 重写出现在继承中,跟原方法一致 动态分派,关注实例类型,主要区分的是调用者,访问权限宽于父类,返回值类型等于父类或小于,异常范围大于调用父类的构造方法super,和普通方法super.XXX()
* 重载是在本类中,方 法名称相同但是参数类型个数顺序至少有一个不同,返回值不同不算,静态分派,关注的是静态类型,主要区分参数的类型问题
参数传递问题:
基本类型和引用类型都是值传递,传的是对象的地址,基本类型传的是值的拷贝,传完后不相关,引用传递传的是引用的地址值
反射:
* 反射:class对象与java.lang.reflect
* 三种方式获取class对象:XXX.class、Class.forname(XXX.XXX。XXX)、getclass()
*
* field:get\set参数相关
* method:与invoke方法连用,实现方法调用
* constuctor:利用constructor穿件新对象
*
* 扩展性高,性能开销大
*
* Spring中利用反射
distributed dis = new distributed();
Class<? extends distributed> aClass = dis.getClass();
Class<distributed> distributedClass = distributed.class;
// Class<?> forName = Class.forName(com.cht.originalCode.design_partterns);
// for (Field field : forName.getDeclaredFields()) {
// System.out.println(field);
// }
for (Constructor<?> constructor : distributedClass.getConstructors()) {
System.out.println(constructor);
}
Method[] methods = aClass.getDeclaredMethods();
异常处理
* throwable:
* error:错误,jvm无法处理 stackoverflowError、outofmemeroyError
* Exception:异常
* runtimeException:运行时异常-->算数运算、数据下标越界,非法参数、空指针异常、字符串转数字异常
* IOException:io异常
*
* 异常处理方式
* throws 方法声明,方法不处理交由调用处理
* throw 直接跑出异常的实例 throw new IOException;
* try catch 捕获并处理
* try{
* return;
* }catch(){
*
* }finally{
*
* }
* return;
*
* 先执行try中有异常就catch,没异常就return,然后是finally,
* 此时return值为返回保存在内存中,finally执行完之后在执行tyr中return
* 最后的return 不执行
*
* return1-finallu-return1;
* 如果return在finally中 return1-finally-return2
*
* 任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
* 如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
* 编译器把finally中的return实现为一个warning。
泛型
* 泛型
* 例如集合类中约束使用同一类型,编译时期擦出,避免ClassCastException
*
* 通配符:
* 非限定:<?>代表任意类型
* 限定:<? extends T>类型必须是t的子类、<? super T>类型必须是t的父类
*
//泛型方法:未在类上声明泛型
public<K,V> V put(K key,V value){
return put(key,value);
}
//泛型类
class obj<T> {
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
Java8 新特性
* java8新特性:
* lambda (XXXX,XXXXX)-> sout("XXXXX")
*
* 接口写默认方法实现
*
* Stream
* filter:过滤流
* map:流一一映射
* limit:指定数量流
* sorted:A排序流
* collect:流归约(collectors.XXX())
* summaryStatistics:统计返回值.getMax/getMin/getAverage......
* parallelStream 并行流处理