Java

Java学习笔记

JavaSE学习

基本原理

JVM

  1. JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令、管理数据、内存、寄存器,包含在JDK中。
  2. 对于不同的平台,有不同的虚拟机
  3. 由于Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,导出运行”

JDK

  1. 全称为(Java Development Kit) Java开发工具包 JDK = JRE + Java的开发工具
  2. JDK提供给Java开发者使用,其中包含了java的开发工具,自然包括了JRE。所以安装了JDK,就不用管再单独安装JRE

JRE

  1. 全程为(Java Runtime Environment)Java运行环境 JRE = JVM + Java核心类库
  2. 由于包括了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
2
3
float num1 = 1.1; //写法错误,会默认为double类型,double转化为float有损失
float num1 = 1.1F; //完全正确,写成1.1f也是可以的
double num1 = 1.1f; //可以编译,小的放到大的空间可以实现

p.s.

  1. 通常情况下应该使用double类型而不是float类型,因为double更加精确(float会舍去很多的尾巴部分)

  2. 使用陷阱:

    1
    2
    3
    4
    5
    6
    7
    double 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
    9
    if (num11 == num12){ //该写法错误
    System.out.println("相等");
    }

    System.out.println(Math.abs(num11 - num12)); //使用java API 进行查看

    if(Math.abs(num11 - num12) < 0.00001){
    System.out.println("差值非常小接近于规定的精度");
    }
  3. 对于系统自动的转化格式需要进行考虑

    1
    2
    3
    4
    5
    6
    7
    float d1 = 10 + 1.1;//在这个例子中是错误的
    /*
    1.1在运算过程中默认转化的是double类型的,所以运算完之后也是double,当double转化为float自然就会报错。

    如果要进行修改的话可以
    float = 10 + 1.1f; 或者float = 10 + 1.1F;
    */
  4. 牢记大空间不能赋值给小空间

    1
    2
    int a = 10;
    byte b = a;//会报错,因为原先就是int类型,即便数字并不大

字符类型

具体编码方式是Unicode编码(Unicode编码ascii编码)

1
2
3
4
char C1 = 'a';
char C2 = '\t';
char C3 = '虞';//不能用""因为""表示的是字符串
char C4 = 97;

UTF-8实质上就是对于Unicode编码的一个改进。

P.S.(byte,short)类型和char类型之前无法自动转化,但是可以进行运算,运算后的结果为int类型,int无法自动转化为char,但是反过来可以

布尔类型

占用空间:1字节(true和false两种状态)

适用逻辑运算,一般情况下用于if while等判断语句

不可以只用0或者非0的值来表示真假,只能使用true或者false

P.S.布尔类型不参与运算,也不能参与类型的自动转化

运算符

1
2
3
4
5
6
7
8
9
int i = 1;
i = i++;
System.out.println(i);
//最后输出的结果依旧为1,因为会把i值先放到temp内部最后再赋值所以1保持不变

int i = 1;
i = ++i;
System.out.println(i);
//最后的输出结果为2,因为这里是先自增再赋值
运算符 含义
% 取余数
~ 按位取反
& 按位与
| 按位或
^ 按位异或
<< 算术左移
>> 算术右移
>>> 逻辑右移,不存在<<<
  1. 算术右移:低位溢出,符号位不变,用符号位补溢出的高位
  2. A % B 其中如果A为小数也是可以计算的但是结果和double一样存在着很小的误差

逻辑运算符

逻辑运算符 含义
a^b 逻辑疑惑,ab不同则为true

符合阈值运算符

1
2
3
byte num = 6;
b += 2;//这一项可以运行,因为等价为b = (byte)(b + 2);
b = b + 2;//这一项不可以运行,因为后面的2默认为int大到小的数据没法自动转化

三元运算符

1
2
3
4
int a = 10;
int b = 20;
int result;
result = a > b a++ : b--;

原码、反码、补码

  1. 二进制的最高位表示符号位:0表示正数,1表示负数
  2. 正数的原码、反码、补码都一样
  3. 负数的反码 = 符号位不变其余位取反
  4. 负数的补码 = 负数的反码 + 1 负数的反码 = 负数的补码 - 1
  5. 0的反码和补码都是0
  6. java没有无符号数,换言之,java中的数都是有符号的
  7. 计算机运算的时候都是以补码放方式进行运算的
  8. 当我们看运行结果的时候,需要看他的原码(!!!)

进制问题

表示

2进制:0b1011010

8进制:05512

16进制:0x1dabb / 0X1daabb

转化

数组扩容

JDBC

  1. 概念:Java DataBase Connectivity Java 数据库连接,Java语言操作数据库
    • JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
  2. 快速入门
    • 步骤:
      1. 导入驱动jar包
        1. 复制mysql-connector-java-8.0.26.jar到项目的libs目录下
        2. 右键选择add as library
      2. 注册驱动
      3. 获取数据库连接对象 Connection
      4. 定义sql
      5. 获取执行sql语句的对象 Statement
      6. 执行sql,接受返回操作
      7. 处理结果
      8. 释放内存

XML

概念

  1. 概念:Extensible Markup Language 可扩展标记语言

    • 可扩展:标签都是自定义的。
  2. 功能

    • 存储数据
      1. 配置文件
      2. 在网络中传输
  3. xml与html的区别

    1. xml标签都是自定义,html标签是预定义
    2. xml的语法严格,html的语法松散
    3. xml用于存储数据,html用于展示数据

    两者都是w3c(万维网联盟)

语法

  • 基本语法

    1. 第一行必须是文档声明,空行都不行
    2. xml文档中有且只有一个根标签
    3. 属性值必须用引号引起来(单双都可以)
    4. 文件结尾必须以.xml结尾
    5. 标签必须正确关闭(<name></name> or <br/>)
    6. xml的标签名称区分大小写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version='1.0' ?>

    <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>
  • 组成部分

    1. 文档声明

      1. 格式:<?xml 属性列表 ?>

      2. 属性列表:

        属性 含义
        version 版本号(必须有)
        encoding 编码方式
        standalone 是否独立(yes/no)
    2. 指令(了解即可)

      结合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
      <?xml version='1.0' ?>
      <?xml-stylesheet trpe="text/css" href="a.css" ?>

      <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
      3
      name{
      color:red;
      }
    3. 标签:标签名称自定义的

      • 规则
        1. 名称可以包含字母、数字以及其他字符
        2. 名称不能以数字或者标点符号开始
        3. 名称不能以字母 xml(或者XML、Xml 等等)开始
        4. 名称不能包含空格
    4. 属性

      id属性值唯一

    5. 文本

      注释方式和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文档的书写规则

      • 分类

        1. DTD:一种简单的约束技术
        2. Schema:一种复杂的约束技术
      • DTD:

        引入dtd文档到xml文档中

        • 内部dtd:将约束规则定义在xml文档中

          内部:<!DOCTYPE 根标签名 [ 约束内容 ] SYSTEM “dtd文件的位置”>

        • 外部dtd:将约束规则定义在外部的dtd文件中

          • 本地:<!DOCTYPE 根标签名 SYSTEM “dtd文件的位置”>
          • 网络:<!DOCTYPE 根标签名 PUBLIC “dtd文件名字” “dtd文件的位置URL”>

解析

操作xml文档,将文档中的数据读取到内存中

  • 操作xml文档
    1. 解析(读取):将文档中的数据读取到内存中
    2. 写入:将内存中的数据保存到xml文档中。持久化的存储
  • 解析xml的方式
    1. DOM:将标记语言加载进内存,在内存中形成一颗dom树
      • 优点:操作方便,可以对文档进行CRUD的所有操作
      • 缺点:占内存
    2. SAX:逐行读取,基于时间驱动。
      • 优点:不占内存
      • 缺点:只能读取,不能增删改
  • xml常见的解析器
    1. JAXP:sun公司提供的解析器,支持dom和sax两种思想
    2. DOM4J:一款非常优秀的解析器
    3. Jsoup:java的HTML解析器,可以直接解析(URL、html等)
      • 快速入门
        • 步骤
          1. 导入jar包
          2. 获取Document对象
          3. 获取对应的标签Element对象
          4. 获取数据
    4. PULL:Android操作系统内置的解析器(sax方式的)

Servlet

反射

获取Class对象的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Class.forName("全类名");//将字节码文件加载进内存,返回Class对象
XX.class;//通过类名XX的属性class获取
XX.getClass();//getClass()方法在Object类中定义XX表示对象


/*具体效果*/

//1.Class.forName("全类名") 多用于配置文件,将类定义在配置文件中。读取文件,加载类
Class cls1 = Class.forName("cn.itcase.domain.Person");
System.out.println(cls1);

//2.类名.class 多用于参数的传递
Class cls2 = Person.class;
System.out.println(cls2);

//3.对象.getClass() 多用于对象的获取字节码的方式
Person p = new Person();
Class cls3 = p.getClass();
System.out.println(cls3);

/*
P.S. 同一个对象获取的Class值相同
不同对象所获取的Class值不相同
*/

Class对象功能

  • 获取功能

    1. 获取成员变量们
      • Field[] getFields() //获取所有public的成员变量
      • Field getField(String name) //获取传入String的public成员变量
      • Field[] getDeclareFields() //获取所有成员变量(包括其中private、protect等)
      • Field getDeclareFiled(String name) //获取传入String的(包括其中private、protect等)
    2. 获取构造方法们
      • Constructor[] getConstructors()
      • Constructor getConstructor(类….parameterTypes)
      • Constructor[] getDeclaredConstructors()
      • Constructor getDeclaredConstructor(类….parameterTypes)
    3. 获取成员方法们
      • Method[] getMethods()
      • Method getMethod(String name,类… parameterTypes)
      • Method[] getDeclaredMethods()
      • Method getDeclaredMethod(String name,类… parameterTypes)
    4. 获取类名
      • String.getName();
  • Field : 成员变量

    • 操作

      1. 设置值
        • void set(Object obj, Object value)
      2. 获取值
        • get(Object obj)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      Field 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);