Java新知识系列 四
-
[]URL的组成<协议>://<主机>:<端口>/<路径> .
- []线程的定义实例化和启动。
- []类的final变量初始化需要满足的条件.
- []管道通信,进程间的通信方式.
- []Java中的构造方法
- []Socket和ServerSocket的创建:http://www.cnblogs.com/rond/p/3565113.html
-
[]java中各个常用数据接口的继承关系:http://www.cnblogs.com/jing99/p/7057245.html
- []ArrayList和LinkList对比知识:http://yulon.iteye.com/blog/602556
- [] Java中异常的分类回答;https://blog.csdn.net/weixin_39382337/article/details/79438223
- [] PreparedStatement与Statement 的使用注意;https://blog.csdn.net/u011161786/article/details/48394751;http://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中的构造方法构造方法的特点:-
构造方法的方法名与类名相同
-
构造方法没有返回值类型,也不写void
-
构造方法可以重载
构造方法的分类:显示的构造方法和隐式地构造方法-
显示的构造方法:显示的写出构造方法时,系统不会提供默认的无参构造方法
-
隐式地构造方法:系统默认提供的无参构造方法
代码块的优先级: 静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法代码块的分类:静态代码块和实例代码块-
静态代码块:static修饰的代码块,在类加载时执行,且只执行一次。因为类就加载一次了。
-
实例代码块:没有static修饰的代码块,创建对象时执行,每创建一次对象加载一次。
实例代码块在执行构造方法之前执行。所以优先级高于构造方法。Socket和ServerSocket的创建:http://www.cnblogs.com/rond/p/3565113.htmlServerSocket (int port)创建一个serversocket 绑定在特定的端口Socket(InetAddress address, int port)创建一个socket流,连接到特定的端口和ip地址java中各个常用数据接口的继承关系参考:http://www.cnblogs.com/jing99/p/7057245.html其中Iterable接口是Collevtion接口的父类;ArrayList和LinkList对比知识:http://yulon.iteye.com/blog/602556,,https://www.cnblogs.com/sierrajuan/p/3639353.html1:认识和理解ArrayList和LinkedListArrayList实现了List接口,它是以数组的方式来实现的,数组的特性是可以使用索引的方式来快速定位对象的位置,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好.LinkedList是采用链表的方式来实现List接口的,它本身有自己特定的方法,如: addFirst(),addLast(),getFirst(),removeFirst()等. 由于是采用链表实现的,因此在进行insert和remove动作时在效率上要比ArrayList要好得多!适合用来实现Stack(堆栈)与Queue(队列),前者先进后出,后者是先进先出.2:认识和理解之间的差别:遍历方式快慢比较:访问速度的差异:ArrayList>>LinkList添加删除速度:LinkList>>ArrayListThrowable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。一:ErrorError(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。二:ExceptionJava的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。1、运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:-
ClassCastException(类转换异常)
-
ClassNotFoundException
-
IndexOutOfBoundsException(数组越界异常)
-
NullPointerException(空指针异常)
-
ArrayStoreException(数组存储异常,即数组存储类型不一致)
-
还有IO操作的BufferOverflowException异常
2、非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。常见的异常有:-
IOException
-
SqlException
PreparedStatement与Statement 的使用注意;https://blog.csdn.net/u011161786/article/details/48394751;http://www.cnblogs.com/raymond19840709/archive/2008/10/13/1309657.html1 、 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,; 等做费尽心机的判断和过虑 .-