关于Java的部分小知识点

  1. 程序运行中可能产生的问题(异常的分类)
    (1):严重的问题是Erro
    (2):非严重的问题Exception
    **编译期异常: 就是发生在编译期
    **运行期异常:就是发生在运行期
    (3):jvm对异常的处理方式,如果是main出现了问题
    那么main可以使用自己的方式处理,如果main方法不做处理那么就将问题抛给 调用者。
    处理方式一:使用try...catch(try中的代码越少越好;在catch中要给出处理方式,哪怕是一条输出语句,如果catch中的异常是平级
    关系,那么与顺序无关,如果是有继承关系的,尽量不要放到大的catch中进行处理)
    处理方式二:使用throws
    (4):throws使用在方法之上的,用户异常的声明
    throw是抛出一个异常,是用在方法中的,它不仅可以抛出编译期异常,还可以抛出运行期异常。
    (5):finally:在代码中适中要执行的。一般存放的是释放资源的代码。被执行的前提是jvm不能退出。
    2.final,finally,finalize之间的区别。
    (1):final是一个修饰符,可以用来修饰类,方法,变量。
    (2):finally是try...catch中的一部分,是始终被执行的代码,前提是jvm没有退出。
    (3):finalize是与垃圾回收期有关,是Object中的一个方法。
    3.自定义异常
    就是自己定义异常,一般的情况下java中的异常可以满足大部分程序中出现的异常,但是有时候这些异常
    满足不了我们的需求,这个时候需要我们自己定义异常。
    (1):使用方法,第一步,写一个类继承Exception或者是RunTimeException,第二步是在类中写出无参数和有参数的构造方法。
    (2):异常的注意事项:子类抛出的异常不能抛出比父类更大的异常,或者不抛出异常。子类不能抛出父类不存在的异常。或者不抛出异常。如果父类没有抛出异常,子类重写方法时不能抛出,只能在内部try...catch 。
    4.IO流
    (1):File类,file可以表示一个文件或者文件夹。
    (2):关于File的方法,创建文件还是文件夹不是根据文件的后缀名来区别的,而是根据调用的方法来来创建的。如果没有写具体的路径,那么所创建的文件夹或者文件就在本项目中,
    需要刷项目才能看到。如果想要创建指定目录下的文件夹或者文件需要自己不全路径。
    (3):File中的delete方法是不走回收站的。只能删除单级文件夹,不能删除多级。
    (4):重命名,renameTo,如果目标文件的路径是一致的,那么就是重命名,如果目标文件的路径不是一致的,那么就是先重命名后剪切。
    (5):判断功能:
    (6):file中获取功能相关的方法。
    5.递归算法
    递归算法:方法定义种调用本方法。递归一定要有出口,如果没有出口那就是死递归。而且递归的次数不能太多,如果次数太多就会栈内存溢出。

6.递归练习
(1)看见文件的路径首先要做的就是将路径封装为File对象。
(2)获取File文件或者文件夹对应的数组.
(3)遍历当前的数组,判断数组中的每一个元素、
**当前的元素是文件
判断文件的后缀名是否是以.java结尾
**当前的元素是文件夹,那么调用方法继续遍历。
7.IO流
什么是输入输出:输入和输出是站在内存的角度来看的。将硬盘上到内存中是输入(将硬盘上的数据输入到内存中,是对应的读取),从内存到硬盘上是输出(将内存中的数据写到硬盘上,是一个写的动作)。一般来讲我们平时所说的输入和输出
都是站在内存的角度来说的 。
8.IO流的分类
(1):按照数据的流向来分
**输入流
**输出流
(2):按照数据的类型来分
**字节流(可以操作任何数据)
**字符流(主要是针对中文,一个中文占两个字节,操作起来很方便)
(3):在开发中到底是使用字节流还是使用字符流,如果可以用Windwons自带的记事本打开,并且是可以、
读懂的,就使用字符流来操作,如果无法读懂那么就使用字节流来操作。
(4):按照操作数据类型
**字节输入流:inputStream
**字节输出流: outputStream
**字符输入流: Reader
**字符输出流: Writer
(5):需要注意的是流在使用完了一定要将流关闭,关闭的原因是将这个流的对象变成垃圾;通知系统释放关于该文件的资源,同时也防止了内存泄漏。。一旦流
被关闭了就不能对流进行操作了,因为它已经变成垃圾了。
(6):关于流的使用步骤
**创建流的对象
**调用读或者是写的方法
**关闭流
9.FileOutputStream中的方法
(1): write(byte [] bytes):一次写一个字节数组
(2): write(byte [] bytes ,int off,int len):一次写一个字节数组的一部分
(3): write(int by): 一次写一个字节。
(4):如果想要完成追加写入,在创建对象的时候传入一个boolean类型的值。
10.高效的字节输入输出流(一次读取一个字节数组)
(1):BufferedInputStream:高效的字节输入流。
(2): BufferedOutputStream:高效的字节输出流。
(3): 具体的使用步骤
**创建对象
**调用输入或者输出的方法
**释放资源
11.字符流
(1)字符流=字节流+编码表
(2)编码:就是将一个字符串转换为一个字节数组
**使用到的方法
getBytes(),默认使用的是GBK编码方式
getBytes(String charsetName),指定字符集将string编码到byte中。
(3)解码:就是将一个字节数组转换为一个字符串
**使用到的方法
String(byte[]bytes),解码指定的字节数组然后转换为字符串。默认是使用的是GBK.
String(byte[] bytes,String charsetName),指定解码方式,将字节数组转换为字符串。
******使用什么方式编码就使用什么方式解码。如果编码和解码的方式不统一,那么就会乱码。
(4)转化流
字符输入流 inputStreamReader
字符输出流 outputStreamWriter

  1. flush():表示刷新缓冲区,刷新之后可以再次的写数据,但是close之后是不可以写数据的。
    如果我们写的数据是比较少是可以不用刷新的,但是如果是写的数据很多,建议是写一部分刷新一部分,然后在close.

  2. 转换输入流和输出流的便捷类。(原因:在使用转换流的时候流的名称是比较长的饿,操作起来不是很方便,并且不用指点编码方式,因此java提供了针对转化流提出了便捷类)
    (1) 转换输入流 inputStreamReader 对应的便捷类 FileReader
    (2) 转换输出流 outputStreamWriter 对应的便捷类 FileWriter
    (3) 高效的字符输入流:BufferedReader
    (4) 高效的字符输出流:BufferedWriter

  3. 高效字符输入流特有的功能
    (1):readLine():一次读取一行,line是表示一行,不包含换行符。
    (2):newLine():里面带有换行,在window中或者一些高级的编辑器中都做了兼容。

  4. 使用字符流复制文本文件的五种方式
    (1) 使用便捷类一次读取一个字符(FileReader)
    (2) 使用便捷类一次读取一个字符数组(FileReader)
    (3) 使用高效的字符流一次读取一个字符(BufferedReader)
    (4) 使用高效的字符流一次读取一个字符数组(BufferedReader)
    (5) 使用高效的字符流一次读取一行(BufferedReader)

  5. 数据输入流和数据输出流(输入和读取一些基本的数据)
    (1) 数据输入流(DataInputStream)
    (2) 数据输出流(DataOutputSream)

  6. 内存操作流
    (1) 操作字节数组
    (2) 操作字符数组
    (3) 操作字符串

  7. 打印流
    (1) 字节打印流 PrintStream
    (2) 字符打印流 PrintWriter
    **特有的功能(可以操作任意数据类型)

  8. 随机访问流
    (1) RandomAccessFile: 父类是Object ,内部维护这一个数组。最大的特点是可以读取也可以写数据,数据类型是任意类型的。

  9. 网络模型的七层结构
    (1) 物理层:定义物理设备的标准
    (2) 数据链路层:从物理层接收MAC地址进行封装和节封装
    (3) 网络层:主要是从下一层获取到IP地址进行封装和解封装
    (4) 传输存:传输数据的端口和协议,从下一层接收到的数据进行分段和传输,当数据到达目的地的时候将数据进行重组。
    (5) 会话层:主要是接收和发送请求
    (6) 表示层:将数据进行解释,也就是将计算机能看懂的语言转化为我们能够看得懂的东西。
    (7) 应用层:将数据展示在应用终端上。

  10. 网络编程的三要素
    (1) IP地址:计算机在网上的位置
    (2) 端口号:标识我们的计算机的应用程序,分为物理端口和逻辑端口,物理端口一般指的是网卡,逻辑端口是标识进程的,在0~65535中是物流端口。
    (3) 协议:数据传输规则
    (4) UDP协议的特点:不需要建立连接,传输的速度快,不安全,不可靠,有大小的限制,一般是64k.
    TCP协议的特点:需要建立连接,传输的速度慢,安全,可靠。没有大小的限制。

  11. 网络编程(套接字编程,Socket编程)
    (1) 基本的原理:Socket=IP地址+端口号。
    (2) 应用程序的两端都有Socket,然后数据按照某种协议使用IO流的方式进行数据的传输。

  12. TCP协议
    开发步骤
    客户端 (1) 创建TCP通讯协议对象(Scoket)
    (2) 获取输出流对象
    (3) 写数据
    (4) 释放资源
    服务端 (1) 创建服务对象(ServerSocket)
    (2) 监听客户端
    (3) 获取输入流对象
    (4) 读取数据
    (5) 释放资源

  13. 进程以及多线程概述。
    (1) 什么是进程:就是现在正在运行的程序
    (2) 多进程是可以提高CUP的利用率
    (3) 什么是线程:一个程序有多个任务,每一个任务就是一个线程。线程存在的意义是提高应用程序的使用效率。他们的执行时随机的。
    (4) 并发:就是在同一个时间点上执行。
    (5) 并行:同一个时间段上执行。

  14. JVM的运行原理
    当我们使用Java命令来运行程序的时候,程序要运行时就启动了一个JVM,而JVM就相当于一个进程,
    在JVM启动时就自动开启了一个线程,而此时的线程就是一个主线程,主线程是在main方法中的,JVM是多线程的,至少存在两个线程
    一个是主线程,一个是垃圾回收线程。

  15. 多线程的实现方式。(方式一)
    (1) 方式一
    *** 定义一个类,让这个类继承Tthread
    *** 冲写run()方法。重写run()方法的目的是将需要运行的代码放在里面。
    *** 创建这个类的对象。
    *** 启动线程。
    (2) 获取线程的名称
    *** getName():获取线程的名称
    *** setName():设置线程名称
    *** 通过构造方法,来写名称
    (3) 线程的调度模型
    *** 分时调度
    *** 抢占式调度
    *** 线程的最大优先级是10.最小是1,默认是5.
    *** 线程的优先级的大小是表示抢占CUP的概率增大了,并不是一定获得了CUP的执行权。
    *** 休眠线程 selp(),由于是静态方法,可以直接调用。
    *** 加入线程 join() ,等待该线程停止之后在执行其他的线程。在启动之后再加入线程才能起作用。
    *** 线程礼让 yiled(),礼让的时间非常短暂,如果这时候其他的线程还没有抢占CUP,那么就继续此线程继续和其他线程抢占。
    *** 守护线程 setDameon(),如果其他的线程执行完了之后,剩余的线程都是守护线程,那么JVM就会直接退出。
    *** 线程中断,是打断线程受阻状态,让程序继续执行,但是程序会抛出一个异常。

  16. 多线程的实现方式二
    (1)实现步骤
    *** 创建一个类,让这个类去实现Runable,
    *** 重写run()方法。
    *** 创建该类的对象
    *** 创建Thread类的对象,然后把3中的对象作为参数传递给Thread.
    *** 使用Start()方法启动线程。
    (2) 两种线程实现方式的比较
    *** 两种方式都能实现多线程,但是第二种方式相对比第一种方式要好,因为第一种方式是单继承的,而第二种方式是通过
    实现Runable接口来实现的,在接口中,继承是可以单继承,也可以是多继承,这样一定程度上避免了单继承带来的局限性。
    (3) 获取当前线程对象
    *** Thread currentThread
    *** sleep 线程休眠

  17. 判断一个多线程是否存在问题的标准
    (1) 是否是多线程
    (2) 是否存在共享数据
    (3) 是否存在多条语句来共同操作数据(可以打乱)
    *** 解决方案
    把多条数据看做一个整体,当一个线程执行这个整体的时候,其他的线程不能只想这个整体,那就需要使用到(同步)代码块。
    *** 使用到 synchronized(new object){},同步代码块解决安全问题,主要取决于同步代码块中的对象Object,这个Object需要带成员变量出声明为静态的。

  18. 同步代码块
    (1) 同步代码块解决线程安全问题主要是取决于同步代码块中的对象。要求多个线程必须使用的是同一个对象。对象有的时候也被称之为同步锁(监视器),它的弊端是效率低。
    (2) 同步代码块锁对象是(任意对象)
    (3) 同步方法的锁的对象是(this)
    (4) 静态同步方法锁的对象是(线程类对应的字节码对象)

  19. 反射
    *** 什么是反射
    反射是在Java运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。
    对于任意一个对象,都能够调用它的任意一个方法和属性。
    这种动态获取和动态调用对象的方法的功能叫做Java语言的反射着机制。
    想要剖析一个类必须要先获得这个类的字节码文件。而剖析一个类就是使用的Class中的方法。
    (1) 类加载器的分类
    *** Bootstrap ClassLoader:是根加载器,主要是负责Java中核心部分类的加载
    *** Extension ClassLoader:扩展类加载器,是负责JRE的扩展类加载
    *** System ClassLoader:系统类加载器,负责在JVM启动之后加载Java命令的class文件。,以及classpath环境变量指定的jar包和路径。
    (2) 获取字节码文件的方式
    *** getClass()方法
    *** 通过静态的class
    *** 通过Class中静态的成员方法获取

你可能感兴趣的:(关于Java的部分小知识点)