java学习笔记
引入
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
- 编译型语言:
c
、c++
、Object-c
、苹果新语言``swift,`通常会对源码进行编译,生成可执行的二进制代码,执行的是编译后的结果。- 解释型语言:
Javascript
、python
、Erlang
、PHP
、Perl
、Ruby
,通常不用源码进行编译,一般通过解释器载入脚本后运行。由于每个语句都是执行的时候才进行翻译解释,所以执行效率相对较低,不过现在cpu和硬件都很强大,这个影响可以说很小了。java
具有编译与解释两种特性:既可以将其源代码当作脚本执行,也可以编译成class(字节码)代码运行。
结构化程序设计
1.标识符
- 标识符:标识名、接口名、变量名、常量名、方法名
1 | int a = 123; |
java标识符定义规则
- 以字母、下划线_、美元符$开头,后面可以是字母、下划线、美元符$和数字;
- 不能使用java关键字;
- 标识符区分大小写;
- 标识符长度不限
- 标识符命名尽量见名知意
关键字(keyword):对编译器有特殊含义的单词,不允许做标识符
- 数据类型:
boolean
、int
、long
、short
、byte
、float
、double
、char
、class
、interface
- 流程控制:
if
、else
、do
、while
、while
、for
、switch
、case
、default
、break
、continue
、return
、try
、catch
、finally
- 结构修饰符:
public
、protected
、private
、final
、void
、static
、stritfp
、abstract
、transient
、synchronized
、volatile
、native
- 动作:
package
、import
、throw
、throws
、extands
、implements
、this
、super
、instantceof
、new
- 值:
true
、false
、null
- 数据类型:
保留字(reserved word):特殊的关键字,现有java版本尚未使用,但以后版本可能作为关键字。
goto
、const
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)
其他运算符:
(类型)
、.
、[]
、()
、instanceof
、new
位运算:&、|、~、>>、>>>、<<
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
3if(关系表达式){
语句体;
}1
2
3
4
5
6
7
8if(关系表达式){
语句体;
}
else if(关系表达式){
语句体;
}else{
语句体;
}switch语句(可配合枚举使用)
1
2
3
4
5
6
7
8
9
10
11switch(表达式){
case 值1:
语句体;
break;
case 值2:
语句体;
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
24switch(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
7int 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
7int 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=88continue语句
停止本次循环,开始下一个循环
1
2
3
4
5for(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
5int array1[] = new int[3];
array1[0] = 1;
array1[1] = 2;
array1[2] = 3;
int array2[] = array1;//相当于c语言中进行了指针的复制数组的两个常见问题
数组越界:ArrayIndexOutOfBoundsException
1
2
3int array[] = new int[3];
Systemout.println(array[3]);//数组最大下标为2空指针异常:访问的数组(引用类型)不再指向堆
NullPointerException1
2
3int 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 | char[] chs = {'a','b','c'}; |
上面代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的
2)以””方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会创建一份String对象,并在字符串池中维护
1 | String s3 = "abc"; |
在上面代码中,针对第一行代码,JVM会建立一个String对象存放在字符串池中,并给s3参考;
第二行则让s4直接参考字符串池中的String对象,也就是说它们本质上是同一个对象
- 字符串的比较
使用==
作比较
- 基本类型:比较的是数据值是否相同
- 引用类型:比较的是地址值是否相同
使用equals
方法
object类的equals
方法本来是用==
号比较地址值,但是String类重写了equals
方法,可用来比较字符串的内容是否相同。
- 字符串长度
length()
方法,返回字符串的长度,String对象信息的访问器。
1 | String s1 = "abcd"; |
- 连接字符串
String类中提供了两种连接字符串的方法
s1.concat(s2)
,将字符串s1和s2连接s1``+=``s2
,将字符串s1和s2连接
1 | String s1 = new String("lo"); |
- 创建格式化字符串
格式化输出可以使用prinf()
和format()
方法。
String类使用静态方法format()
返回一个String对象而不是PrintStream对象
String类的静态方法format()
能用来创建可复用的格式化字符串,而不是仅仅是用于一次打印输出
如下:
1 | System.out.prinf("浮点型变量的值为"+ |
可以写成:
1 | String fs; |
- 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文档: