Java学习笔记
JavaSE学习
基本原理
JVM
- JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令、管理数据、内存、寄存器,包含在JDK中。
- 对于不同的平台,有不同的虚拟机
- 由于Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,导出运行”
JDK
- 全称为(Java Development Kit) Java开发工具包 JDK = JRE + Java的开发工具
- JDK提供给Java开发者使用,其中包含了java的开发工具,自然包括了JRE。所以安装了JDK,就不用管再单独安装JRE
JRE
- 全程为(Java Runtime Environment)Java运行环境 JRE = JVM + Java核心类库
- 由于包括了JVM虚拟机,所以如果仅仅想要运行Java程序,那么只需要安装一个JRE即可
注意事项
- JAVA文件有中文的时候记得在Javac的时候要转换成GBK编码才可以成功编译。(或者在javac的时候按照后面的例子进行编译 javac -encoding UTF-8 XX.java)
- 编译后每一个类都会对应一个class的文件
- 文件名必须和Public的类的名字一模一样
转义符
代码 | 含义 |
---|---|
\t | 一个制表位,实现对齐的功能 |
\n | 换行符 |
\\ | 一个\ |
\“ | 一个” |
\‘ | 一个’ |
\r | 一个回车。注意,并不会换行! |
DOS命令
代码 | 含义 |
---|---|
md XX | 创建XX的目录 |
rd XX | 删除XX的目录 |
copy XX | 拷贝XX文件 |
del XX | 删除XX文件 |
echo XX > YY | 输入XX内容到文件YY |
move | 剪切 |
Java API使用
java_API下载;
数据类型
整数类型
类型 | 占用空间 | 范围 |
---|---|---|
byte[字节] | 1字节 | -128~127 |
short[短整型] | 2字节 | -2^15~2^15-1 |
int[整型] | 4字节 | -2^31~2^31-1 |
long[长整型] | 8字节 | -2^63~2^63-1 |
Java的整型常量(具体值)默认为int型,声明long类型之后需加上‘l’或者’L‘
1 | long n3 = 1L; |
浮点类型
占用存储空间 | 范围 | |
---|---|---|
float(单精度) | 4字节 | -3.403E38~3.403E38 |
double(双精度) | 8字节 | 1.798E308~1.798E308 |
浮点数的构成:
浮点数 = 符号位 + 指数位 + 尾数位
其中尾数部分可能丢失,造成精度损失,小数都是近似值
例:
十进制 5.12 512.0f .512
科学计数法: 5.12e2 [5.1210^2] 5.12E-2 [5.12/10^2]
1 | float num1 = 1.1; //写法错误,会默认为double类型,double转化为float有损失 |
p.s.
通常情况下应该使用double类型而不是float类型,因为double更加精确(float会舍去很多的尾巴部分)
使用陷阱:
1
2
3
4
5
6
7double num11 = 2.7;
double num12 = 8.1 / 3;//根据数学计算的基本原则,这里的答案应该是2.7
System.out.println(num11);
System.out.println(num12);
/*
但是通过程序的计算和输出你会发现,这里num11输出很正常的2.7,但是num12输出的却是很奇怪的2.6999999999997。这个问题是计算机内部的问题而非数学的问题。
*/由于这个情况而言,要谨慎使用两个计算后的小数进行比较是否相等,正确的方式应该是对于两个数的绝对值的差值大小分类比较(使用java API)
1
2
3
4
5
6
7
8
9if (num11 == num12){ //该写法错误
System.out.println("相等");
}
System.out.println(Math.abs(num11 - num12)); //使用java API 进行查看
if(Math.abs(num11 - num12) < 0.00001){
System.out.println("差值非常小接近于规定的精度");
}对于系统自动的转化格式需要进行考虑
1
2
3
4
5
6
7float d1 = 10 + 1.1;//在这个例子中是错误的
/*
1.1在运算过程中默认转化的是double类型的,所以运算完之后也是double,当double转化为float自然就会报错。
如果要进行修改的话可以
float = 10 + 1.1f; 或者float = 10 + 1.1F;
*/牢记大空间不能赋值给小空间
1
2int a = 10;
byte b = a;//会报错,因为原先就是int类型,即便数字并不大
字符类型
具体编码方式是Unicode编码(Unicode编码ascii编码)
1 | char C1 = 'a'; |
UTF-8实质上就是对于Unicode编码的一个改进。
P.S.(byte,short)类型和char类型之前无法自动转化,但是可以进行运算,运算后的结果为int类型,int无法自动转化为char,但是反过来可以
布尔类型
占用空间:1字节(true和false两种状态)
适用逻辑运算,一般情况下用于if while等判断语句
不可以只用0或者非0的值来表示真假,只能使用true或者false
P.S.布尔类型不参与运算,也不能参与类型的自动转化
运算符
1 | int i = 1; |
运算符 | 含义 |
---|---|
% | 取余数 |
~ | 按位取反 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< | 算术左移 |
>> | 算术右移 |
>>> | 逻辑右移,不存在<<< |
- 算术右移:低位溢出,符号位不变,用符号位补溢出的高位
- A % B 其中如果A为小数也是可以计算的但是结果和double一样存在着很小的误差
逻辑运算符
逻辑运算符 | 含义 |
---|---|
a^b | 逻辑疑惑,ab不同则为true |
符合阈值运算符
1 | byte num = 6; |
三元运算符
1 | int a = 10; |
原码、反码、补码
- 二进制的最高位表示符号位:0表示正数,1表示负数
- 正数的原码、反码、补码都一样
- 负数的反码 = 符号位不变其余位取反
- 负数的补码 = 负数的反码 + 1 负数的反码 = 负数的补码 - 1
- 0的反码和补码都是0
- java没有无符号数,换言之,java中的数都是有符号的
- 计算机运算的时候都是以补码放方式进行运算的
- 当我们看运行结果的时候,需要看他的原码(!!!)
进制问题
表示
2进制:0b1011010
8进制:05512
16进制:0x1dabb / 0X1daabb
转化
数组扩容
JDBC
- 概念:Java DataBase Connectivity Java 数据库连接,Java语言操作数据库
- JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
- 快速入门
- 步骤:
- 导入驱动jar包
- 复制mysql-connector-java-8.0.26.jar到项目的libs目录下
- 右键选择add as library
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql,接受返回操作
- 处理结果
- 释放内存
- 导入驱动jar包
- 步骤:
XML
概念
概念:Extensible Markup Language 可扩展标记语言
- 可扩展:标签都是自定义的。
- 可扩展:标签都是自定义的。
功能
- 存储数据
- 配置文件
- 在网络中传输
- 存储数据
xml与html的区别
- xml标签都是自定义,html标签是预定义
- xml的语法严格,html的语法松散
- xml用于存储数据,html用于展示数据
两者都是w3c(万维网联盟)
语法
基本语法
- 第一行必须是文档声明,空行都不行
- xml文档中有且只有一个根标签
- 属性值必须用引号引起来(单双都可以)
- 文件结尾必须以.xml结尾
- 标签必须正确关闭(<name></name> or <br/>)
- xml的标签名称区分大小写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>组成部分
文档声明
格式:<?xml 属性列表 ?>
属性列表:
属性 含义 version 版本号(必须有) encoding 编码方式 standalone 是否独立(yes/no)
指令(了解即可)
结合CSS的:<?xml-stylesheet trpe=”text/css” href=”a.css” ?>
xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>a.css文件
1
2
3name{
color:red;
}标签:标签名称自定义的
- 规则
- 名称可以包含字母、数字以及其他字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者XML、Xml 等等)开始
- 名称不能包含空格
- 规则
属性
id属性值唯一
文本
注释方式和html一样
CDATA区:在改区域中的数据会被原样展示
1
2
3
4
5
6
7
8
9<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
<![CDATA[
if (a < b && a > c){}
]]>
</user>
约束:规定在xml文档的书写规则
分类
- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术
DTD:
引入dtd文档到xml文档中
内部dtd:将约束规则定义在xml文档中
内部:<!DOCTYPE 根标签名 [ 约束内容 ] SYSTEM “dtd文件的位置”>
外部dtd:将约束规则定义在外部的dtd文件中
- 本地:<!DOCTYPE 根标签名 SYSTEM “dtd文件的位置”>
- 网络:<!DOCTYPE 根标签名 PUBLIC “dtd文件名字” “dtd文件的位置URL”>
解析
操作xml文档,将文档中的数据读取到内存中
- 操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储
- 解析xml的方式
- DOM:将标记语言加载进内存,在内存中形成一颗dom树
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存
- SAX:逐行读取,基于时间驱动。
- 优点:不占内存
- 缺点:只能读取,不能增删改
- DOM:将标记语言加载进内存,在内存中形成一颗dom树
- xml常见的解析器
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:java的HTML解析器,可以直接解析(URL、html等)
- 快速入门
- 步骤
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
- 步骤
- 快速入门
- PULL:Android操作系统内置的解析器(sax方式的)
Servlet
反射
获取Class对象的方式
1 | Class.forName("全类名");//将字节码文件加载进内存,返回Class对象 |
Class对象功能
获取功能
- 获取成员变量们
- Field[] getFields() //获取所有public的成员变量
- Field getField(String name) //获取传入String的public成员变量
- Field[] getDeclareFields() //获取所有成员变量(包括其中private、protect等)
- Field getDeclareFiled(String name) //获取传入String的(包括其中private、protect等)
- 获取构造方法们
- Constructor[] getConstructors()
- Constructor getConstructor(类….parameterTypes)
- Constructor[] getDeclaredConstructors()
- Constructor getDeclaredConstructor(类….parameterTypes)
- 获取成员方法们
- Method[] getMethods()
- Method getMethod(String name,类… parameterTypes)
- Method[] getDeclaredMethods()
- Method getDeclaredMethod(String name,类… parameterTypes)
- 获取类名
- String.getName();
- 获取成员变量们
Field : 成员变量
操作
- 设置值
- void set(Object obj, Object value)
- 获取值
- get(Object obj)
1
2
3
4
5
6
7
8
9
10
11
12
13
14Field a = personClass.getField("a");
//设置值
//这里需要注意,如果说设定的值为private类型等,那么前面的getField变成getDeclareField
//并且加上这么一句
//a.setAccessible(true);即可防止报错
a.set(p."张三");
System.out.println(p)
//获取值
Person p = new Person();
Object value = a.get(p);
System.out.println(value);- 设置值