引入

  • JDK、JRE、JVM

1.JDK:英文名称(Java Development Kit),java开发工具包,JDK是整个java开发的核心,它集成了JRE和一些好用的的小工具。例如:javac.exe,java.exe,jar.exe等。

2.JRE:英文名称(Java Runtime Environment),java运行时环境,它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。

3.JVM:英文名称:(Java Virtual Machine),java虚拟机。它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心。

三者关系:JDK>JRE>JVM

  • 编译型和解释型

  • 编译型语言cc++Object-c、苹果新语言``swift,`通常会对源码进行编译,生成可执行的二进制代码,执行的是编译后的结果。
  • 解释型语言JavascriptpythonErlangPHPPerlRuby,通常不用源码进行编译,一般通过解释器载入脚本后运行。由于每个语句都是执行的时候才进行翻译解释,所以执行效率相对较低,不过现在cpu和硬件都很强大,这个影响可以说很小了。
  • java具有编译与解释两种特性:既可以将其源代码当作脚本执行,也可以编译成class(字节码)代码运行。

结构化程序设计

1.标识符

  • 标识符:标识名、接口名、变量名、常量名、方法名
1
2
int a = 123;
double = 1.0;
  • java标识符定义规则

    • 以字母、下划线_、美元符$开头,后面可以是字母、下划线、美元符$和数字;
    • 不能使用java关键字;
    • 标识符区分大小写;
    • 标识符长度不限
    • 标识符命名尽量见名知意
  • 关键字(keyword):对编译器有特殊含义的单词,不允许做标识符

    • 数据类型:booleanintlongshortbytefloatdoublecharclassinterface
    • 流程控制:ifelsedowhilewhileforswitchcasedefaultbreakcontinuereturntrycatchfinally
    • 结构修饰符:publicprotectedprivatefinalvoidstaticstritfpabstracttransientsynchronizedvolatilenative
    • 动作:packageimportthrowthrowsextandsimplementsthissuperinstantceofnew
    • 值:truefalsenull
  • 保留字(reserved word):特殊的关键字,现有java版本尚未使用,但以后版本可能作为关键字。

    • gotoconst

2.数据类型

  • 基本数据类型:整数、浮点数、字符、布尔

    类型 占用位数 数值范围 初始值 标准
    boolean 8 true或false false ISO Unicode字符集
    char 16 ’\u0000’到’\uFFFF’ ‘\u0000’ ISO Unicode字符集
    byte 8 从-128到127 (byte)0 ISO Unicode字符集
    short 16 从-32768(-2^15)到32767(2^15) (short)0 ISO Unicode字符集
    int 32 -2^31到2^31-1 0 ISO Unicode字符集
    long 64 -2^63到2^63-1 0L ISO Unicode字符集
    float 32 负数:-3.4028234663852886*10^38到-1.40129846432481707*10^(-45) 正数:1.40129846432481707*10^(-45)到3.4028234663852886*10^38 0.0f IEEE745标准
    double 64 负数:-1.7976931348623157*10^308到-4.94065645841246544*10^(-324) 正数:4.94065645841246544*10^(-324) 到1.7976931348623157*10^308 0.0d IEEE745标准
  • 引用数据类型:类、接口和数组。


3.运算符

  • 算数运算符:+ 、-、*、/、++、–、%

    算数表达式中包含多个基本数据类型的值时,整个算数表达式的类型自动进行提升

    等级顺序:byte``short``char–>int–>long–>float–>double

  • 关系运算符:<、<=、>、>=、==、!=

  • 布尔逻辑运算符:&&、&、||、|、!、^

    &&和||相比于&和| 拥有短路的特性

  • 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、>>>=

    扩展的赋值运算符(+=之类)隐含了强制类型转换

  • 条件运算符:x ? y:z (x为真执行y,否则执行z)

  • 其他运算符:(类型). []()instanceofnew

  • 位运算:&、|、~、>>、>>>、<<

A=0011 1100

B=0000 1101

:A&B 0000 1100

:A|B 0011 1101

异或:A^B 0011 0001

:~B:1111 0010

右移

左端高位移入操作数最高位的值

右端移出的低位自动舍弃

1
2
int v1=0xf0f0f000;对应二进制补码:1111 0000 1111 0000 1111 0000 0000 0000
int v2=v1>>4;对应二进制补码:1111 1111 0000 1111 0000 1111 0000 0000

无符号右移

左端的高位依次补0

右端的低位自动被舍弃

1
2
int v1=0xf0f0f000;对应二进制补码:1111 0000 1111 0000 1111 0000 0000 0000
int v2=v1>>4;对应二进制补码:0000 1111 0000 1111 0000 1111 0000 0000

左移

左端自动舍弃移出的高位

右端依次补0

1
2
int v1=0xf0f0f000;对应二进制补码:1111 0000 1111 0000 1111 0000 0000 0000
int v2=v1>>4;对应二进制补码:1111 0000 1111 0000 1111 0000 0000 0000

4.控制结构

  • if语句和if-else语句

    1
    2
    3
    if(关系表达式){
    语句体;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    if(关系表达式){
    语句体;
    }
    else if(关系表达式){
    语句体;
    }else{
    语句体;
    }
  • switch语句(可配合枚举使用)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    switch(表达式){
    case1:
    语句体;
    break;
    case2:
    语句体;
    break;
    default:
    语句体;
    break;//可不写
    }

    case穿透

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    switch(month){
    case 3:
    case 4:
    case 5:
    System.out.println("春季");
    break;
    case 6:
    case 7:
    case 8:
    System.out.println("夏季");
    break;
    case 9:
    case 10:
    case 11:
    System.out.println("秋季");
    break;
    case 12:
    case 1:
    case 2:
    System.out.println("冬季");
    break;
    default:
    break;
    }
  • for语句

    1
    2
    3
    4
    5
    6
    /*for(初始化语句;条件判断语句;条件控制语句){
    循环体语句;
    }*/
    for(int i;i<=100;i++){
    System.out.println("发生什么事了?");
    }
  • while语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*初始化语句;
    while(条件判断语句){
    循环体语句;
    条件控制语句;
    }*/
    int i=1;
    while(i<=100){
    System.out.println("发生什么事了?");
    i++;
    }
  • do-while语句

    相比while循环至少执行依次循环体语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*初始化语句;
    do{
    循环体语句;
    条件控制语句;
    }while(条件判断语句);*/
    int i=1;
    do{
    System.out.println("发生什么事了?");
    }while(i<=100)
  • break语句

    用于强制跳出当前循环,不执行循环中剩余的循环。注意:如为嵌套循环则只是跳出所位于的那层循环,并不是结束所有循环

    1
    2
    3
    4
    5
    6
    7
    int i=0,j=0,k=0;
    for(i=0;i<100;i++)
    for(j=0;j<100;j++)
    for(k=0;k<100;k++)
    if(i==88&&j==88&&k==88)
    break;
    //i=100,j=100,k=100

    标点语句(相当于goto语句)

    1
    2
    3
    4
    5
    6
    7
    int i=0,j=0,k=0;
    lable1: for(i=0;i<100;i++)
    for(j=0;j<100;j++)
    for(k=0;k<100;k++)
    if(i==88&&j==88&&k==88)
    break lable1;
    //i=88,j=88,k=88
  • continue语句

    停止本次循环,开始下一个循环

    1
    2
    3
    4
    5
    for(int i=0;i<=5;i++)
    if(i==3)
    continue;
    System.out.println(i+" ");
    //输出:0 1 2 4 5

Random

1 .导包

import java.util.Random

2.创建对象

Random r = new Random();

3.获取随机数

int number = r.nextInt(10);//0~9的随机数


5.数组

  • 数组的定义格式

    数据类型[] 变量名

    1
    int[] arrays;

    数据类型 变量名[]

    1
    int arrays[];
  • 数组的初始化

    动态初始化:初始化时只指定数组长度,系统给初值

    1
    int[] arrays = new int[3];

    静态初始化:初始化时给定了数组元素值

    1
    int[] arrays = {1,2,3,4,5};
  • 多个数组指向同一个堆

    1
    2
    3
    4
    5
    int array1[] = new int[3];
    array1[0] = 1;
    array1[1] = 2;
    array1[2] = 3;
    int array2[] = array1;//相当于c语言中进行了指针的复制
  • 数组的两个常见问题

    数组越界:ArrayIndexOutOfBoundsException

    1
    2
    3
    int array[] = new int[3];
    Systemout.println(array[3]);//数组最大下标为2

    空指针异常:访问的数组(引用类型)不再指向堆
    NullPointerException

    1
    2
    3
    int array[] = new int[3];
    array = null;
    Systemout.println(array[2]);

String类

  • 字符串特点
  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然String的值十分不可改变的,但是它们可以被共享
  • 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])

String类的构造方法

方法名 说明
public String() 创建一个空白字符串对象,不含有任何内容
public String (char[] chs) 根据字符数组内容,来创建字符串对象
public String (byte[] bys) 根据字节数组的内容,来创建字符串对象
String s = “abc” 直接赋值的方式创建字符串对象,内容就是abc
  • String对象的特点

1)通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同

1
2
3
char[] chs = {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);

上面代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的

2)以””方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会创建一份String对象,并在字符串池中维护

1
2
String s3 = "abc";
String s4 = "abc";

在上面代码中,针对第一行代码,JVM会建立一个String对象存放在字符串池中,并给s3参考;

第二行则让s4直接参考字符串池中的String对象,也就是说它们本质上是同一个对象

  • 字符串的比较

使用==作比较

  • 基本类型:比较的是数据值是否相同
  • 引用类型:比较的是地址值是否相同

使用equals方法

object类的equals方法本来是用==号比较地址值,但是String类重写了equals方法,可用来比较字符串的内容是否相同。

  • 字符串长度

length()方法,返回字符串的长度,String对象信息的访问器。

1
2
3
String s1 = "abcd";
System.out.println(s1.length());
//运行结果为:4
  • 连接字符串

String类中提供了两种连接字符串的方法

  • s1.concat(s2),将字符串s1和s2连接
  • s1``+=``s2,将字符串s1和s2连接
1
2
3
4
5
6
7
8
9
10
11
String s1 = new String("lo");
String s2 = new String("ve");
String s3 = "lo";
string s4 = "ve";
System.out.println(s1.concat(s2));
System.out.println(s3+s4);
System.out.println("lo"+"ve");
//运行结果:
love
love
love
  • 创建格式化字符串

格式化输出可以使用prinf()format()方法。

String类使用静态方法format()返回一个String对象而不是PrintStream对象

String类的静态方法format()能用来创建可复用的格式化字符串,而不是仅仅是用于一次打印输出

如下:

1
2
3
System.out.prinf("浮点型变量的值为"+
"%f,整形变量的值为 "+
"%d,字符串变量的值为 "+" %s",f,i,s);

可以写成:

1
2
3
4
String fs;
fs = String.format("浮点型变量的值为"+
"%f,整形变量的值为 "+
"%d,字符串变量的值为 "+" %s",f,i,s);
  • String方法

参考菜鸟java String API

StringBuffer和StringBuilder类

  • StringBuffer和StringBuilder类简介

当对字符串进行修改时,需使用StringBuffer和StringBuiler类。

和String类不同的是,StringBuffer和StringBuilder类的对象能被多次修改,并且不产生新的未使用对象。

在使用StringBuffer类时,每次都会对StringBuffer对象本身进行操作,而不是生成新的对象,所以如果需要进行字符串修改推荐使用StringBuffer。

Stringbuilder类在java5被提出,它和StringBuffer之间最大的不同在于StringBuilder的方法不是线程安全的(不能同步访问)

由于StringBuilder相比较于StringBuffer有速度优势,多数情况下建议使用StringBuilder类。

  • StringBuilder的构造方法
方法名 说明
public StringBuilder() 创建一个空白可变字符串对象,不含任何内容
pubilc StringBuilder(String str) 根据字符串内容,创建可变字符串对象
  • StringBuilder的添加和反转方法
方法名 说明
pubilc StringBuiler append(任意类型) 添加数据,并返回对象本身
publiic StringBulider reveerse() 返回相反的字符序列
  • StringBuileder和String的相互转换

StringBuilder转换String

public String toString():通过toString()就可以实现吧StringBuilder转换为String

String转换StringBuilder

pubilc StringBuilder(String str):通过构造方法就可以实现把String转换为StringBuilder

目的:便于利用StringBuilder中的append()reverse()方法

  • StringBuffer和StringBuilder各类方法

参考菜鸟教程的API文档:

java StringBuffer API

java StringBuilder API