java基础-3

java基础-3

API

Application Programming Interfaces --- 应用程序接口

Object 顶级父类 Bin --- 二进制 Oct --- 八进制 Dec --- 十进制 Hex --- 十六进制 String 最终类-表明字符串 底层以数组存储 StringBuild效率远高于+, 字符拼接较少用+ ---json StringBuilder和StringBuffer中的方法签名如出一辙的。StringBuilder是线程不安全的,StringBuffer是线程安全的 字符串中提供了一系列的操做而不改变原字符串的方法,会产生一个新的字符串 正则表达式--pattern Regular expression --- REGEX 用于指定规则的。 匹配器选择匹配对象 数学类---Math BigDecimal:用于精确存储和运算小数的类。要求参数以字符串形式传递 BigInteger:能存储和计算任意大小的整数的类 包装类 基本类型身上没有属性和方法,为了快捷操做产生了包装类 Void:最终类,不能建立对象 int:Integer char:Character 其余基本类型用首字母大写来表示 自动封箱/拆箱都是JDK1.5的特性 将基本类型的变量直接赋值给了对应的引用类型的对象 --- 自动封箱/自动装箱 将引用类型的对象直接赋值给了对应的基本类型的变量 --- 自动拆箱 对于八种包装类型对应的哈希码都是固定的,不随条件改变。 null的哈希码规定为0 NaN --- 非数字 --- 惟一,和任何值都不相等,包括本身自己 字面量的哈希码是固定不变的 --- 全部的字面量都是存储在运行时常量池 常量池存储的字面量以及自定义常量 日期类 Date:表明日期的类。 Calendar:表明日历的类。 从JDK1.8开始,对时间体系进行了新的划分,将日期和时间进行分离,而且详细区分,从而造成了一个新的包---时间包 java.time 异常--exception Throwable:全部异常的父类 Error:错误 。 一旦出现,不能处理 异常出现以后能够处理 捕获 A. 若是多个异常的处理方式各不同,可使用多个catch来分别捕获分别处理 B. 若是全部异常的处理方式都同样,能够捕获一个父类异常进行统一的处理 C. 若是多个异常分红了不一样的组来进行出来,那么同一组异常之间能够用|隔开,进行分组处理 --- JDK1.7开始 finally --- 以前不管出现异常与否,都会执行一次 抛出 编译时异常:编译的时候就出现。因为在编译的时候就已经出现,因此要求必须处理 运行时异常:运行的时候才出现。能够处理,能够不处理 --- RuntimeException 自定义异常:定义一个类继承某个异常类,若是继承的是Exception或者是其余的异常,那么定义了一个编译时异常;若是继承的是RuntimeException或者是它的子类,那么就是一个运行时异常 项目处于开发阶段,出现了异常,打印异常的栈轨迹,修改代码 项目已经上线,出现了异常,跳转错误页面,记录错误日志 集合---Collection<E> 存储多个元素的容器 --- 大小不固定 Collection<E> --- 集合顶级接口 <E> 泛型 --- 在集合中,泛型用于定义元素类型 --- 因为泛型的限制,集合中只能存储对象 List---列表 元素有序 --- 保证元素的存入顺序 --- List中的元素是存在下标的 ArrayList --- 列表 底层用数组存储数据。默认初始容量是10,每次扩容是在当前的基础上增长一半。10 -> 15 -> 22. 底层的扩容是基于右移来实现 是一个线程不安全的集合。 LinkedList --- 链表 底层是基于节点来进行存储的。内存空间不连续。增删元素的操做相对简单,查询元素的操做相对复杂。是一个线程不安全的集合。 若是增删次数和查询次数在相差不大的状况下,使用顺序表仍是使用链表结构? --- 链表结构,缘由是链表对内存的要求更小 顺序表和链表在增删操做时的效率如何? --- 总体效率上,链表要高于顺序表。若是增删位置相对靠前,那么链表效率较高;若是增删位置相对靠后,则顺序表效率较高 Vector --- 向量 是Java中最先的集合。底层是基于数组进行存储的。默认初始容量是10,每次扩容默认增长一倍 --- 基于三元表达式。10 -> 20 -> 40。是一个线程安全的集合 Stack --- 栈 继承了Vector。遵循的原则是后进先出/先进后出。最早放入栈中的元素 --- 栈底元素;最后放入栈中的元素 --- 栈顶元素 将元素放入栈中 --- 入栈/压栈 将元素从栈中取出 --- 出栈/弹栈 Set --- 散列集合 Set中的元素不可重复 HashSet;底层基于HashMap存储的 加载因子太小,会致使内存的浪费,也会致使rehash操做越频繁从而下降效率 加载因子过大,会致使每个桶中的链表过长从而下降效率 从JDK1.8开始,为了减小扩容次数同时也为了保证每个桶的查询效率,在桶中的元素超过8个的时候,会采起红黑树结构 Collections---操做集合的工具类 sort---用于对列表进行排序。在排序的时候能够默认升序排序,也能够指定比较规则进行排序。在指定规则的时候须要传入一个Comparator(比较器)对象,重写compare方法,根据返回值的正负来对元素进行排序 Iterator:迭代器。在迭代过程当中会对每个元素进行标记。若是标记状态为false说明该元素要被移除。 Iterable : 实现这个接口的类所产生的对象能够被加强for循环进行遍历。 --- 若是一个对象可以使用加强for循环,那么这个对象对应的类药实现Iterable接口 --- 加强for循环本质上是一个迭代遍历 --- 加强for循环是JDK1.5的特性之一。 泛型即参数化类型 --- ParameterizedType --- JDK1.5的特性之一 将泛型替换为具体类型的过程 --- 泛型的擦除 --- 发生在了编译期 ? extends 类/接口 --- 上边界 ? super 类/接口 --- 下边界 ? 表示通配符 Stream JDK1.8出现的,用于操做集合的流式结构,但不是流。利用stream对象对集合进行批量操做 断言 根据已有条件来对结果进行预测判定。 --- 在Java中,断言不是默认开启的,须要手动开启 -ea Map<K, V> --- 映射 映射的顶级接口 --- 顶级父类Dictionary 键 - key, 值 - value --- 键是惟一的,每个键都对应了一个值 --- 键值对 --- 一个映射中包含了不少的键值对。 将每个键值对看作一个对象 --- 表明键值对的接口 --- Map.Entry,能够认为一个Map对象是由多个entry对象组成。 遍历映射 html

1.keySet() --- 表示将映射中全部的键放入一个set集合中java

2.entrySet() --- 表示将映射中全部的键值对放入一个set集合中 映射不是集合,可是集合框架的一员 --- Java Collections Framework :包含了数组、集合、映射以及一部分操做它们的工具类 HashMap 默认初始容量是16,默认加载因子是0.75f,每次默认增长一倍。键和值容许是null。若是指定初始容量x, 那么x若是在(2n-1,2n],初始容量必定是2n。 自己是一个异步式线程不安全的映射 Hashtable 默认初始容量是11,默认加载因子是0.75f,每次扩容的时候在当前的基础上增长一倍,再+1。11 -> 23。键和值不容许是null。 Hashtable自己是一个同步式线程安全的映射 ConcurrentHashMap 异步式线程安全的映射 JDK1.5的特性 自动封箱/拆箱 加强for循环 静态导入 可变参数 枚举 泛型 反射(JDK1.4出现,1.5加强) 动态代理 内省 注解 静态导入/静态导包 import static 包名.类名.方法名; 表示导入指定包下的指定类中的指定的静态方法而不导入其余方法 --- 理论上可以提升加载速率,这个提升程度能够忽略不计 --- 对于程序的可阅读性大大下降,若是本类或者父类中存在方法签名一致的方法会致使静态导包失效 File 表明文件或者目录(文件夹)的类。 路径 绝对路径:以盘符或者是/开头的路径 D:\aa.txt /home/software 和当前所处的路径没有任何关系,直接定位到指定的路径 相对路径:不以盘符或者是/开头的路径 a.txt 须要以当前的位置来计算另外一个位置,路径发生改变的时候可以自动计算 IO流 是Java中一套用于数据传输的API。 IO - Input Output - 输入输出流。输入流指数据从外部流向程序;输出流指数据从程序流向外部 四个基本流都是抽象类,不能直接建立对象 字符流 字节流 FileOutputStream --- 字节输出流,能够向文件中写数据 FileInputStream --- 字节输入流,能够从文件中读取数据 向TXT文件中追加数据 - 数据从程序流向文件 - 输出流 向TXT文件中写入一个字符串 --- 字符流、输出流、和文件相关的流 --- FileWriter 读取文件 - 数据从文件流向程序 - 输入流 读取TXT文件 --- 输入流 字符流 和文件相关 FileReader 流中的异常处理正则表达式

  1. 将流对象放到try以外声明而且赋值为null,放到try以内建立express

  2. 关流以前须要判断流对象是否初始化成功 --- 判断流对象是否为nulljson

  3. 关流以后须要将流对象设置为null设计模式

  4. 为了防止关流失败致使数据丢失,须要在写外以后手动冲刷一次缓冲区 缓冲流 BufferedReader --- 提供了缓冲区,可以实现按行读取的效果。 利用FileReader来构建了BufferedReader,而后再BufferedReader对读取功能作了加强,这种方式称之为装饰设计模式 --- 利用了同类对象构建本身对象自己,对对象身上的功能作了加强或者改善 BufferedWriter提供了一个更大的缓冲区 Java中的原生的字符流只能操做字符类文件 txt java html等,可是不能读取office组件 系统流/标准流 系统流都是字节流 System.in 标准输入流 System.out 标准输出流 System.err 标准错误流 转换流 字符流和字节流之间用的转换就是转换流 OutputStreamWriter --- 将字符流转化为字节流 FileWriter是它的子类 InputStreamReader --- 将字节流转化为字符流 FileReader是它的子类 合并流 SequenceInputStream --- 建立输入流分别指向对应的文件,而后须要建立一个Vector集合存放这些输入流,利用Vector集合来产生一个Enumeration对象,使用Enumeration对象来构建合并流,最后利用合并流来读取数据进行合并。 序列化/反序列化流 将对象转化为字节以后进行存储 --- 序列化 --- 持久化 将字节转化为对象的过程 --- 反序列化 注意 1.一个对象想要被序列化,那么它所对应的类必须实现接口 --- Serializable --- 这个接口中没有任何的方法和属性,仅仅起标志性做用 2.用static/transient修饰的属性不会被序列化 3.若是一个类产生的对象容许被序列化,那么这个时候这个类在编译的时候会根据当前类中的属性自动计算一个版本号。当反序列化的时候,拿着对象中的版本号和类中版本号作比较,若是相等,则说明这个对象是这个产生的,能够被反序列化。若是没有手动指定版本号,自动计算版本号,那么就意味着类每变更一次,版本号就要从新计算一次。为了让序列化出去的对象反序列化回来,须要手动指定版本号 --- private static final long serialVersionUID Properties 是一个能够被持久化的映射。键和值的类型都是String properties文件的默认编码就是西欧编码 --- 当向properties文件中存放中文的时候变成了对应的Unicode编码 JUnit ---单元测试 导入单独的测试库。 要求测试的方法作到 “三无”:没有参数、没有返回值、非静态方法 线程 进程 --- 计算机中在执行的任务 --- 在CPU上执行和计算。 一个核上每每只能执行一个进程中的一个线程。---计算机看起来像是在运行多个进程,其实是由于在计算机中任务切换速度很是快,超过人的反应。--- 进程的执行在宏观上并行的,在微观上是串行的。 线程 --- 进程中的小任务 --- 多线程 定义线程数组

    1. 写一个类继承Thread类,将要执行的逻辑放到run方法中,建立线程对象,调用start方法来启动线程执行任务安全

    2. 写一个类实现Runnable接口,重写run方法,建立Runnable对象,而后将Runnable对象做为参数传递到Thread对象中,利用Thread对象来启动线程服务器

    3. 写一个类实现Callable接口,重写call方法。 --- 现阶段要求知道就行 多线程的并发安全问题 多个线程同时执行,而多个线程在执行的时候是相互抢占资源致使出现了不合常理的数据的现象---多线程的并发安全问题 多线程在执行的时候是相互抢占,并且抢占是发生在线程执行的每一步过程当中 同步锁机制 利用synchronized --- 同步代码块解决多线程并发安全问题 同步 --- 一段逻辑在同一时间只能有一个线程执行 异步 --- 一段逻辑在同一时间能有多个线程执行 同步必定是安全的 安全不必定同步 异步不必定安全 不安全必定是异步的 从微观上而言,同步必定是安全的,安全也必定是同步的。从宏观上,同步必定是安全的,安全不必定是同步的 须要一个锁对象 --- 要求锁对象要被全部的线程都认识:共享对象,类的字节码(方法区是被线程所共享的),this(必须是同一个对象开启了多个线程) 若是同步方法是一个非静态方法,那么以this做为锁对象;若是同步方法是一个静态方法,那么以当前的类做为锁对象 死锁 --- 因为锁之间相互嵌套而且锁对象不一样致使线程之间相互锁死,导致代码没法继续往下 --- 避免死锁:统一锁对象,减小锁的嵌套 活锁 --- 这个资源没有被任何的线程持有占用,致使程序没法往下执行 等待唤醒机制 wait------等待 notify------唤醒 等待唤醒机制必须结合锁来使用,并且锁对象是谁就用谁进行等待唤醒。 线程的状态 建立 能够转为就绪 就绪 能够转为运行或者阻塞 运行/活跃 能够转为阻塞或者消亡 阻塞/挂起 能够转为就绪或者消亡 消亡 线程的优先级 线程的优先级:1-10 理论上,数字越大优先级越高,抢占到资源的几率就越大 实际上,相邻的两个优先级的差异很是不明显。若是优先级差到5个单位及以上,则结果会相对明显一点点 守护线程 守护别的线程。只要被守护的线程结束,那么不管守护线程完成与否都会结束。 在线程中,一个线程要么是守护线程,要么是被守护的线程。当最后一个被守护的线程结束才会致使全部的守护线程结束 --- GC 启动线程的状况网络

    4. 用户请求建立

    5. 系统自启

    6. 被其余线程启动 线程结束的状况

    7. 被其余线程启动

    8. 寿终正寝:线程执行完成以后天然结束

    9. 他杀:线程被其余请求强制结束

    10. 意外事故:线程执行过程当中出现了异常或者错误 设计模式:在软件开发工程中使用的常见的解决问题的方式 单例模式 在全局中只存在一个实例的这种现象 饿汉式:会增长类的加载时间,可以避免的并发问题 懒汉式:减小加载时间,会致使多线程的并发安全问题 装饰模式 利用FileReader来构建了BufferedReader,而后再BufferedReader对读取功能作了加强,这种方式称之为装饰设计模式 --- 利用了同类对象构建本身对象自己,对对象身上的功能作了加强或者改善 套接字 进行网络数据传输的一套API --- 本质上是能够在网络上使用流 网络基本概念 七层模型:物理层 数据链路层 网络层 传输层 - UDP/TCP 会话层 应用层 表示层 --- HTTP、FTP、POP三、SMTP ... IP地址:在网络中标记主机。IPv4 --- 四组数表示一个IP地址,每一组数的取值范围是0-255 10.8.33.5 IPv6 --- 六组数表示一个IP地址 IPv9 端口:计算机与外界交互的媒介 --- 端口号 --- 0~65535 --- 0-1024 域名:各个网站提供的便于记忆的标记 --- news.baidu.com .org .edu DNS解析服务器:将域名和IP地址进行对应的 UDP 基于流的。不创建链接,不可靠。 传输速度相对比较快的。须要对数据进行封包,每一个包不超过64K大小。 适用于对速度依赖性比较强可是对可靠性依赖性比较低的场景 --- 视频聊天 --- DatagramSocket DatagramPacket 发送端:

    11. 建立套接字对象

    12. 准备数据包,将数据放入数据包中,而且绑定要发往的地址

    13. 发送数据包

    14. 关流 接收端:

    15. 建立套接字对象,而且绑定要接收的端口号

    16. 准备数据包

    17. 接收数据

    18. 关流

    19. 解析数据 TCP 基于流的。创建链接,经历三次握手,可靠。 可是传输速率相对较慢。理论上不限制传输的数据的大小。 适用于对可靠性的依赖性更高对速度依赖性较低的场景 --- 文件传输 注意:receive/connect/accept/write/read都会产生阻塞。 客户端 - Socket

    20. 建立客户端的套接字对象

    21. 发起链接,绑定链接地址

    22. 获取自带的输出流,写出数据,禁用输出流

    23. 若是服务器端有打回的数据,则须要获取输入流读取数据,禁用输入流

    24. 关流 服务器端 - ServerSocket

    25. 建立服务器端的套接字对象,而且绑定监听的端口号

    26. 接受链接,获取到一个Socket对象

    27. 获取输入流,读取消息,禁用输入流

    28. 若是须要向客户端打回消息,则须要获取输出流写出数据,禁用输出流

    29. 关流 可变参数 可变参数容许传入的参数个数随意变化 可变参数本质是数组 一个方法中只能定义一个可变参数 这惟一的一个可变参数必须定义到参数列表的末尾 枚举 取值相对固定而且可以一一列举。 用enum定义枚举 --- 枚举自己是一个类。 枚举类中的构造方法默认私有,枚举常量必须定义在枚举类的首行。 枚举类中定义任意类型的方法和属性,包括抽象方法 在Java中,全部的枚举默认继承java.lang.Enum JDK1.5开始,容许在switch-case中使用枚举常量 反射 反射:在获取这个类的字节码的基础上来解剖这个类。 Field - 表明属性的类 获取Class对象

    30. 经过类名.class的方式来获取指定类的字节码

    31. 经过对象.getClass的方式来获取对象对应的实际类的字节码

    32. 经过Class.forName(类的全路径名);获取指定类的字节码 Method - 表明方法类 Constructor - 表明构造方法的类 Annotation - 表明注解的类 Package - 表明包的类 注解 给程序看的解释 --- 在Java中,全部的注解的父类是Annotation 注解中的属性只能是基本类型、枚举、String、Class、其余注解类型以及他们所对应的一维数组 元注解 --- 修饰注解的注解 @Target --- 限定注解的使用范围 @Retention --- 限定注解的生命周期 @Documented --- 限定这个注解在使用的时候可否产生到文档中 @Inherited --- 限定此注解能够做用在子类上 JVM参数 标准参数:-d -ea等 非标准参数:-X 扩展参数:-XX: 每个线程都有一个独立的栈,所以栈内存的大小影响线程的个数 --- JVM限定了栈内存总的大小不能超过2G 或者物理内存的1/3 -Xss128K 表示限定栈内存的大小128K -Xmn 限定新生代的大小 -Xms 限定堆内存的初始大小 -Xmx 限定堆内存的最大值 -Xmn6M -Xms10M -Xmx10M -XX:+PrintGCDetails

相关文章
相关标签/搜索