Java新知识系列 四

时间:2023-03-09 01:45:20
Java新知识系列 四
    1. []URL的组成<协议>://<主机>:<端口>/<路径> .
    2. []线程的定义实例化和启动。
    3. []类的final变量初始化需要满足的条件.
    4. []管道通信,进程间的通信方式.
    5. []Java中的构造方法
    6. []Socket和ServerSocket的创建:http://www.cnblogs.com/rond/p/3565113.html
    7. []java中各个常用数据接口的继承关系:http://www.cnblogs.com/jing99/p/7057245.html
    8. []ArrayList和LinkList对比知识:http://yulon.iteye.com/blog/602556
    9. [] Java中异常的分类回答;https://blog.csdn.net/weixin_39382337/article/details/79438223
    10. [] PreparedStatement与Statement 的使用注意https://blog.csdn.net/u011161786/article/details/48394751http://www.cnblogs.com/raymond19840709/archive/2008/10/13/1309657.html
    URL的组成<协议>://<主机>:<端口>/<路径> :
    URL(Uniform Resource Locator) ,统一资源定位符,能够对因特网的资源进行定位。
    URL一般有四部分组成: <协议>://<主机>:<端口>/<路径> 
    现在最常用的<协议>为http协议。
    <主机>是指主机在因特网上的域名。主机号= ip地址+子网掩码.
    http协议的默认<端口>为80。
    <路径>是指要的文件的路径。
    线程的定义实例化和启动。
    一 、定义线程: 1、扩展java.lang.Thread类。 2、实现java.lang.Runnable接口。
    二、实例化线程: 1、如果是扩展java.lang.Thread类的线程,则直接new即可。
                     2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
            Thread(Runnable target) 
            Thread(Runnable target, String name) 
            Thread(ThreadGroup group, Runnable target) 
            Thread(ThreadGroup group, Runnable target, String name) 
            Thread(ThreadGroup group, Runnable target, String name, long stackSize)
    三、启动线程: 在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
    Final成员变量初始化需要满足的条件:
    类的final成员变量必须满足以下其中一个条件
     1、在构造函数中赋值
     2、初始化赋值
    管道通信,进程间的通信方式.
    管道实际上是一种固定大小的缓冲区,管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存中。它类似于通信中半双工信道的进程通信机制,一个管道可以实现双向 的数据传输,而同一个时刻只能最多有一个方向的传输,不能两个方向同时进行。管道的容 量大小通常为内存上的一页,它的大小并不是受磁盘容量大小的限制。当管道满时,进程在 写管道会被阻塞,而当管道空时,进程读管道会被阻塞,
    Java中的构造方法
    构造方法的特点:
    1. 构造方法的方法名与类名相同
    2. 构造方法没有返回值类型,也不写void
    3. 构造方法可以重载
    构造方法的分类:显示的构造方法和隐式地构造方法
    1. 显示的构造方法:显示的写出构造方法时,系统不会提供默认的无参构造方法
    2. 隐式地构造方法:系统默认提供的无参构造方法
    代码块的优先级: 静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法
    代码块的分类:
    静态代码块和实例代码块
    1. 静态代码块:static修饰的代码块,在类加载时执行,且只执行一次。因为类就加载一次了。
    2. 实例代码块:没有static修饰的代码块,创建对象时执行,每创建一次对象加载一次。
    实例代码块在执行构造方法之前执行。所以优先级高于构造方法。
    Socket和ServerSocket的创建:http://www.cnblogs.com/rond/p/3565113.html
    ServerSocket  (int port)
    创建一个serversocket 绑定在特定的端口
    Socket(InetAddress address, int port)
    创建一个socket流,连接到特定的端口和ip地址
    java中各个常用数据接口的继承关系参考:http://www.cnblogs.com/jing99/p/7057245.html
    Java新知识系列 四 Java新知识系列 四
    Java新知识系列 四Java新知识系列 四
    其中Iterable接口是Collevtion接口的父类;
    1:认识和理解ArrayList和LinkedList
    ArrayList实现了List接口,它是以数组的方式来实现的,数组的特性是可以使用索引的方式来快速定位对象的位置,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好. 
    LinkedList是采用链表的方式来实现List接口的,它本身有自己特定的方法,如: addFirst(),addLast(),getFirst(),removeFirst()等. 由于是采用链表实现的,因此在进行insert和remove动作时在效率上要比ArrayList要好得多!适合用来实现Stack(堆栈)与Queue(队列),前者先进后出,后者是先进先出.
    2:认识和理解之间的差别:
    Java新知识系列 四
    遍历方式快慢比较: 
    Java新知识系列 四Java新知识系列 四
    访问速度的差异:ArrayList>>LinkList
    添加删除速度:LinkList>>ArrayList
    Java新知识系列 四Java新知识系列 四
    Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
    一:Error
    Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
    二:Exception
    Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。
    1、运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:
    • ClassCastException(类转换异常)
    • ClassNotFoundException
    • IndexOutOfBoundsException(数组越界异常)
    • NullPointerException(空指针异常)
    • ArrayStoreException(数组存储异常,即数组存储类型不一致)
    • 还有IO操作的BufferOverflowException异常
    2、非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。常见的异常有:
    • IOException
    • SqlException
    1 、 PreparedStatement 接口继承 Statement , PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。
    2 、作为 Statement 的子类, PreparedStatement 继承了 Statement 的所有功能。三种方法
          execute 、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数
    3 、在 JDBC 应用中 ,应该始终以 PreparedStatement 代替 Statement. 也就是说 , 在任何时候都不要使用 Statement.
    基于以下的原因 :
    一 . 代码的可读性和可维护性 .
    虽然用 PreparedStatement 来代替 Statement 会使代码多出几行 , 但这样的代码无论从可读性还是可维护性上来说 . 都比直接用Statement 的代码高很多档次 :
    stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");//stmt 是 Statement 对象实例
    perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
    perstmt.setString(1,var1);
    perstmt.setString(2,var2);
    perstmt.setString(3,var3);
    perstmt.setString(4,var4);
    perstmt.executeUpdate(); //prestmt 是 PreparedStatement 对象实例
    对于第一种方法可读性差 . 别说其他人去读你的代码 , 就是你自己过一段时间再去读 , 都会觉得伤心 .
    PreparedStatement 尽最大可能提高性能 .
        语句在被 DB 的编译器编译后的执行代码被缓存下来 , 那么下次调用时只要是相同的预编译语句就不需要编译 , 只要将参数直接传入编译过的语句执行代码中 ( 相当于一个涵数 ) 就会得到执行 . 这并不是说只有一个 Connection 中多次执行的预编译语句被缓存 , 而是对于整个 DB 中 , 只要预编译的语句语法和缓存中匹配 . 那么在任何时候就可以不需要再次编译而可以直接执行 . 而 statement 的语句中 , 即使是相同一操作 , 而由于每次操作的数据不同所以使整个语句相匹配的机会极小 , 几乎不太可能匹配 . 比如 :
    insert into tb_name (col1,col2) values ('11','22');
    insert into tb_name (col1,col2) values ('11','23');
    即使是相同操作但因为数据内容不一样 , 所以整个个语句本身不能匹配 , 没有缓存语句的意义 . 事实是没有数据库会对普通语句编译后的执行代码缓存 .
    当然并不是所以预编译语句都一定会被缓存 , 数据库本身会用一种策略 , 比如使用频度等因素来决定什么时候不再缓存已有的预编译结果. 以保存有更多的空间存储新的预编译语句 .
    三 . 最重要的一点是极大地提高了安全性 .
    即使到目前为止 , 仍有一些人连基本的恶义 SQL 语法都不知道 .
    String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
    如果我们把 [' or '1' = '1] 作为 varpasswd 传入进来 . 用户名随意 , 看看会成为什么 ?
    select * from tb_name = ' 随意 ' and passwd = '' or '1' = '1';
    因为 '1'='1' 肯定成立 , 所以可以任何通过验证 . 更有甚者 :
    把 [';drop table tb_name;] 作为 varpasswd 传入进来 , 则 :
    select * from tb_name = ' 随意 ' and passwd = '';drop table tb_name; 有些数据库是不会让你成功的 , 但也有很多数据库就可以使这些语句得到执行 .
    而如果你使用预编译语句 . 你传入的任何内容就不会和原来的语句发生任何匹配的关系 . 只要全使用预编译语句 , 你就用不着对传入的数据做任何过虑 . 而如果使用普通的 statement, 有可能要对 drop,; 等做费尽心机的判断和过虑 .