本文主要是介绍2016.10.9 Java相关的知识点(类加载机制及数据库),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
自动装箱
public static void main(String[] args) {int i = 0;Integer j = new Integer(0);System.out.println(j == i);System.out.println(j.equals(i));
}
上述代码的输出是
true
true
类加载机制
- 启动类加载器( Bootstrap ClassLoader)启动类加载器无法被 java 程序员直接引用, 这个类加载器负责把存放在
<JAVA_HOME>\lib
目录中的, 或者被-Xbootclasspath
参数指定路径中的, 并且是被虚拟机识别的类库加载到虚拟机内存中. - 扩展类加载器(Extension ClassLoader)负责加载在
<JAVA_HOME>\lib\ext
目录中的, 或者被java.ext.dirs
系统变量所指定的路径中的所有类库。 - 应用程序类加载器( Application ClassLoader )这个类加载器是
ClassLoader
中的getSystemClassLoader()
方法的返回值, 一般称其为系统类加载器, 它负责加载用户类路径(ClassPath
)上所指定的类库
从 java 虚拟机的角度而降, 只存在两种不同的类加载器:
- 一个是启动类加载器(
Bootstrap ClassLoader
), 这个类加载使用 C++ 语言实现, 是虚拟机自身的一部分; - 另一种是其他所有的类加载器, 他们由 java 语言实现, 独立于虚拟机之外, 并且全部继承自
java.lang.ClassLoader
加载类的寻找范围就是 JVM 默认路径加上Classpath
, 类具体是使用哪个类加载器不确定。
类加载主要步骤
- 加载 把 class 文件的二进制字节流加载到 jvm 里面
- 验证 确保 class 文件的字节流包含的信息符合当前 jvm 的要求 有文件格式验证, 元数据验证, 字节码验证, 符号引用验证等
- 准备 正式为类变量分配内存并设置类变量初始值的阶段, 初始化为各数据类型的零值
- 解析 把常量值内的符号引用替换为直接引用的过程
- 初始化 执行类构造器
<clinit>()
方法 - 使用 根据相应的业务逻辑代码使用该类
- 卸载 类从方法区移除
工作过程: 如果一个类加载器收到了类加载的请求, 它首先不会自己去尝试加载这个类, 而是把这个请求委派给父类加载器去完成, 最终所有的加载请求都会传送到顶层的启动类加载器中, 只有当父类加载器反馈自己无法完成这个请求时候, 才由子加载器来加载。
例如类
Object
,它放在rt.jar
中,无论哪一个类加载器要加载这个类,最终都是委派给启动类加载器进行加载,因此Object
类在程序的各种类加载器环境中都是同一个类。对于任何一个类, 都需要由加载它的类加载器和这个类本身一同确定其在 java 虚拟机中的唯一性。
ClassLoader.loadClass()
的代码如下,先检查是否已经被加载过,如果没有则parent.loadClass()
调用父加载器的loadClass()
方法,如果父加载器为空则默认使用启动类加载器作为父加载器。如果父类加载器加载失败,抛出ClassNotFoundException
,再调用自己的findClass()
方法进行加载。另外,如果我们自己实现类加载器,一般是
Override
复写findClass
方法,而不是loadClass
方法。
JSP 与 Servlet 的关系
- Tomcat 等 Web 容器最终会把 JSP转化为 Servlet
- Jsp更擅长表现于页面显示, Servlet更擅长于逻辑控制
- Servlet是利用
System.out.println()
来输出 html 代码,由于包括大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率低下 - JSP通过在标准的HTML页面中嵌入Java代码,其静态的部分无须Java程序控制,Java 代码只控制那些动态生成的信息
- 最终 JSP 被容器解释为 Servlet,其中Html 代码也是用
System.out.println()
等拼接输出的 - JSP 第一次访问的时候,要转化为 java 文件,然后编译为 class 文件,所以第一次访问 JSP 速度会比较慢,后面会快很多
Servlet 生命周期
主要是java.servlet.Servlet
接口中的init()
、service()
、和destroy()
3个方法。
- 初始化阶段,web容器通过调用
init()
方法来初始化Servlet
实例,在Servlet的整个生命周期类,init()
方法只被调用一次 - 客户请求到来时,容器会开始一个新线程,并调用servlet的
service()
方法,service()
方法根据请求的http方法来调用doget()
或dopost()
- 终止阶段调用
destroy()
方法,销毁一些资源
GET 请求 vs POST 请求
GET
用于信息获取,是安全的和幂等的,GET
一般是对后台数据库的信息进行查询POST
表示可能修改变服务器上的资源的请求,一般是对后台数据库进行增、删、改的操作GET
请求的参数会跟在URL后进行传递,请求的数据会附在URL之后,以?
分割URL和传输数据,参数之间以&
相连,一般浏览器对 URL 的长度会有限制POST
请求,提交的数据则放置在是HTTP包的包体中,用类似Key-Value
的格式发送一些数据,相对来说,GET
请求会把请求的参数暴露在 URL 中,安全性比POST
差一些
HTTP 请求的基本格式
- <
request line>
请求行 <headers>
请求头(参数头)<blank line>
空白行[<request-body>]
请求实体(GET没有, POST有
)
数据库
索引的分类
主要分为聚集索引和非聚集索引:
- 聚集索引存储记录物理上连续,而非聚集索引是逻辑上的连续,物理存储并不连续
- 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
ResultSet 统计记录数目
Java 中使用JDBC
连接数据库,最后都会得到一个 ResultSet,比如如下的代码
Connection con = DriverManager.getConnection(url, username, password);Statement sta = con.createStatement();String sql = "select * from student";ResultSet resultSet = sta.executeQuery(sql);
那么如何根据得到的ResultSet
统计一共有多少条记录呢?注意:ResultSet
没有提供类似size()
、length
的 API 来直接获取总记录数。
方法1:利用循环
int sum = 0;
while(resultSet.next()){ sum++;
}
方法2:利用ResultSet的getRow方法来获得ResultSet的总行数
resultSet.last(); //移到最后一行
int rowCount = resultSet.getRow(); //得到当前行号,也就是记录数
这篇关于2016.10.9 Java相关的知识点(类加载机制及数据库)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!