My Personal Time

Desire is the starting point of all achievement

0%

Java 基础知识

面向对象和面向过程

  1. 面向过程:是一种是事件为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这写步骤实现,并按顺序调用。

  2. 面向对象:是以“对象”为中心的编程思想。

  3. 面向对象三大特性:封装、继承、多态。因为一切皆对象,所以一切都需要“封装”成类。“继承”让我们设计相似的东西的时候更方便,而“多态”让我们使用类似的东西的时候可以不用去思考它们微弱的不同。我们关心的不是过程,而是接口,而接口来自对象,故名为面向对象。

    封装、继承、多态

  4. 封装:通过隐藏类的内部实现机制,对外界提供已经定义好的接口进行访问。对外界而言它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

  5. 继承:是从已有的类得到继承信息创建新的类的过程,继承可以表示为is-a关系,让我们设计相似的东西的时候更加的方便。

  6. 多态:可以分为方法重载和方法重写两种方式,方法重载是在编译时的多态性(也就是前绑定),方法可以根据不同参数类型进行不同的调用,方法名字一致;方法重写是运行时多态(也称为后绑定),实现方法重写:1.方法重写,子类继承父类并重写父类方法;2.用父类型引用来引用子类型对象,实现调用同样的方法会根据子类对象的不同表示出不一样的行为。

反射

  1. Java的反射机制允许我们动态的调用某个对象的方法、构造函数、获取某个对象的属性等;

  2. 无需在编码的时候确定调用的对象

  3. 实现方式:

    1. 先获取这个类的class实例,比如:Class<?> myClass =Class.forName(“myClassName”);

    2. 然后通过这个类实例获得一个类对象,比如:Object myClassObject = myClass.newInstance();

    3. 然后调用Class类的对象的getMethod获取method对象;

    4. 获取method对象后调用method.invoke方法获取这个类的field、method、construct等,在这一步中,JVM默认如果调用次数小于15次,会调用native方法实现反射,累积调用大于15次之后,会由java代码创建出字节码来实现反射。

集合

实现了Collection接口的集合类:
  1. Collection<–List<–Vector

  2. Collection<–List<–ArrayList

  3. Collection<–List<–LinkedList

  4. Collection<–Set<–HashSet

  5. Collection<–Set<–HashSet<–LinkedHashSet

  6. Collection<–Set<–SortedSet<–TreeSet

实现了Map接口,和Collection接口没关系,但都属于集合类的一部分:
  1. HashMap

  2. HashTable

  3. LinkedHashMap

  4. TreeMap

  5. SynchronizedMap

  6. ConcurrentHashMap

final和static

被final声明的对象即表示“我不想这个对象再被改变”,因此:
  1. 被final声明的方法:这个方法不可以被子类重写
  2. 被final声明的类:这个类不能被继承
  3. 被final声明的变量:引用不能改变,常和static关键字一起使用作为常量
    final关键字的好处:
  4. final关键字提高了性能。JVM和Java应用都会缓存final变量。
  5. final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
  6. 使用final关键字,JVM会对方法、变量及类进行优化。
static关键字
  1. static用来修饰成员变量和成员方法,也可以形成静态static代码块。
  2. static对象可以在它的任何对象创建之前访问,无需引用任何对象。
  3. 因此主要作用是构造全局变量和全局方法。

数据类型

  1. boolean byte char :都是一个字节

  2. short int long float double :int是4个字节,负2的31次方到正2的31次方减1

  3. String Enum Array

  4. Object

    ps:负数使用补码表示

    Primitive type: int,long,float…

    Object: Integer,Long,Float,String…

    Primitive type:

    1. 值类型
    2. 用a==b判断相等

    Object:

    1. 引用类型
    2. 用a==b判断是否为同一个Object
    3. 用a.equals(b),或者Obeject.equals(a,b)判断是否相等
    4. 两个Object如果不是同一个Object,即使值相等用==判断也是false

数组和链表

基于空间的考虑:
  1. 数组的存储空间是静态,连续分布的,初始化的过大造成空间浪费,过小又将使空间溢出机会增多。而链表的存储空间是动态分布的,只要内存空间尚有空闲,就不会产生溢出;链表中每个节点出了数据域外,还有链域(指向下一个节点),这样空间利用率就会变高。
  2. 数组从栈中分配空间,对于程序员方便快速,但是自由度小。链表从堆中分配空间,自由度大但是申请管理比较麻烦。
  3. 数组中的数据在内存中按顺序存储的,而链表是随机存储的。
基于时间的考虑:
  1. 数组查询快,插入与删除慢,单链表查询慢,插入与删除快。细说的话:数组中任意节点都可以在O(1)内直接存储访问,而链表中的节点,需从头指针顺着链表扫描才能获取到;而链表任意位置进行插入和删除,都只需要修改指针,而数组中插入删除节点,平均要移动一半的节点。

访问控制符

public protected defailt private
同一个类 True True True True
同一个包 True True True False
子父类 True True False False
不同包 True False False False

接口与抽象类

抽象类就是比普通类多了一些抽象方法而已,其他部分和普通类完全一样;而接口是特殊的抽象类。
作用上看:

  1. 接口与抽象类结构有点像,但功能完全不同

  2. 接口是强调合约、约束关系,即你要与我合作,必须实现我的功能;抽象类没这个功能

语法上看:

  1. 都不能被实例化
  2. 接口是特殊的抽象类
  3. 接口不能有实现,Java8中可以有添加default关键字的默认实现和静态方法实现。
  4. 接口中的成员变量必须是public static final修饰(编译器默认会添加上),因此是常量
  5. 一个类可以实现多个接口但只能继承一个抽象类

什么是接口?

  1. 从表现来说:定义了很多函数,但是这些函数都没有实现,这就是接口。从作用来说:起到一个合约规范的作用。我要告诉你和我打交道的东西有什么约束
  2. 接口中的方法只能用public和abstract修饰或者不修饰
  3. 接口中的属性默认都是public static final,因此是常量

equal与==

对于字符串变量:

==:比较两个对象在内存中的首地址

equals:比较字符串中所包含的内容是否相同

对于非字符串变量:

==和equals都是比较对象在堆内存中的首地址。

装箱及拆箱

Integer i = 10; //装箱

int n = i ;//拆箱

装箱就是自动将基本数据类型转换为包装器类型。

拆箱就是自动将包装器类型转换为基本数据类型。

hashCode方法及作用

Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。

1、在Java集合中有两类,一类是List,一类是Set。他们之间的区别就在于List集合中的元素是有序的,且可以重复,而Set集合中元素是无序不可重复的。对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?通过迭代来equals()是否相等。数据量小还可以接受,当我们的数据量大的时候效率可想而知
2、当集合要添加新的对象时,先调用这个对象的 hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode 值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址
3、所以hashCode在上面扮演的角色为快速寻域(寻找某个对象在集合中区域位置)

在重写equals方法的同时,必须重写hashCode方法。为什么这么说呢?
1、让equals方法和hashCode方法始终在逻辑上保持一致性
2、即让equals认为相等的两个对象,这两个对象同时调用hashCode方法,返回的值也是一样的

Java8新特性

Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。

方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。

新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

Date Time API − 加强对日期与时间的处理。

Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。

Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

Java NIO框架对比

Mina

Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 Mina 版本2.04支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序,Mina 所支持的功能也在进一步的扩展中。

Netty

Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。

Grizzly

Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVA NIO作为基础,并隐藏其编程的复杂性。容易使用的高性能的API。带来非阻塞socketd到协议处理层。利用高性能的缓冲和缓冲管理使用高性能的线程池。

xSocket

xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。(只是对Java的NIO做了最简单的封装,以便于开发使用。