Java基础-1
面向对象:封装、继承、多态
封装:接口、抽象类
接口与抽象类的区别?
- 接口类似于一种规范,你必须实现接口的方法,抽象类类似于代码复用,你可以不实现抽象类的方法而继承它
- 接口比抽象类更抽象,只有public abstract方法,没有构造方法,也就无法实例化;
- 抽象类用的是extends,接口是implements(有人会问?那抽象类跟普通类继承有什么不一样?区别就是抽象类的方法没有实现,而且抽象类天生就是为了继承,所以不能用private修饰符)
继承:
- 子类无法访问父类的private字段或者private方法,用protected修饰的字段可以被子类访问
- 用super可以表示父类,例super.fun();可以表示父类方法
- 继承用@Override重写,与重载不同,重写必须方法签名相同,并且返回值也要相同。重载的一个使用场景:构造器,参数不同
- 父子类初始化的执行步骤:父类先行,静态优先,变量其次,构造尾随
多态
对对象的多种形态进行描述。
-
向上转型:子类->父类 ,例Person p = new Student();向下转型:父类-》子类。
-
成员变量看左边:
Fu f=new Zi(); f.hair->取到
爸爸父类的hair; -
成员方法看右边:
Fu f1=new Zi();F1.f1.hair()->调用的是son的hair方法。
Java特点
没有C++中的指针、内存管理、对象的生命周期;并且跨平台(因为有jvm)。
jdk、jre(java运行环境)、jvm(java虚拟机)
-
jdk包含jre,jre包含jvm。jre的bin文件夹就是jvm虚拟机,lib是jvm的一些类库
-
jvm,运行java字节码(.class文件)的虚拟机。功能:加载CLass文件,解释字节码并执行,提供运行环境,运行期间进行内存分配并垃圾回收,提供与硬件交互的平台。关于jvm的具体内容还有很多,在这里就不展开叙述了,准备专门写一篇关于jvm的。
类与接口
-
StringBulider和StringBuffer:StringBulider能高效拼接字符串,因为其有缓冲区,解决了String不断造新对象占内存的问题。StringBuffer因有synchronized关键字实现线程安全。但是实际上并无卵用,所以在jdk9已经抛弃了。
-
StringJoiner:可以指定开头和结尾,分隔符。new StringJoiner(“分隔符”, “头”, “尾”);然后用add方法加进去。
-
List,Map,Set
List:
-
ArrayList(数组)与linkedList(双向链表),虽说大数据量链表更快,但是在随机插入时缺不一快,所以我们在使用的过程中应该测试决定用哪个。
-
Vector 可实现自动增长对象数组,随机访问效率高,增删效率低。
-
线程安全。很多方法经过synchronized修饰。
Set:
- HashSet 【线程不安全,存取速度快】底层HashMap实现
- TreeSet 【红黑树数据结构,默认对元素自然排序】底层TreeMap实现
Map:
-
HashMap【使用hash映射存储元素】老面试八股文了 : jdk7:数组+链表, jdk8: 数组+链表+红黑树,先计算key的hash值,二次hash然后对数组取模,对应到数组下标,若产生冲突则插入链表,链表到8,数组长度到64又会转化为红黑树,提高效率,实际上就是类似于xy一维平面存储的意思。为什么是8?时间和空间权衡的结果。Hashmap在多线程环境下会出现死循环问题,问题出在rehash过程中next指向形成了死循环。
-
LinkedHashMap:虽然LinkedHashMap增加了时间和空间上的开销,但是它通过维护一个额外的双向链表保证了迭代顺序。LinkHashMap 保存了记录插入的顺序,用Iteraor遍历时先得到的肯定是先插入的,遍历时比hashmap慢,有HashMap的全部特性
-
TreeMap 【基于红黑树的Map】:用于自然排序,定制排序。
-
HashTable: 方法用synchronized修饰,但是一般效率较低。可以忽略
-
ConcurrentHashMap: jdk1.8用synchronized+cas(乐观锁)+node数组+链表+红黑树,适用于多线程的环境下。
-
-
String类
常用方法:
-
泛型
泛型只是一种定义,有其局限性:
- 不能是基本类型,例如int,因为实际类型是Object,Object类型无法持有基本类型:
- 无法取得带泛型的Class,因为编译器默认T是Obejct,所以你反射取得的Class是相同的,无法取得的泛型
- 无法判断带泛型的类型:用带泛型的Class判断根本无法取得,所以没法判断
使用Pair<? extends Number>使得方法接收所有泛型类型为Number或Number子类的Pair类型 称之为上界通配符(Upper Bounds Wildcards),即把泛型类型T的上界限定在Number了。
反射
反射在Java中是个强大的功能,例能够使用o.class获得这个o类的信息,Jdk动态代理就用到了反射。
通过反射可以拿到class的信息,而且还可以取得成员变量,在某些情况下还可以设置成员变量的值。
public class Main {
public static void main(String[] args) throws Exception {
Object p = new Person("Xiao Ming");
Class c = p.getClass();
Field f = c.getDeclaredField("name");
f.setAccessible(true);
Object value = f.get(p);
System.out.println(value); // "Xiao Ming"
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
}
利用f.setAccessible(true);可以获取访问的权限,用在一些私有字段,不过它有可能会被SecurityManager拦截。
io
io流相关的类比较多,在Reader字符读、Writer字符写、InputStream字节读、OutputStream字节写下面又有什么File(针对文件)、Pipe(管道)、Buffered(缓冲),其目的是处理不同功能的流对象,字节比较适合传输图像视频这一类,字符流一般用于纯文本类型的文件。
nio(Non-blocking I/O)的特点,字面意思就是非阻塞,解放线程,直到通道准备好数据之前都可以去干别的事情。这样使得线程可以同时选择几个通道并且优先选择处理某个通道的数据,加快了io传输。
好啦,今天的复习就先到这,有不对的地方欢迎指出!
Non-blocking I/O)的特点,字面意思就是非阻塞,解放线程,直到通道准备好数据之前都可以去干别的事情。这样使得线程可以同时选择几个通道并且优先选择处理某个通道的数据,加快了io传输。
好啦,今天的复习就先到这,有不对的地方欢迎指出!