一、命名规范
包名:所有字母小写
类名,接口名:大驼峰 所有单词首字母大写
变量名,方法名:小驼峰 第一个单词首字母小写其余大写
常量名:所有字母大写
二、变量类型及其运算规律
1.基本数据类型
整数型 byte(1字节=8bit) short(2字节) int(四字节) long(8字节,声明时带l或L结尾)
浮点型 float double(声明时带f或F结尾)
字符型 char(只能一个字符=2字节 且通常用’ ‘单引号引)
布尔型 boolean
2.引用数据类型
3.自动类型提升
容量小的数据类型和容量大的数据类型做运算时,结果类型自动提升为容量大的数据类型
byte、char、short —> int —> long —> float —> double
特别的:byte、char、short 三者做运算时结果自动转为int
4.强制类型转换
可能会造成精度损失
double a = 12.3;
int i = int(a); // 截断操作 i = 12
5.String类型变量
String不是基本数据类型属于引用数据类型
声明String类型变量时用” “(双引号引)
String可以与其他基本数据类型做+号运算(链接运算)运算结果仍是String
三、不同进制的表示及转换方式
1.进制表示
二进制(binary)以0b或0B开头
>十进制(decimal)啊这,用不着开头,直接写
>八进制(octal)以数字0开头
>十六进制(hex)0-9 以及Aa Bb Cc Dd Ee Ff 以0x或0X开头 eg.0x21AE+1=0x21AF2.进制转换
二进制转十进制 啊这,阶乘,略
十进制转二进制 除2取余的逆(逐步剥离出来里面到底有几个2)
二进制转八进制和十六进制 八进制每三个一位 十六进制四个一位
综上四个进制的转换流程为:
↗—>八进制
十进制 —> 二进制 —> (二进制神!)
↘—>十六进制
庆幸的是我们的java库中也提供了进制转换函数(她真的,我枯死)
二进制 toBinary(int i)
八进制 toOctal(int i)
十六进制 toHex(int i)
3.原码、反码、补码三剑客
至于原码、反码、补码三剑客,引用我之前写的小文档解释,这里不加赘述。(无所谓
每日小结
1.标识符的命名规范有哪些?
包名:所有字母小写
类名,接口名:大驼峰 所有单词首字母大写
变量名,方法名:小驼峰 第一个单词首字母小写其余大写
常量名:所有字母大写
2.Java的8种基本数据类型和占用内存大小。
byte 1b short 2b int 4b long 8b
char 2b
float 4b double 8b
boolean 不考虑
3.基本数据类型自动类型提升的运算规则。
容量小的数据类型转化为容量大的数据类型
byte、char、short —> int —> long —> float —> double
特别的:byte、char、short 三者做运算时结果自动转为int
四、运算符的使用
1.算术运算符的注意点
byte、short、char变量自加及自减运算时:
仍会保持原类型不会自动类型提升
2.加练:取百、十、个位的算法
public class change(){public static void main(String[] arg){int num = 187;int bai = num / 100; // 整除100取百位int shi = num % 100 / 10; // 取余100获取十、个位int ge = num % 10; // 取余10获取个位// 直接整除可得前几位,直接取余可获得后几位}}
3.比较运算符
4.逻辑运算符的注意点
&逻辑且 |逻辑或 !非 ^异或
&&短路与 ||短路或
逻辑与短路的区别:
>相同点1:运算结果相同
>相同点2:左边符合条件时,都会继续判断右边
>不同点:左边就不符合条件时,&仍会判断右边,&&直接跳过
平常开发时经常用短路符
5.位运算符*
int i = 21;System.out.println(i>>2);
21二进制为10101,左移俩位补0,为10010100 相当于*22
同理>>右移空位补1
>>>右移空位补0
~取反
6.加练:互换两个数
public class change(){public static void main(String[] arg){// 定义两个数待交换int num1 = 10;int num2 = 20;// 定义临时变量,推荐int temp = num1;num1 = num2;num2 = temp;// 不用定义临时变量,但有可能相加溢出,且只能用于数值类型num1 = num1 + num2; // 求和num2 = num1 - num2; // 剥离出num1赋给num2num1 = num1 - num2; // 剥离出num2赋给num1}
7.三元(目也行)运算符
public class change(){public static void main(String[] arg){// 获取两个整数的较大值int m = 12;int n = 10;int max = (m > n)? m : n;System.out.println(max);// 改写if-elseif(m > n){System.out.println(m);}else{System.out.println(n);}// 以后能用三目运算符时就用}}
8.运算符的优先级
通常优先级由高到底的顺序依次是:
1 括号 ()
2 正负号 + -
3 一元运算符 ++,—, !
4 乘除 */ %
5 加减 + -
6 移位运算 >> <<
7 比较大小 < > >=
8 比较是否相等 == ,! =
9 按位与运算 &
10 按位异或运算 ^
11 按位异或运算 |
12 逻辑与运算 &&
13 逻辑或运算 ||
14 三元运算符 ?:
15 赋值运算符 =
每日小结
1.&和&&的区别
2.取三个数里的较大值
public class max(){public static void main(String[] arg){// 获取三个整数的较大值int x = 12;int y = 10;int z = 13;int tempmax = (x > y)? x : y;int max = (tempmax > z)? tempmax : z;}}
3.交换两个变量的实现
public class change(){public static void main(String[] arg){String hometown = "濮阳";String motherland = "祖国";//推荐交换方式String temp = hometown;hometown = motherland;motherland = temp;}}
五、流程控制
1.if-else结构使用
public class ifset(){public static void main(String[] arg){// 第一种ifif(条件表达式){执行表达式}// 第二种if 二选一if(条件表达式){执行表达式1}else{执行表达式2}// 第三种if 多选一if(条件表达式){执行表达式1}else if{执行表达式2}else if{执行表达式n}}}
2.使用Scanner从键盘获取数据
// 导入Scanner包import java.util.Scanner;public class ScannerTest{public static void main(String[] args){// 创建Scanner的实例化对象并赐名scanScanner scan = new Scanner(System.in);int score = scan.nextInt();System.out.println(score);/**scan.next() // 获取字符串*scan.nextInt() // 获取整数*scan.nextDouble() // 获取双浮点数*scan.nextBoolean() // 获取布尔值*/}}
3.swich-case结构使用
/**根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行*其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止*break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构*break,记得加,大多数可能会出事儿(不排除少数情况...*switch后的表达式只能是byte short int String 枚举类型*case 之后只能声明常量。不能声明范围。*/public class SwitchCaseTest(){public static void main(String[] arg){int num = 3;switch(num){case 0:System.out.printlln("zero");break;case 1:System.out.printlln("one");break;case 2:System.out.printlln("two");break;case 3:System.out.printlln("three");break;default:System.out.printlln("other");break;}}}
4.for循环结构使用
public class ForTest{public static void main(String[] args){// 输出5次Hello,world!for(int i = 1;i <= 5;i++){System.out.println("Hello,world!");}// 练习 输出结果acbacbacbacint num = 1;for(Sytem.out.println("a");num <= 3;Sytem.out.println("b"),num++){Sytem.out.println("c");}}}
5.加练:取最大公约数和最大公倍数
public class Test{public static void main(String[] args){int m = 100;int n = 999;// 公约数思路:取两者中较小值,自其开始循环递减,并做判断取余为0操作int min = (m < n)? m : n;// 下限为1for(int i = min;i >= 1;i--){if(m % i == 0 && n % i == 0){System.out.println(i);break;}}// 公倍数思路:取两者中较大值,自其开始循环递增,并做判断取余为0操作int max = (m > n)? m : n;// 上限为m * nfor(int i = min;i <= m * n;i--){if(i % m == 0 && i % n == 0){System.out.println(i);break;}}}}
6.while循环结构使用
// 输出5次Hello,world!public class Test{public static void main(String[] args){int i = 1;while(i <= 5){System.out.println("Hello,world!");i++; // 千万不要忘记迭代条件造成死循环}}}
6.do-while循环结构使用
// 输出5次Hello,world!public class Test{public static void main(String[] args){int i = 1;// 不论如何至少执行一遍 可类比为先去买,买完在判断够不够do{System.out.println("Hello,world!");i++; // 千万不要忘记迭代条件造成死循环}while(i <= 5)}}
7.while(true)结构使用
import java.util.Scanner;// 题目:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序public class Test{public static void main(String[] args){Scanner scan = new Scanner(System.in);int positive=0;int negative=0; // 记录正负数个数while(true){int num = scan.nextInt();if(num < 0){negative++;}else if(num > 0){positive++;}else{break;}}}}
8.★★★嵌套循环(必看!)★★★
输出特定图形
public class Test{public static void main(String[] args){/*输出:i行 j列***** 1 5***** 2 5***** 3 5***** 4 5***** 5 5*/// 外层循环控制行数,内存循环控制列数for(int i = 1;i <= 5;i++){for(int j = 1;j <= 5;j++){System.out.print("*");}System.out.print("\n");}/*输出:i行 j列* 1 1** 2 2*** 3 3**** 4 4***** 5 5*/// 外层循环控制行数,内存循环控制列数for(int i = 1;i <= 5;i++){for(int j = 1;j <= i;j++){System.out.print("*");}System.out.print("\n");}/*输出:i行 j列***** 1 5**** 2 4*** 3 3** 4 2* 5 1*/// 外层循环控制行数,内存循环控制列数for(int i = 1;i <= 5;i++){for(int j = 1;j <= 6 - i;j++){System.out.print("*");}System.out.print("\n");}}}
好了,你已经出师了,自行尝试写一下NineNineTable吧!
public class NineNineTable{public static void main(String[] args){/* i行 j列1*1=1 1 11*2=2 2*2=4 2 2... . .1*9=9 2*9=18... 9 9*/// 输出九九乘法表for(int i = 1;i <= 9;i++){for(int j = 1;j <= i;j++){System.out.print(j + "*" + i + "=" + i*j + " ");}System.out.print("\n");}}}
输出质数的方式:
public class Test{public static void main(String[] args){// 输出100以内的质数 最小的质数为2Boolean is_flag = true; // 定义一个布尔判断是否为质数,不能丢到循环里,有重复定义消耗内存for(int i = 2;i <= 100;i++){// 排除1和他本身for(int j = 2;j < i;j++){if(i % j == 0){is_flag = false;break; // 有一个就可以停了}}if(is_flag == true){System.out.println(i);}is_flag = true; // 重置状态}}}
阶段项目一(待填坑)
模拟实现一个基于文本界面的《家庭记账软件》掌握初步的编程技巧和调试技巧
public class FamilyAccount(){public static void main(String[] args){//学到面向对象再填坑}}六、数组
1.概述
1)数组是有序排列的
2)数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型
3)创建数组对象会在内存中开辟一整块连续的空间
4)数组的长度一旦确定,就不能修改2.声明、赋值、引用与遍历
```java public class Test { public static void main(String[] args) { // 声明 String[] names = new String[5]; // 赋值 names[0] = “名字1”; names[1] = “名字2”; names[2] = “名字3”; names[3] = “名字4”; names[4] = “名字5”; // 属性length System.out.println(names.length); // 遍历数组 for(int i = 0;i< names.length;i++){ System.out.println(names[i]); } } }
<a name="kzHu6"></a>### 3.借用数组解释内存的简单结构(了解)`int[] arr = int[]{1,2,3};`<br />`String[] arr1 = new String[4];` <br /><a name="hfMJC"></a>### 4.关于租房数组小练习升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。```javapublic class Test {public static void main(String[] args) {// 结果为18013820100 试着 自行分析int[] arr = new int[]{8,2,1,0,3};int[] index = new int[]{2,0,3,2,4,0,1,3,2,3,3};String tel = "";for(int i = 0;i < index.length;i++){tel += arr[index[i]];}System.out.println("联系方式: " + tel);}}
5.二维数组声明、赋值、引用和遍历
public class Test {public static void main(String[] args) {// 二维数组的声明及赋值int[][] arr = new int[][]{{1,2,3},{4,5,6}};String[][] arr1 = new String[3][2];// 二维数组调用(借用矩阵了解)System.out.println(arr[0][0]); // 第1行第1列 为1System.out.println(arr[1][2]); // 第2行第3列 为6// 二维数组遍历(借用嵌套循环理解)for(int i = 0;i < arr.length;i++){for(int j = 0;j < arr[i].length;j++){System.out.println(arr[i][j]);}}}}
6.杨辉三角小练习
public class Test {public static void main(String[] args) {/*使用二维数组打印十行的杨辉三角提示:1.行有1个元素,第n行有n个元素2.每1行的第1个元素和最后一个元素都是13.从第三行开始,对于非第一个元素和最后一个元素的元素。即:yanghui[i][i] =yanghui[i-1][j-1] + yanghui[i-1][j];*/// 声明数组的第一维 即10行int[][] yanghui = new int[10][];// 开始赋值for(int i = 0;i < yanghui.length;i++){// 确认第二维的数组储存数据个数 对应提示1yanghui[i] = new int[i+1];// 赋予首位、末位元素初值 对应提示2yanghui[i][0] = yanghui[i][i] = 1;// 为中间元素赋值 对应提示3for(int j = 1;j < yanghui[i].length - 1;j++){yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];}}// 遍历for(int i = 0;i < yanghui.length;i++){for(int j = 0;j < yanghui[i].length;j++){System.out.print(yanghui[i][j] + "\t");}System.out.println();}}}
7.类似C语言的数组名称含义(即第一个元素的地址指针)
public class Test {public static void main(String[] args) {int[] array1,array2;array1 = new int[]{1,2,3,4,5,6};// 输出array1内容 为123456for(int i = 0;i < array1.length;i++){System.out.print(array1[i]);}System.out.println();// 将数组1的名字赋给数组2array2 = array1;// 在数组2更改值array2[0] = 3;// 再次输出array1内容 发现变为323456for(int i = 0;i < array1.length;i++){System.out.print(array1[i]);}}}
8.数组复制
public class Test {public static void main(String[] args) {int[] array1 = new int[]{1,2,3,4,5};// 创建备份数组,且长度相等int[] beifen = new int[array1.length];// 遍历原数组并赋给备份数组for(int i = 0;i < array1.length;i++){beifen[i] = array1[i];}// 遍历备份数组for(int i = 0;i < beifen.length;i++){System.out.print(beifen[i]);}}}
9.数组反转
方法一:一个变量i两边用
public class Test {public static void main(String[] args) {int[] array1 = new int[]{1,2,3,4,5};// 方法一 一个变量i两边用for(int i = 0;i < array1.length / 2;i++){int temp = array1[i];array1[i] = array1[array1.length -1 - i];array1[array1.length -1 - i] = temp;}// 遍历输出数组for(int i = 0;i < array1.length;i++){System.out.print(array1[i]);}}}
方法二:两个变量i,j两头一起进军
public class Test {public static void main(String[] args) {int[] array1 = new int[]{1,2,3,4,5};// 方法一 两个变量i,j两头一起进军,判断条件很巧妙建议细品for(int i = 0,j = array1.length - 1;i < j;i++, j--){int temp = array1[i];array1[i] = array1[j];array1[j] = temp;}// 遍历输出数组for(int i = 0;i < array1.length;i++){System.out.print(array1[i]);}}}
10.数组算法-线性查找
public class Test {public static void main(String[] args) {// 线性查找String[] names = new String[]{"Tom", "Andy", "Angel", "Zack"};String destination = "yao_miao";boolean is_flag = false; //不用旗子的话 也可以判断i的次数// 遍历数组判断for(int i = 0;i < names.length;i++){if(destination.equals(names[i])){System.out.println("找到了索引为" + i);is_flag = true;break;}}if(!is_flag){System.out.println("没找到捏");}}}
11.数组算法-二分法
public class Test {public static void main(String[] args) {// 二分法查找 前提:数组为有序int[] array = new int[]{-94, -88, -50, -22, 2, 5, 9, 25, 50, 66};int destination = 25;// 设置数组索引的前后边界int min = 0;int max = array.length - 1;// 小旗子boolean is_flag = false;// 二分法循环体while(min < max){int middle = (min + max) / 2;if(destination == array[middle]){System.out.println("找到了索引为" + middle);is_flag = true;break;}else if(destination < array[middle]){max = middle - 1;}else if(destination > array[middle]){min = middle + 1;}}if(is_flag == false){System.out.println("没找到捏");}}}
12.数组算法-冒泡排序
public class Test {public static void main(String[] args) {int[] array = new int[]{10,56,34,4,68,214,65,-325,545,4};int temp;// 开始冒泡 外层为length-1轮 内存为每个元素比较 lenth-1-i轮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]){temp = array[j];array[j] = array[j+1];array[j+1] = temp;}}}// 遍历输出数组for(int i = 0;i < array.length;i++){System.out.print(array[i] + ",");}}}
每日小结
1.一维数组初始化的两种方式
int[] arr = new int[5]; // 动态初始化String[] arr1 = new String[]{"Tom","Andy","Angel"}; // 静态初始化
2.二维数组初始化的两种方式
int[][] arr1 = new int[4][3]; // 动态初始化1int[][] arr2 = new int[4][]; // 动态初始化2String[] arr3 = new String[][]{{"蕾姆","漂亮"},{"亚里亚","suki"},{"嘉然","然然你带我走吧,然然,你带我走吧"}}; // 静态初始化
3.如何遍历以下二维数组
int[][] arr = new int[][]{{1,2,3},{4,5,6}};
见上……
4.不同类型的一维数组元素的默认初始化值
int 0
double 0.0
char 0
boolean false
引用类型 null
5.各种查找的算法和排序算法
见上……
