常用的转义字符
\n 回车
\t 制表符
\b 退格
\r 按下回车键
windows系统中回车符其实是由两个符号组成的\r\n
linux中回车符是\n
函数
什么是函数
函数就是定义在类中的具有特定功能的一段独立小程序
函数也称为方法
定义函数的格式
修饰符 返回值类型 函数名(参数类型 形参2,参数类型 形参2,...) //函数名有多个单词时,第一个单词小写,后面的单词首字母大写
{
执行语句;
return 返回值;
}
特殊情况:
功能没有具体的返回值。 这时,retrun的后面直接用分号结束,因为没有具体值,所以不可以写具体的数据类型,
在java中只能用一个关键字void来表示这种情况。
注意:如果返回值类型为void,那么函数中的return语句可以省略不写。
特点:
1.定义函数可以将功能代码进行封装
2.便于对该功能进行服用
3.函数只有被调用才会被执行
4.函数的出现提高了代码的复用性
注意:
函数中只能调用函数,不能在函数内部定义函数。
定义函数时,函数的结果应该返回给调用者,交由调用者处理。
class FunctionDemo3 { public static void main(String[] args) { System.out.println(add(4,5)); draw(7,9); System.out.println(equals(5,6)); System.out.println(getMax(4,5)); } /* 需求1:定义一个功能,完成两个整数的和的获取 思路:既然定义功能,就是可以用函数来体现 如何定义一个函数? 通过两个明确来完成 明确1:这个功能的结果是什么? 是两个整数的和,是功能的结果,所以该功能的返回值类型是int 明确返回值的类型。 明确2:这个功能实现过程中是否需要未知内容参与运算? 需要加数和被加数。 这就是函数的参数列表(参数的个数,参数的类型) 明确参数列表 注意:返回值类型和参数类型没有直接关系 */ public static int add(int a,int b) { return a+b; } /* 需求2 定义一个功能,在控制台画一个矩形 明确1:这个功能的结果是什么?没有结果,直接打印到控制台 明确2:这个功能实现过程中是否需要未知内容参与运算? 行和列不确定,需要两个整数int */ public static void draw(int row,int col) { for (int x=1;x<=row ;x++ ) { for (int y=1;y<=col ;y++ ) { System.out.print("*"); } System.out.println(); } } /* 需求3 定义一个功能,比较两个数是否相等 明确1:这个功能的结果是什么?有结果,true或false,返回值为boolean 明确2:这个功能实现过程中是否需要未知内容参与运算? 两个数不确定,需要两个整数int */ public static boolean equals(int a,int b) { /* if(a==b) return true; else return false; */ return a==b;//a==b,本身是在进行比较运算,结果是true或false,不要要是用(a==b)?true:false } /* 需求4 定义一个功能,获取两个整数中较大的那个数 明确1:这个功能的结果是什么?有结果,返回较大的整数 明确2:这个功能实现过程中是否需要未知内容参与运算? 参与比较的数不确定,需要两个整数int */ public static int getMax(int a,int b) { return (a>b)?a:b; } }
函数的重载(overload)
重载的概念
在同一个类中,允许存在一个以上的同名名称,只要他们的参数个数或者参数类型不同即可。
重要特点
与返回值类型无关,只看参数列表
class FunctionDemo4 { public static void main(String[] args) { System.out.println(add(1.2,2.5)); printCFB(5); printCFB(); } /* 函数的重载 1.同一个类 2.同名 3.参数个数不同或参数类型不同 4.函数重载和返回值类型无关 5.java是严谨性语言,如果函数出现调用的不确定性,会编译失败 */ //加法运算,两个整数的和 public static int add(int a,int b) { return a+b; } //加法运算,两个小数的和 public static double add(double a,double b) { return a+b; } //加法运算,三个整数的和 public static int add(int a,int b,int c) { return a+b+c; } /* 打印乘法表 */ public static void printCFB(int num) { for (int x=1;x<=num ;x++ ) { for (int y=1; y<=x;y++ ) { System.out.print(y+"*"+x+"="+y*x+"\t");//使用制表符'\t'能够实现输出时对齐 } System.out.println(); } } /* 打印标准乘法表 */ public static void printCFB() { printCFB(9); } }
数组(引用数据类型)
概念:同一种类型数据的结合,其实数组就是一个容器
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素
格式1
元素类型[] 数组名=new 元素类型[元素个数或数组长度];
int[] arr=new int[5]
格式2
元素类型[] 数组名=new 元素类型[] {元素,元素,……};
int[] arr=new int[]{3,5,1,7};
int[] arr={3,5,1,7};
内存的划分
1.寄存器
2.本地方法区
3.方法区
4.栈内存
存储的都是局部变量(程序运行时,方法要进栈,否则,局部变量无法进栈)。
而且变量所属的作用域一旦结束,该变量就自动释放
5.堆内存
存储的是数组和对象(其实数组就是对象);凡是new建立的,都在堆中
特点:
1.每一个实体都有首地址值
2.堆内存中的每个变量都有默认初始化值,根据类型的不同而不行(整数是0,小数是0.0或0.0f,boolean是false,char'\u0000')
3.垃圾回收机制
arr不做任何实体指向,则arr=null;//数组arr为空,所有元素的值都为默认初始化值
int[] x=new int[3];//假设首地址为0x0034,数组内元素为x{0,0,0}
int[] y=new int[3];//假设首地址为0x0087,y{0,0,0}
x[0]=9;//x{9,9,9}
y[0]=34;//x{34,0,0}
x=y;//首地址变为0x0087,x{34,0,0}
多个数组变量可以指向同一个实体。
class ArrayDemo { public static void main(String[] args) { //元素类型[] 数组名=new 元素类型[元素个数或数组长度]; int[] arr=new int[3]; arr[0]=89; System.out.println(arr[0]); } }
数组
数组的遍历
class ArrayDemo3 { public static void main(String[] args) { /* 需要一个容器,但是不明确容器的具体数据 */ //int[] arr=new int[3]; /* 需要一个容易,存储已知的具体数据 */ //int[] arr=new int[]{89,34,270,17}; int[] arr={89,34,270,17}; //静态初始化方式 /* 对数组操作最基本的动作就是存和取 核心思想:就是对角标的操作。 */ //数组的遍历 for (int i=0;i<arr.length ;i++ ) //arr.length,可以获取数组的长度 { System.out.println("arr["+i+"]="+arr[i]+";"); } } }
获取数组中的最值
class ArrayDemo4 { public static void main(String[] args) { int[] arr={-34,-19,-11,-109,-3,-56}; System.out.println("max="+getMax(arr)); System.out.println("max="+getMax_2(arr)); System.out.println("min="+getMin(arr)); } /* 获取数组中的最大值 思路: 1.需要进行比较,并定义变量记录每次比较后较大的值 2.对数组中的元素进行遍历取出,和变量中记录的元素进行比较, 如果遍历到的元素大于变量中记录的元素,就用变量记录较大的值 3.遍历结束,该变量记录就是最大值 定义一个功能来实现: 明确1:结果 是数组中的元素,int型 明确2:未知内容 数组 */ public static int getMax(int[] arr) { //定义变量记录较大值 int max=arr[0]; for (int i=1;i<arr.length ;i++ ) { if(arr[i]>max) max=arr[i]; } return max; } public static int getMax_2(int[] arr) { //定义变量记录较大值 int maxelement=0; for (int i=0;i<arr.length ;i++ ) { if(arr[i]>arr[maxelement]) maxelement=i; } return arr[maxelement]; } }
排序
选择排序
class SelectSort { public static void main(String[] args) { int[] arr={34,19,11,109,3,56}; getArr(arr); selectSort(arr); getArr(arr); selectSort_2(arr); getArr(arr); } /* 选择排序: 思路: 1.第一个元素与后边的所有元素比较,将最小值放在arr[0],比较次数为arr.length-1 2.需要多轮排序,且每次的比较次数 -1 3.需要一个变量作为中转 4.返回排好序的数组 */ public static void selectSort(int[] arr) { for (int i=0;i<arr.length-1 ;i++ ) //外循环中最多取到arr[arr.length-1]即可,此时就是arr[length-1]与arr[length]比较,比较之后结束 for (int j=i+1;j<arr.length ;j++ ) { if (arr[i]>arr[j]) { swap(arr,i,j); } } } /* 高效选择排序 使用变量记录角标,获得最小值角标之后,只进行一次交换,提高了效率 */ public static void selectSort_2(int[] arr) { for (int i=0;i<arr.length-1 ;i++ ) { int num=arr[i],index=i; for (int j=i+1;j<arr.length ;j++ ) { if (num>arr[j]) { num=arr[j]; index=j; } } swap(arr,i,index); } } /* 遍历取出数组中的元素 */ public static void getArr(int[] arr) { System.out.print("["); for (int i=0;i<arr.length ;i++ ) { if(i!=arr.length-1) { System.out.print(arr[i]+","); //使用System.out.print(arr[i]+','),输出结果为47556378100109,而使用System.out.print(arr[i]+“,")则能正常输出3,11,19,34,56,109, //解决:使用' ',在输出时强制转换为int型(int类型+char类型=int类型),而使用" ",int类型+string类型不能进行转化,只能在输出的数后边添加字符串 } else System.out.print(arr[i]); } System.out.print("]"); System.out.println(); } /* 实现交换功能:实现arr[i]与arr[i+1]值的交换 */ public static void swap(int[] arr,int a,int b) { int temp=arr[a]; arr[a]=arr[b]; arr[b]=temp; } }
冒泡排序
class BubbleSort { public static void main(String[] args) { int[] arr={34,19,11,109,3,56}; getArr(arr); bubbleSort(arr); getArr(arr); bubbleSort_2(arr); getArr(arr); } /* 冒泡排序 1.相邻两个元素相比,较大的后移(下沉) 2.下一次比较比本次比较次数-1,且最后面的i个元素已排好序,不需要比较 3.总共需要排序arr.length-1次 4.内循环-1,为了避免角标越界;为了让外循环增加一次,内循环参数与比较的元素个数递减 */ public static void bubbleSort(int[] arr) { for (int i=0;i<arr.length-1 ;i++) { for (int j=0;j<arr.length-1-i;j++ ) //外循环次数+1,则内循环需要比较次数-1 { if (arr[j]>arr[j+1]) { swap(arr,j,j+1); //int temp; //temp=arr[j]; //arr[j]=arr[j+1]; //arr[j+1]=temp; } } } } /* 1.外循环从最后一个元素开始取值 2.外循环每次角标-1 3.内循环的比较次数随着外循环的变化而变化 */ public static void bubbleSort_2(int[] arr) { for (int i=arr.length-1;i>0 ;i-- ) { for (int j=0;j<i ;j++ ) { if (arr[j]>arr[j+1]) { swap(arr,j,j+1); //int temp; //temp=arr[j]; //arr[j]=arr[j+1]; //arr[j+1]=temp; } } } } /* 遍历输出数组元素 */ public static void getArr(int[] arr) { System.out.print("["); for (int i=0;i<arr.length ;i++ ) { if(i!=arr.length-1) { System.out.print(arr[i]+","); } else System.out.print(arr[i]); } System.out.print("]"); System.out.println(); } /* 实现交换功能:实现arr[i]与arr[i+1]值的交换 */ public static void swap(int[] arr,int a,int b) { int temp=arr[a]; arr[a]=arr[b]; arr[b]=temp; } }
数组的查找
/* 面试题 给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的, 那么这个元素的存储的角标如何获取 {13,15,19,20,33,45,78,106} */ import java.util.*; class ArrayDemo5 { public static void main(String[] args) { //int[] arr={4,1,5,7,3,8,2}; int[] arr={13,15,19,28,33,45,78,106}; //int index=getIndex(arr,50); //System.out.println("index="+index); int index1=halfSearch(arr,50); System.out.println("index="+index1); int index2=halfSearch_2(arr,50); System.out.println("index="+index2); int index3=Arrays.binarySearch(arr,50);//java中的折半查找 /* 如果存在,则返回的是具体的角标位置;不存在,则返回的是 -插入点-1。 */ System.out.println("indxe="+index3); } /* 数组常见功能:查找。 1.确定需要查找的数组 2.确定需要查找的元素 需要两个形参 */ public static int getIndex(int[] arr,int key) { for (int i=0;i<arr.length-1 ;i++ ) { if (arr[i]==key) { return i; } } return -1; } /* 折半查找(二分查找) 1.数组必须为有序数组 2.头角标和尾角标可能变化,故需要变量min,max 3.中间角标为mid=(min+max)/2 4.如果要查找的值key>arr[mid],则该值可能在后半部分,min+1;否则,可能在前半部分,max-1 5.当max<min时,停止查找,该数组中没有要查找的值key */ public static int halfSearch(int[] arr,int key) { int max,min,mid; min=0; max=arr.length-1; mid=(min+max)/2; while(key!=arr[mid])//当key==arr[mid]时,查找成功,停止查找 { if (key>arr[mid]) min=mid+1; else if (key<arr[mid]) max=mid-1; if(max<min) //return -1;//查找结束,该数组中不存在此元素 return min;//返回插入点 mid=(min+max)/2; } return mid; } public static int halfSearch_2(int[] arr,int key) { int max,min,mid; min=0; max=arr.length-1; while(min<=max)//当min>max时,整个数组已查找完毕,停止查找 { mid=(min+max)/2; if (key>arr[mid]) min=mid+1; else if (key<arr[mid]) max=mid-1; else return mid; } //return -1;//查找结束,该数组中不存在此元素 return min;//返回插入点 } }
进制转换
class ArrayTest3 { public static void main(String[] args) { toHex(60); toBinary(6); toOctal(8); System.out.println(Integer.toBinaryString(6));//二进制转换 } //十进制转十六进制 public static void toHex(int num) { trans(num,15,4); } //十进制转八进制 public static void toOctal(int num) { trans(num,7,3); } //十进制转二进制 public static void toBinary(int num) { trans(num,1,1); } public static void trans(int num,int base,int offset) { if(num==0) { System.out.println("0"); return ;//如果不写return,则后边的代码会继续执行 } char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; /* 查表时会查到比较多的数据,数据一多,就先存储后再进行操作 所以,需要定义一个数组,作为临时容器 */ char[] arr=new char[32]; int pos=arr.length; while(num!=0) { int temp=num&base; arr[--pos]=chs[temp]; num=num>>>offset; } printHex(arr,pos); System.out.println(); } public static void printHex(char[] arr,int pos) { for (int x=pos;x<=arr.length-1 ;x++ ) { System.out.print(arr[x]); } } }
二维数组
格式1:int[][] arr=new int[3][2];
定义了名称为arr的二维数组
二维数组中有3个以为数组
每一个一维数组中有2个元素
一维数组的名称分别为arr[0],arr[1],arr[2]
给第一个一维数组的1脚标位赋值78:arr[][1]=78;
格式2:int [][] arr=new int[3][];
分别对二维数组中的每一个小数组进行初始化:
arr[0]=new int[2];
arr[1]=new int[1];
arr[2]=new int[3];
格式3:
静态定义一个二维数组
int[][] arr={{3,1,7},{5,8,2,9},{4,1}};
/* 二维数组定义的格式 */ class Array2Demo { public static void main(String[] args) { //int[] arr=new int[3]; //System.out.println(arr);//[I@bdb503,@左边是实体的类型,右边是实体的哈希值 //int[][] arr=new int[3][2];//创建一个二维数组,该数组中有3个一维数组,每个一维数组中有2个元素 //System.out.println(arr);//直接打印二维数组,[[I@bdb503,@左边有两个[,是二维数组 //System.out.println(arr[0]);//打印二维数组中脚标0的一维数组,@左边有1个[,是一维数组 //System.out.println(arr[0][0]);//打印二维数组中脚标0的一维数组中脚标为0的元素 //int[][] arr=new int[3][]; //System.out.println(arr);//直接打印二维数组,[[I@bdb503,@左边有两个[,是二维数组 //System.out.println(arr[0]);//一维数组未初始化,null //System.out.println(arr[0][0]);//一维数组为初始化,一维数组中没有元素(不是元素为0) //int[][] arr=new int[3][2]; //System.out.println(arr.length);//打印二维数组的长度,其实就是一位数组的个数 //System.out.println(arr[1].length);//打印脚标为1的一维数组的长度 /* 遍历二维数组 */ int[][] arr={{3,1,7},{5,8,2,9},{4,1}}; int sum=0; for (int x=0;x<arr.length ;x++ ) { System.out.print("{"); for (int y=0;y<arr[x].length ;y++ ) { if(y!=arr[x].length-1) System.out.print(arr[x][y]+","); else System.out.print(arr[x][y]); sum+=arr[x][y]; } System.out.println("}"); } System.out.println("sum="+sum); } }