java基础汇总
本遍主要是记录下最近复习java基础的一些情况。
什么是java?
java语言是美国Sun公司(Stanford University Network),在1995年推出的高级编程语言。
编程语言:是计算机的语言,人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能。
java发展史
1991.4 Sun公司成立Green项目小组(James Gosling),开发出Oak橡树语言
1995.5 Oak更名为java,提出'Write One,Run Anywhere'的口号
1996.1 JDK1.0发布,代表技术包括:Java虚拟机,Applet,Awt等
1997.2 JDK1.1发布
1998.12 JDK1.2 Playground发布,分为J2SE,J2EE和J2ME三大版本
2006.11 JavaOne大会,Sun公司宣布将Java开源
2006.12 JDK6 Mustang发布
2009.4 Oracle收购Sun
2014.3 Oracle发布JDK8
java 版本的介绍
JavaSE(Java Platform Standard Edition):可以理解为JavaSE是java的基石,如果将java程序想像成一座大厦,那么javaSE就是地基,它是学习整个java需掌握的基础;
JAVAEE(Java Platform Enterprise Edition):是Sun公司为企业级应用退出的标准平台,用来开发大型企业级的应用系统;
JavaME(Java Platform Micro Edition):是为机顶盒,移动电话和PDA之类嵌入式消费电子设备提供java语言平台,包括虚拟机和一系列标准化的Java API;目前已经不使用了;
Java特点
简单
跨平台
面向对象
JVM,JDK,JRE三者的解释
JVM(Java Virtual Machine):Java 虚拟机,简称JVM,是运行所有java程序的假想计算机,是Java程序的运行环境,是Java最具吸引力的特性之一。编写的java代码都运行在JVM之上。
JDK(Java Develpment Kit):是Java程序开发工具包,包含JRE和开发工具;
JRE(Java runtime Environment):是Java程序的运行时环境,包含JVM和运行时所需的核心类库。
Java代码编译与执行
java文件通过JRE编译后成class字节码文件,再到装有JVM虚拟机的各平台执行(Windows,Unix,Mac OS,Ohters)。
Java执行原理
Java源文件-->class字节码文件-->jvm-操作系统
编译期:通过javac命令把java源代码编译成class字节码文件
运行期:通过命令启动JVM,JVM加载class文件,运行class文件
类
一个java文件,里面可以有多个类,但是只能有一个public修饰的类,并且public修饰的类的名称,必须跟文件名完全一样;
一类中,只能出现一个主函数(main方法),但是可以出现多个其它函数,每个类都可以有自己的主函数,若有多个,执行的时候,会让你选择要执行的主函数;
一个java文件编译后,里面的每个类都会编译成单独的class文件;
包
语法:package包名;
位置:必须位于java文件的第一行;
作用:类似于文件夹,用来分类管理代码和字节码文件的;
起名规则:使用域名倒置的写法;
Java 数据类型和运算符
变量:是内存中的一小块区域,使用变量名来访问这这块区域。即程序执行中数据可变的数据。
Java变量使用前必须先声明和初始化(赋初值)
变量声明语法格式:数据类型 变量名[=值];
java是强类型语言,所有的变量必须有数据类型。
变量作用域:某个变量有效的范围称为作用域范围,在这个作用域内,该变量可以随时使用以及重复赋值,但是不能再次声明,超过这个范围,变量会被垃圾回收进行回收掉。
变量分类:全局变量,局部变量,常量和直接量
标识符
在程序中,定义的各种名字,比如类的名字,方法的名字和变量的名字等等,都是标识符。
标识符的命名规则:
由大小英文字母,数字,下划线和$组成
不能以数字开头
不能是关键字
标识符的命名规范:
类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)
方法名规范:首字母小写,后面每个单词首字母大写(小驼峰式)
变量名规范:全部小写
关键字
指程序中,Java已经定义好的单词,具有特殊含义。
Java数据类型:基本数据类型,引用数据类型
基本数据类型:整数,小数,布尔,字符
引用数据类型:字符串,数组,对象
8种数据类型
整数
类型 | 字节 | 取值范围 | 取值范围 |
---|---|---|---|
byte | 1字节 | -2^7 ~ 2^7-1 | -128 ~127 |
short | 2字节 | -2^15 ~ 2^15-1 | -32768 ~ 32767 |
int | 4字节 | -2^31 ~ 2^31-1 | -2147483648 ~ 2147483647 |
long | 8字节 | -2^63 ~ 2^63-1 | -9223372036854775808 ~ 9223372036854775807 |
浮点数
类型 | 字节 | 负数取值范围 | 正数取值范围 |
---|---|---|---|
float | 4字节 | -3.4E+38 ~ -1.4E-45 | 1.4E-45 ~3.4E+38 |
double | 8字节 | -1.7E+308 ~ -4.9E-324 | 4.9E-324 ~ 1.7E+308 |
布尔
类型 | 字节 | 取值范围(无符号数) | 字节编码 |
---|---|---|---|
char | 2字节 | 0 ~ 65535 | Unicode字符集 |
转义字符
转义字符 | 描述 |
---|---|
\n | 换行符 |
\t | 缩进(制表位) |
\ | 反斜线 |
' | 单引号 |
" | 双引号 |
类型转换
自动转换,强制转换;同类型转换;不同类型转换;整形转字符;
运算符
算术运算符:2个数的运算:+加 -减 *乘 /除 %求余
一个数的运算:++加加,--减减
比较运算符:是两个数据之间进行比较的运算,运算结果都是布尔值true或false。
操作符 | 描述 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
逻辑, 三元运算符
逻辑运算符:是用来连接两个布尔类型结果的运算符,运算结果都是布尔值true或者false。
操作符 | 语义 | 描述 |
---|---|---|
&& | 与(并且) | 两个操作数,同时为真,结果为真 |
|| | 或 (或者) | 两个操作数,有一个为真,结果为真 |
! | 非 (取反) | 不是,真即是假,假即是真 |
三元运算符(三目运算符):先判断后处理
操作符 | 语义 | 描述 |
---|---|---|
? : | 布尔表达式?结果1:结果2 | 当表达式结果为真,获得结果1,当表达式结果为假,获得结果2 |
java数组
1.容器
将多个不同的数据存储在一起,这个存储这些数据的地方。容器里的每个数据称该容器的元素。
常见容器:java容器分为 数组 和 集合。
2.数组
存储指定数据长度的容器,并且保证数组里的数据的数据类型要一致。
数组初始化
静态初始化
数组在定义出来就是有数据的,在后期很少进行更改的初始化
定义的方式
数据类型 [] 数组名 = new 数据类型[]{元素1,元素2,...};
数组的长度定义出来不能更改。
动态初始化
数组在定义的时候,往往还无法确定里面的元素以及数组的大小,所以只是定义了元素的类型和长度,在具体的业务逻辑中进行扩容及元素的赋值
定义方式
数据类型 [] 数组名 = new 数组存储的数据类型[长度];
数组的访问
数组的长度
每个数组都具有长度而且是固定的,java中赋予了数组一个属性,可以获取到数组的长度:数组名.length,属性length的执行结果是数组的长度,int类型结果。即数组的最大索引值为数组名.lenth-1 。
索引
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
数组的访问和赋值
数组的访问: 变量 = 数组名[索引],获取出数组中的元素
数组的赋值: 数组名 [索引] = 数值,为数组中的元素赋值
遍历
将容器中的每个元素分别获取出来,遍历方式往往使用for循环或者是forearch循环。
foreach 遍历
for(元素类型 变量名: 要遍历的容器对象){
变量名就是容器中的元素
}
foreach循环特点:必须从头循环到尾,没有 i 作为下标进行操作,所以整体循环的速度比 for 循环快,但是灵活性不如for循环
数组排序
选择排序
选择排序的工作原理是把一个数组中的所有元素分成两部分,一部分为被比较元素,一部分为比较元素,然后不断的拿着比较的元素来逐一跟被比较元素进行比较,如果比 被比较的小,则调换位置,比较完一轮之后,可以拿到最小值,然后把元素下标往前移动一位继续进行比较,直到完成排序.
Java代码的实现
/**
* 选择排序
* 外层:比较元素的移动轨迹,从0到倒数第二个
* 内层:被比较元素的移动轨迹,从i+1到最后一个
*/
public static void choiceSort(){
int [] arr = {3,1,6,4,5,2,7,9,8};
System.out.println(Arrays.toString(arr));
for (int i=0;i<arr.length;i++){
for (int j=i+1;j<arr.length;j++){
//元素交换
if (arr[i]>arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
冒泡排序
它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾;采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前;重复此操作,直到整个数列都有序为此。
/**
* 冒泡排序
* 外层:元素比较的轮数,需要完成多少次大的轮回才能获得最终的排序结果:0~length-1
* 内层:两两元素比较的轨迹,0~length-1-i
*/
public static void bubbleSort(){
int [] arr = {3,1,6,4,5,2,7,9,8};
System.out.println(Arrays.toString(arr));
for (int i=0;i<arr.length-1;i++){
for (int j=0;j<arr.length-1-i;j++){
//元素交换
if (arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
十大经典排序算法
https://www.runoob.com/w3cnote/ten-sorting-algorithm.html
Java API
API(Application Programming Interface)应用程序编程接口,Java API 是一本程序员字典,是JDK中提供给我们使用的类的说明文档。
jdk1.8官方文档
https://docs.oracle.com/javase/8/docs/api

常用的类
Math类
包含执行基本数学运算的方法,如指数,对数,平方根和三角函数
Math类中的常量
static double E:比任何其他值都更接近e的double值。
static double PI:比任何其他值都更接近PI的double值。
Math类中的常用方法:
abs:求绝对值
floor:去掉小数位
round:去掉小数位(四舍五入)
random:求随机数
System类
包含一些有用的类字段和方法。它不能被实例化。
System类中的常量
err:错误输出流
in:输入流
out: 输出流
System类中常用方法
exit : 退出程序
arrarycopy :数组复制
currentTimeMillis() : 获取当前的时间ms,1970,时间戳
Arrays类
包含用来操作数组(排序和搜索)的各种方法
Arrays类中常用的方法
binarySearch:使用二分查找指定的元素在数组中的位置
copyOf:数组复制
equals:数组中的内容是否相同
fill:把数组里面的元素填充指定的内容
sort: 数组的排序
toString:把数组里面的内容按照指定格式输出
数组的复制
通过Arrays类
Arrays.copyOf(Object[] original, int newLength);
Arrays.copyOfRange(Object[] original, int from, int to);
通过System类
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
Arrays和System这两种复制的区别:
1.Arrays里的复制方法底层是System的复制,在System基础上封装,变得更加方便使用;
2.Arrays完成复制之后,会把新数组返回,而System则需要你提前定义好一个数组;
深复制和浅复制
深复制
不仅复制外层容器,还复制了容器里面的所有元素,常用的深层复制方式是使用IO流中的序列化和反序列化,效率低,只适合一些特殊场合。
浅复制
只复制最外层容器,而不复制容器里面的元素,Java API中所有的复制都是浅层复制,浅层复制的效率快,能适用大部分场景。