环境搭建
- jdk:java的开发工具包
- jre:java的运行环境
- jvm:java虚拟机
- jvm层内结构
- 栈 stack:解决运行时的问题,程序的执行顺序
- 堆 Heap:数据的存放
- 元数据区:
- GC机制:垃圾回收机制
- jvm层内结构
语法基础
- 标识符:任意大小写字母、数字、下划线和$符号,其中数字不能作为标识符的第一位
- 包 package
- 导入语句 import
- 类的定义 public class类名{ }
- 数据类型
- 基本类型:boolean、byte、short、int、float、long、double、char
- 对象类型:自定义对象,jre自带对象
- 变量 数据类型 变量名 [=初始值];
- 变量、字面量、常量
- 变量的语法 数据类型 变量名 [=初始值];
- 常量的语法: final 数据类型 常量名 = 值
- 字面量 就是值
- 运算符
- 表达式 由变量、常量、字面量与运算符组成的合法语句
- 条件分支
- if语句
- switch语句
- 循环结构
- for循环
- while循环
- do while循环
- break语句和continue语句
- 数组操作
- 一维数组:一段连续内存空间,并且一个数组只能放一种类型的数据 语法:数据结构 数组名 = new 数据结构[length]
- 二维数组:就相当于每一个一维数组中的每个类型都为一个数组
面向对象编程思想
- top-down的理论
- 自上而下的编程思想,将一个大的问题分解为一个个小问题,能解决就解决,不能解决就继续分
- 与面向过程思想有什么不同?
- 面向过程编程,是每一步都需要进行自己操作,没有太多的函数,只用最基本的操作解决问题。代码的执行效率略高
- 面向对象编程,仅仅需要写的人对业务的流程清晰,并不需要对执行的细节很清晰,因为大部分通用的操作都是封装好的直接调用即可。对执行的效率略低,但开发效率较高。
- 封装、继承、多态
- 封装:通过权限修饰符对方法和属性进行修饰,使得不同的对象对本类的内容使用权限不相通
- public 同一项目下可用
- protected 不同包的子类可用
- (缺省) 同一个包下可用
- private 本类中可用
- 继承:通过子类继承父类使得子类拥有父类结构的同时,还能进行拓展,并且对于父类中的方法还可以进行重写
- 多态:父类的引用指向子类的对象,只能调用父类中的方法,但在执行时执行的是子类重写父类的方法。编译看左边,执行看右边
- 封装:通过权限修饰符对方法和属性进行修饰,使得不同的对象对本类的内容使用权限不相通
- 什么是类? 一种用户定义的数据引用类型
- 构造器的定义
- 在创建本类时,调用自身的方法
- 构造器的作用
- 定义类时进行初始化
- getter/setter
- 提供给使用本类时操作本类中属性的方法
- 构造器的定义
- 什么是对象?
- 类的实例化
- 属性和方法 类的基本组成
- 方法的重载:方法名相同,返回类型和参数列表不同的同一个类中的方法
- 对象和引用
- 对象代表定义的一个对象类型的变量,而它执行的内容叫做对象的引用
- 继承
- java是单继承,多实现的一种语言
- extends继承关键字
- instanceof用来判断一个对象是不是另一个对象子类的关键字
- 抽象类
- abstract修饰符 用来定义这个类是一个抽象类
- 不可被实例化
- 可以有普通方法和抽象方法
- 抽象方法
- 在抽象类和接口中的只是被定义语句没有方法体的方法
- 接口
- 常量属性
- 默认修饰为public static final
- 抽象方法
- 默认修饰符为public
- 静态方法 - jdk8中
- 默认修饰符 static
- 默认方法 - jdk8中
- 默认修饰符 default
- 常量属性
- static修饰符
- 静态代码块 static {}
- 静态属性 static 类型 属性名 [=属性值]
- 静态方法 static 返回类型 方法名(参数列表) {方法体};
- 静态内部类 class Person{ ststic class head{} }
- 可以直接访问外部类中的静态方法和静态属性
- 如果要访问外部类的非静态资源,需要通过对象调用
- 单例模式
- 饿汉式 使用static
- final
- 定义的类:不可继承
- 定义的方法:不可重写
- 定义的属性:值不可修改
- 多态
- 父类的引用指向子类的对象,只能调用父类中的方法,但在执行时执行的是子类重写父类的方法。编译看左边,执行看右边
异常处理机制
- 异常的分类
- 运行时异常 RuntimeException
- NullPointerException 空指针异常
- ArrayIndexOutOfBoundsException 数组越界
- classCastException 类型转换异常
- 非运行时异常
- InterruptedException
- IOException
- SQLException
- RemoteException
- 运行时异常 RuntimeException
- 积极处理方式
- try{} catch {} finally{}
- 消极的处理方式
- throws 异常类型列表
- throw 异常对象
数字、字符串、日期处理
- Number相关的类型
- Number
- Integer
- Long
- BigInteger 大整数
- BigDecimal 大浮点数
- CharSequence相关得类型
- String 不建议修改,数据放在常量池中,每次修改相当于重新获取对象
- StringBuilder 可变长字符串 线程不安全
- StringBuffer 可变长字符串 线程安全,效率较低
- Date相关的类型
- Date
- java.util.Date 带时分秒
- java.sql.Date 不带时分秒
- Calender 一个日历工具类
- SimpleDateFormat格式化日期对象
- Date
- java.time包 - jdk
- LocalDate 年月日
- LocalDateTime 年月日时分秒
- LocalTime时分秒
- DateTimeFormatter 格式化
IO
- 字节流
- 输入流
- FileInputStream
- ByteArrayInputStream
- BufferedInputStream
- DataInputStream
- ObjectInputStream
- 输出流
- FileOutputStream
- ByteArrayOutputStream
- BufferedOutStream
- DataOutputStream
- ObjectOutputStream
- 随机访问流
- RandomAccessFile
- 输入流
- 字符流
- 输入流
- FileReader
- CharArrayReader
- BufferedReader
- InputStreamReader – 桥接器
- 输出流
- FileWriter
- CharArrayWriter
- BufferedWriter
- PrintWriter
- OutputStreamWriter – 输出桥接器
- 桥接器:字节流到字符流的转换
- 输入流
内部类
- 成员内部类:可以访问外部类的私有成员或属性
- 静态内部类:可以使用外部类的静态属性和方法,其他方法需要通过对象调用
- 局部内部类:
- 匿名内部类 为lambda表达式的前身
集合框架
Iterable ->Collection
- List:有序,可重复
- ArrayList 低层为数组结构
- LinkedList 低层为链表结构
- Vector 低层为数组结构,线程安全,效率不高
- Set:无序,不可重复。低层为Map结构,数据存放在key位置,value位置默认为PRESENT
- HashSet,低层为hash表结构,无序,不可重复
- SortedSet - >TreeSet :低层为树状结构,有序,不可重复
- Queue 队列,先进先出
- PriorityQueue 优先队列
- Deque 低层为链表的双端队列
- ArrayDeque 低层为数组的双端队列
- BlockingQueue 阻塞队列
- LinkedBlockingQueue 低层为链表的阻塞队列
- ArrayBlockingQueue 低层为数组的阻塞队列
Map 键值映射关系
- jdk7及之前,每个节点是Entity<k,v>,jdk8后每个节点是Node<k,v>
- HashMap 低层使用hash表
- 初始大小为16,当使用率达到75%进行扩容,每次扩容为原来的二倍。当有8个hashCode值相同的数据放到集合中,该节点的链表结构会变为红黑树,当红黑树红数据的个数小于6时,红黑树会重新变回链表结构
- 添加数据时,先比较数据的hashCode值,然后通过hashCode值在hash表中找到对应的位置。
- 如果hash得这个位置没有数据,直接放入
- 如果这个位置已经存在数据,则与这个位置链表中的所有数据数据进行equel比较
- 如果有相同元素,则表示这是一个重复数据,不添加
- 如果没有重复,则加入到这个位置的链表当中,添加规则遵循7上8下原则:jdk为头插法,jdk8中为尾插法
- SortedMap ->TreeMap 有序
- 低层存储结构为基于红黑树的树结构
枚举
- 自动继承Enum类
- 构造方法是私有的
- 可以有抽象方法
- 也可以有属性
泛型
- 泛型类
- 泛型方法
- 泛型字母通配
- 本质:类型参数化
- 限定上限 <? extends 父类>
- 限定下限 <? supper 子类>
反射机制
- 通过类的class对象,获取类中所有内容,并且可以打破封装setAccessible(true)
- Package 包
- Class 泛型类型,可以指泛型参数,也可以指泛型返回类型
- Modifiers 修饰符
- Constructor 构造器
- Method 方法
- Field 参数
- Array (?)
注解
- 元注解:
- @Target 限制注解的适用位置
- @Retention 注解的保留策略
- @Documented 是否可以被文档化
- 自定义注解
- APT程序
- 自定义注解需要有相应的APT程序进行解释,不然定义的注解不能起作用
多线程
创建方式
- 继承Thread类,重写run()方法,通过调用start()方法,开启线程
- 创建Runable实现类,run()方法,通过调用start()方法,开启线程
- 创建Callable实现类,call()方法,该方法有返回值,可以通过FutureTask类的get方法获取返回值。通过FutureTask对象作为Thread对象的target创建并启动新线程
线程的状态
- 初始态
- 可运行态
- 有资源,没有时间片
- 运行态
- 有时间片
- 有运行资源
- 阻塞态
- 缺少资源
- 没有获取时间片
- 没有锁
- 终止态
- 线程结束
sleep 和wite的区别
- 线程调用sleep,该线程处于阻塞状态,当休眠时间到,线程进入就绪状态等待时间片。如果该线程有锁。休眠期间并不会释放锁
- 线程调用wite方法,线程处于阻塞状态。如果该线程有锁,锁会自动释放。并且该线程不会自动解除阻塞状态,只有当其他线程调用notify()方法或notifyAll()方法,线程才能结束阻塞状态。并且notify每次只能唤醒一个线程。notifyAll()方法欢迎除自己外的所有线程。
网络编程
lambda表达式
- 使用条件:一个接口中只能有一个方法
- 语法 (( 参数 ) - >{ 方法体 })
- 方法引用
- 流式编程
- java.util.function包
- Predicate 谓词型接口 判断0或1
- Consumer 消费型结构,只进不出
- Supplier 供应型接口 给我一个特定类型对象,没有返回值
- Function 功能性接口 你给我一个对象,我还你一个其他对象
- java.util.stream包
- Stream
- map方法
- filter方法
- reduce方法
- sort方法
- Collector类
- Stream
- java.util.function包
可能会有些不对的地方,欢迎评论区指出,纯靠个人印象