目录
初识java
James Gosling
java语言平台版本
-
J2SE(Java 2 Platform Standard Edition)标准版
是为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发。
-
J2ME(Java 2 Platform Micro Edition)小型版
是为开发移动设备和嵌入式设备(电器、机器人、机顶盒…)提供的解决方案。
-
J2EE(Java 2 Platform Enterprise Edition)企业版
是为开发企业环境下的应用程序提供的一套解决方案,该技术体系中包含的技术如 Servlet、Jsp等,主要针对于Web应用程序开发。
java语言特点
面向对象、开源、跨平台
- java程序的运行依赖JVM,显而易见一个系统只要系统支持JVM就可以运行java程序,这就赋予了java程序良好的可移植性。
JDK
JDK是java语言的开发工具包,是整个java开发的核心,它包含了:
- java开发工具(jdk \ bin)
- 基础开发库(jdk\ jre\ lib\ rt.jar)
- 基础开发库的源码(jdk\ src.xip)
JVM
运行与工作原理
java源代码.java ——(编译)—— java字节码.class ——(执行)—— 运行
- 编译:通过javac命令将java文件编译成java字节码文件
- 执行:启动java虚拟机(JVM),通过jvm加载字节码文件,加载main方法执行程序。
- JVM中类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件。
语言基础
前言
标识符
在Java中,我们需要标识代码的很多元素,包括类名、方法、字段、变量、包名等。我们选择的名称就称为标识符,并且遵循以下规则:
- 标识符可以由字母、数字、下划线(_)、美元符($)组成,但不能包含 @、%、空格等其它特殊字符。
- 标识符是严格区分大小写的,不能以数字开头
- 标识符中常见的命名规则(这些规定是不受语法约束的)
- 包名:多单词组成时所有字母均小写,使用.连接 aa.bb.cc
- 类名、接口名:大驼峰式 AaaBbbCcc
- 变量名、方法名:小驼峰式 aaaBbbCcc
- 常量名:多单词组成是所有字母均大写,使用_连接AAA_BBB_CCC
注释
Java代码的解释说明。不影响程序的运行,用于辅助读程。
// 单行注释
/* 多行注释 */
/** 文档注释 */
/*
实现了一个Java的HelloWorld程序
实现步骤:
1. 定义类
2. 定义主方法
3. 一条命令,控制台输出了HelloWorld
*/
public class HelloWorld{
//main主方法,固定格式,程序的入口点
public static void main(String[] args){
//系统 输出 打印 打印的内容
System.out.println("HelloWorld");
}
}
变量
-
局部变量:定义在方法或局部代码块中。
- 方法运行完内存就释放了。
- 访问修饰符不能用于局部变量。
- 内存分配在栈上。
- 无默认值,被声明后必须经过初始化才能使用。
-
成员变量:定义在类里,不初始化时有默认初始值,类消失,变量才释放。
-
类变量(静态变量):独立于方法之外的变量,用 static 修饰。
-
实例变量:独立于方法之外的变量,不过没有 static 修饰。
基本类型 默认值 byte 0 short 0 int 0 long 0L float 0.0F double 0.0D boolean false char \u0000 引用类型 null
-
常量
public static final int NUMBER = 3; // 成员常量
- 在程序运行过程一直不会改变的量称为常量。
- 常量在整个程序中只能被赋值一次。
- 当定义的final变量为成员变量时,必须在定义时就设定它的初始值,否则将会提示编译错误。
数据类型
基本数据类型
位bit 字节Byte 1Byte=8bit
类型 | 字节空间 | 取值范围 | |
---|---|---|---|
整型 | byte | 1 | -27到27-1 或者 -128到127 |
short | 2 | -215到215-1 | |
int | 4 | -231到231-1 | |
long | 8 | -263到263-1(L) | |
浮点型 | float | 4 | 单精度,对小数部分的精度要求不高(F) |
double | 8 | 双精度,精确的小数部分并操作值很大时(D) | |
字符 | char | 2 | 0到65535 |
布尔 | boolean | 1 | 真true 假false |
基本类型的类型转换
隐式转换
Byte a = 13;
Int b = a;//直接转换
显式转换
int a = 13;
Byte b = (byte)a;//小数转换成整数,小数直接舍弃
基本类型的字面值
- 整数字面值是ing类型
- 浮点数的字面值是double类型
引用数据类型
引用类型是一个对象类型,它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。
运算符
名称 | 符号 | 介绍 |
---|---|---|
算数运算符 | + - * / | 基本运算 |
% | 取余、求模、算整数 | |
++ – | i++ //先取值再自增;–i //先自减再取值 | |
比较运算符 | == | 相等比较 |
!= | 不等 | |
逻辑运算符 | && & | 短路与,与;两边同为真结果才为真 |
|| | | 短路或,或;两边只要有一个真结果就是真 | |
+ | ||
! | ||
三元运算符 | 布尔表达式 ? a :b | true 取a,false取b |
赋值运算符 | = | 赋值 |
+= -= *= /= | a+=2; //a=a+2 |
a=a+3和a+=3的区别
byte a = 1;
a=(byte) (a+3); //右侧int,左侧byte,大转小,强转。
a+=4; //会自动完成数据类型的转换
运算规则
-
计算结果的数据类型,与最大类型一致
3/2 //得1 ,而不是1.5,结果是int类型 3d/2 //得1.5,相当于double/int,结果是double类型
-
byte,short,char三种比int小的类型,运算时会先自动转换成int
byte a=1; byte b=2; int c=a+b; byte d=a+b;//错,运行时,byte会先自动转成int再运算.(Byte d=(byte)(a+b);)
char 型变量中能不能存储一个中文汉字,为什么?
char 类型可以存储一个中文汉字,因为 Java 中使用的是 Unicode编码(16位,不选择任何特定的编码,直接使用字符在字符集中的编号),一个 char 类型占 2 个字节(16 比特、16位),所以放一个中文是没问题的。
流程控制
分支结构
if条件语句
if(布尔表达式){
语句序列1
}else if(布尔表达式){
语句序列2
}else {
语句序列3
}
//注意:上面代码最多执行一个语句序列
switch 多分枝语句
表达式可以是int基本类型、Integer包装类型、char、String,由于byte,short,char都可以隐含转换为int,所以也支持。
switch(表达式){
case 常量值1:语句块1 ;break;
case 常量值n:语句块n;break;
default:语句块n+1; break; //若没有符合的则执行default
}
循环结构
while循环语句:
循环执行,直到条件表达式为false退出循环。
while(条件表达式){
执行语句
}
do…while 循环语句:
执行do里面的语句直到条件表达式为false退出循环。
do{
执行语句
}while(条件表达式);
for循环语句:
循环到表达式2为false位置
for(开始条件;循环条件;更改条件){
执行语句
}
foreach循环语句:
for (int x : arr) {
System.out.println(x); //逐个输出数组元素的值
}
循环控制
- break语句:跳出循环体(若是嵌套循环只能跳出内循环)
- continue:跳出本次循环
数组
- 创建的数组有默认值,int-0,double-0.0,char-空格,boolean-false,string-null
- 存放在堆中数组的地址给栈中的引用保存
- length 属性获取数组长度
- 数组一旦创建,长度不可变(允许0长度的数组)
创建数组(“[]”前后都一样)
-
动态初始化 :int [] a = new int[2];
-
静态初始化1:int[] a = {1,2};
-
静态初始化2:int[] a = new int[]{1,2};//不能填写长度
-
创建String数组
String a[]=new String[2];
String[] b=new String[2];
String c[]= {"1","2"};
数组工具类Arrays
Arrays.toString(数组)
把数组里的数据,用逗号连接成一个字符串。
格式:[10, 14, 20, 46, 51]
Arrays.sort(数组)
对数组排序,对于基本类型的数组使用优化后的快速排序算法,效率高。
对引用类型数组,使用优化后的合并排序算法。
Arrays.copyOf(数组,新长度)
- 把数组复制成一个指定长度的新数组
- 新长度小于原数组,相当于截取前一部分数据。
二维数组
存放数组的数组
int [] [] a = new int[2] [3];
冒泡排序
相邻位置比较,从小到大排序时,小就往前换位。
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
}
选择排序
从小到大排序时,找出最小值,换位。
for(int i=0;i<arr.length-1;i++){
int min=i;
for(int j=i+1;j<arr.length;j++){
if(arr[min]>arr[j]){
min=j;
}
}
if(min!=i){
a[i]=a[i]+a[min];
a[min]=a[i]-a[min];
a[i]=a[i]-a[min];
}
}
二分算法
是一种在有序数组中查找特定元素的搜索算法:
从数组中间元素开始,若不是要查找的元素,则在数组大于或小于中间元素的那一半查找,而且跟开始一样从中间元素开始比较。
-
递归
int search(int arr[], int low, int high, int target){ if(low > high) return -1; int mid = low + (high - low)/2; if(arr[mid] > target) return search(arr, low, mid-1, target); if(arr[mid] < target) return search(arr, mid+1, high, target); return mid; }
-
循环
int search(int arr[], int key){ int low = 0; int high = arr.length -1; int mid = -1; while(low<=high){ mid = low + (high - low) /2; if(a[mid] > key) high = mid -1; else if(a[mid]<key) low = mid +1; else return mid; } return -1; }