JAVA基础编程总结
比特(bit)和字节(byte)
比特(bit): 一个0或者一个1存储为一个比特(bit),是计算机最小的存储单位
字节(byte): 字节是计算机中最基本的存储单元
一个byte由8个bit构成
千字节B=1024B 兆字节KB=1024KB 千兆节MB=1024MB 万亿字节TB=1024GB
Java文件的执行过程
- 通过javac对java文件进行编译
- 通过java命令对生成的class文件进行运行
-
一个java源文件中可以声明多个class,但是,只能最多有一个类声明为public,而且要求声明为public的类的类名必须与源文件名相同
-
程序的执行入口是main()方法
public class Hello{ public static void main(String[] args){ System.out.println("Hello,world!") } }
注释
-
单行注释
//单行注释,使用双斜线
-
多行注释
/* 多行注释,多行注释之间不可嵌套使用 单行注释与多行注释的作用: 1.对所写的程序进行解释说明,增强代码的可读性。 2.调试所写的代码 3.单行注释与多行注释所注释的内容不参与编译。即编译后生成的.class文件不包含单行与多行注释 */
-
文档注释(java特有)
/** 所注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档 @author @version */
基本语法
关键字和保留字
-
关键字(keyword)
被Java语言赋予了特殊含义,用作专门用途的字符串(单词)
-
保留字
Java现有版本尚未使用,但以后版本可能会作为关键字使用,自己命名标识符时要避免使用这些保留字(goto 、 const)
标识符
命名规则
- 由26个英文字母大小写,0-9,_或$组成
- 不可以以数字开头
- 不可以使用关键字和保留字,但可以包含关键字和保留字
- java中严格区分大小写,长度无限制
- 标识符不能包含空格
命名规范
- 包名:多单词组成时,所有字母都小写 xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写 XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写 xxxYyyZzz
- 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
变量
- 概念
- 是内存中的一个存储区域
- 该区域的数据可以在同一类型范围内不断变化
- 变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值
- 作用
- 用于在内存中保存数据
- 使用的注意事项
- 先声明再使用
- 使用变量名来访问该区域的数据
- 变量的作用域:其定义所在的一对{}内
- 变量只有在其作用域中有效
- 同一作用域内,不能定义重名的变量
在一个类中,根据声明变量时位置的不同,分为成员变量和局部变量,定义成员变量未赋值则会自动初始化值,而成员变量(方法中定义的变量)不会
数据类型
基本数据类型(共8种)
- 数值型(整形常量:默认类型为int、浮点型常量:默认类型为double)
- 整数类型(byte、short、int、long)(声明long类型变量必须以"l"或"L"结尾,声明float类型变量必须以"f"或"F"结尾)
- 浮点类型(float、double)
- 字符型(char)
- 布尔型(boolean)
引用数据类型
- 类(class)字符串是引用数据类型
- 接口(interface)
- 数组( [] )
基本数据类型之间的运算规则
-
自动类型提升:
容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型
byte、char、short–>int–>long–>float–>double==(byte、char、short三种变量类型之间做运算时,结果为int类型,java在做运算时,如果操作数均在int范围内,那么一律在int的空间内运算)==
-
强制类型转换:使用强转符(),强制转换会造成精度损失
String类型变量的使用
- String属于引用数据类型
- 声明String类型变量时,使用一对""
- String可以和8中基本数据类型变量做运算,且运算只能时连接运算:+,运算结果仍然是String类型
运算符
算数运算符
+ - * / % ++ –
/ : 除数与被除数进行运算后的结果取决于,两者之间的数据类型的容量,结果自动提升到容量更大的数据类型
% : 结果的符号与被模数的符号相同,经常使用%来判断能否被除尽的情况
a++与++a :a++先运算后自增 ++a先自增后运算(–与之相同)
自增与自减1不会改变本身的数据类型,所以运算中使用++或–效率更高
赋值运算符
当 =
两侧的数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理
支持连续赋值
int i=10,j=20;
int i1,j1;
i1=j1=10;
扩展赋值运算符:+=、-=、*=、/=、%=
使用扩展赋值运算符不会改变本身的数据类型
比较运算符(关系运算符)
== != < > <= >= instanceof(检查是否是类的对象)
逻辑运算符
&(逻辑与) |(逻辑或) !(逻辑非)^(逻辑异或,不同则为true,相同则为false)
&&(短路与,a&&b,a为false时,b不执行运算) ||(短路或,a||b,a为true时,b不执行运算)
开发中推荐使用短路与和短路或
位运算符
<<(左移)>>(右移) >>>(无符号右移) &(与运算) |(或运算) ^(异或运算) ~(取反运算)
-
位运算符操作的都是整型的数据
-
<<:在一定范围内,每向左移1位,相当于 * 2
>> :在一定范围内,每向右移1位,相当于 / 2
面试题:最高效的计算2 * 8 2<<3 或 8>>1
>>> :无符号右移,无论最高位是0或1,空缺位都补0
//练习:交换两个变量的值(利用异或运算,只适用于数值类型) int num1 = 10; int num2 = 20; //m = ( m ^ n ) ^ n num1 = num1 ^ num2; num2 = num1 ^ num2; num1 = num1 ^ num2;
三元运算符
(条件表达式)?表达式1 : 表达式2;
程序流程与控制
顺序结构、分支结构(if-else 、switch)、循环结构(for 、while、do-while)
当使用多层循环,可以给外层循环写一个标记,break可以直接跳出被标记的那层循环,continue亦是如此
数组
数据结构
-
数据与数据之间的逻辑关系:集合、一对一、一对多、多对多
-
数据的存储结构:
线性表:顺序表(例:数组)、链表、栈(先进后出)、队列(先进先出)树形结构:二叉树
图形结构
数组一旦初始化,其长度就是确定的;数组长度一旦确定,就不可修改
二维数组元素默认的初始化值
-
int[][] arr = new int[4][3]; 外层元素:arr[0],arr[1]等 内层元素:arr[0][0],arr[1][2]等
-
针对于初始化方式一:int[][] arr = new int[4][3]; 外层元素的初始化值为:地址值 内层元素的初始化值为:与一维数组初始化情况相同 针对于初始化方式二:int[][] arr = new int[4][]; 外层元素的初始化值为:null 内层元素的初始化值为:不能调用,否则报错。
数组中涉及的常见算法
-
数组元素的赋值(杨辉三角、回形数等)
-
求数值型数组中元素的最大值、最小值、平均数、总和等
import java.util.Arrays; public class ArrayTest1 { public static void main(String[] args) { int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { arr[i] = (int)(Math.random()*(99-10+1)) + 10; } System.out.println("数组为:"+Arrays.toString(arr)); //求数组元素最大值 int maxValue = arr[0]; for (int i = 1; i < arr.length; i++) { if (maxValue<arr[i]){ maxValue = arr[i]; } } System.out.println("最大值为:"+maxValue); //求数组元素的最小值 int minValue = arr[0]; for (int i = 1; i < arr.length; i++) { if (minValue>arr[i]){ minValue = arr[i]; } } System.out.println("数组元素最小值为:"+minValue); //求数组元素总和与平均值 int sum=0; for (int i = 0; i < arr.length; i++) { sum+=arr[i]; } System.out.println("数组元素总和为:"+sum); System.out.println("数组元素平均值为:"+sum/(arr.length+0.0)); } }
-
数组的复制、反转、查找(线性查找、二分法查找)
import java.util.Arrays; public class ArrayTest2 { public static void main(String[] args) { int[] arr1,arr2; arr1 = new int[]{2,3,4,5,7,11,13,17,19}; System.out.println(Arrays.toString(arr1)); //数组的复制 arr2 = new int[arr1.length]; for (int i = 0; i < arr2.length; i++) { arr2[i] = arr1[i]; } System.out.println(Arrays.toString(arr2)); //数组的反转 //方式一 for (int i = 0; i < arr2.length/2; i++) { int temp = arr2[i]; arr2[i] = arr2[arr2.length-i-1]; arr2[arr2.length-i-1] = temp; } System.out.println(Arrays.toString(arr2)); //方式二 for(int i=0,j=arr2.length-1;i<j;i++,j--){ int temp = arr2[j]; arr2[j] = arr2[i]; arr2[i] = temp; } System.out.println(Arrays.toString(arr2)); //查找 //线性查找 String[] strs = {"A", "b", "c", "D"}; String dest = "c"; for (int i = 0; i < strs.length; i++) { if (dest.equals(strs[i])){ System.out.println(i); break; } } //二分法查找,前提:所查找的数组必须有序 int[] ints = {-10, -3, 0, 7, 9, 20, 50}; int dest1 = 20;//目标值 int head = 0;//初始首索引 int end = ints.length-1;//初始末索引 while (head<=end){ int middle = (head + end)/2; if (dest1 == ints[middle]){ System.out.println(middle); break; }else if (ints[middle]>dest1){ end = middle - 1; }else { head = middle + 1; } } } }
-
数组元素的排序算法
冒泡排序:
import java.util.Arrays; public class BubbleSort { public static void main(String[] args) { int[] ints = {1, 7, 3, 2, 67, 23, 1}; bubbleSort(ints); System.out.println(Arrays.toString(ints)); } //冒泡排序 public static void bubbleSort(int[] array){ for (int i = 0; i < array.length-1; i++) { for (int j = 0; j < array.length-1-i; j++) { if (array[j]>array[j+1]){ int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } } }
公式:获取[a,b]范围内的随机数:(int)(Math.random() * (b-a+1)) + a
Arrays工具类(封装了排序、二分查找、复制、反转等静态方法
虚拟机
- 虚拟机栈,即为平时提到的栈结构。
将局部变量存储在栈结构中
- 堆,将new出来的结构(例如:数组、对象)加载在堆空间中。补充:
对象的属性(非static的)加载在堆空间中
- 方法区:类的加载信息、常量池、静态域