03-方法与数组
方法概述与定义
方法介绍
就是一个小功能。把一段代码存起来,以后可以重复使用。
static void printB() {
System.out.println("b");
System.out.println("b");
System.out.println("b");
System.out.println("b");
}
方法注意点
方法参数
完整形式
方法返回值
给定两个字符串 把两个字符串拼接到一起 并返回。
驼峰命名法
第一个字母小写,后面的每一个单词首字母大写。
static String stringConcat(String str1,String str2) {
//System.out.println(str1 + str2);
String res = str1 + str2;
return res;
}
方法重载
概念
在同一个类中,允许方法名称相同,但是方法的参数必须不同
方法 的重载解决了,功能相同,参数不同,就不需要定义多个方法名称了
方法的重载的规则
方法名称必须相同。
参数列表必须不同。
方法的返回类型可以相同也可以不相同。
仅仅返回类型不同不足以称为方法的重载。
数组
概念
它是把相同的数据类型有序的组成在一起, 我们称这样的集合为数组。
相同的数组类型
有序的组成在一起
格式
数据类型[] 数组的名称 = new 要存放的数据类型[]{存放指定数据类型的内容}
规则
数组初始化
静态初始化
在创建数组时,就已经确定了有多少个元素,
并且把元素都放到了数组当中
//int[] ages = new int[] {21,22,23,21,25};
String[] names = new String[] {"zs","ls","wc"};
//先定义,再赋值
int a;
//System.out.println(a); 直接使用是错误的
a=10;
int[] ages;
//System.out.println(ages); 直接使用是错误的
//如果不初始化,数组是不能使用的。
ages = new int[] {21,22,23,21,25};
String name = names[1];
System.out.println(name);
动态初始化
一开始不知道要存哪些数数据。所以先定义一个指定的空间大小
String[] allPerson = new String[100];
allPerson[0] = "zs";
allPerson[1] = "ls";
//ArrayIndexOutOfBoundsException:数组越界
System.out.println(allPerson[101]);
数组长度
获取数组元素的个数: 数组名称.length
取出数组当中每一个元素
排序算法
冒泡排序
演示地址:http://www.jsons.cn/sort/
升序为例
第1步
从头开始比较每一对象元素,如果第1 个比第2个大就交换他们的位置
执行完一轮后, 最大的元素 在最后
第2步
当执行完一轮后, 最大的元素,在后面
还要继续执行和第1轮相同的操作,索引的最大值要-1
int arr[] ={7,4,3,6,9};
for (int end = arr.length; end > 0; end--){
for (int begin = 1; begin < end; begin++){
if (arr[begin] < arr[begin -1]){ //左边的数比右边的大
//交换两个数的位置
int temp = arr[begin];
arr[begin] = arr[begin -1];
arr[begin-1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
选择排序
从序列中找出最小的元素,然后与第一个元素进行交换
执行完一轮后, 第一个元素就是最小的
每交换一次最小的值,位置向后移动一个
for (int start = 0; start < arr.length; start++) {
//定义一个变量 记录最小值的角标
int minIndex = start;
for (int next = start + 1;next <= arr.length - 1; next++)
{
if ( arr[next] < arr[minIndex]){
minIndex = next;
}
}
//拿最小的值 , 与第一个元素进行交换
int temp = arr[start];
arr[start] = arr[minIndex];
arr[minIndex] = temp;
}
二分查找算法
什么是二分查找
二分查找(binary search)又叫折半查找,它是一种在有序数组中查找某一特定元素的搜索算法
二分查找必要条件
- 必须为顺序存储结构
- 必须按关键字大小有序排列
原理
原理分析
将有序数组分为三个部分:中间值前(中间值数之前的一组数据)、中间值、中间值后(中间值之后的一组数据)
将要查找的数与中间值的数相比较,等于则退出查找,小于则在中间值前进行比较,大于在在中间值后进行比较,依次循环操作,直至查找到对应的值为止;当要查找数据结构为偶数时,中间值 mid 应向下取整处理;
代码实现
public static int binarySearch(int[] nums, int target) {
int low = 0;
int high = nums.length - 1;
if (low > high || target > nums[high] || target < nums[low]){
return -1;
}
while(low <= high) {
//取中间值
int mid = (high + low) / 2;
//等于则退出查找
if(nums[mid] == target)
return mid;
else if (nums[mid] < target)
//小于则在中间值前进行比较
low = mid + 1;
else if (nums[mid] > target)
//大于在在中间值后进行比较
high = mid - 1;
}
return -1;
}
二维数组
概念
在数组当中存放 的每一个元素又是一个数组
格式
int[] classAge1 = {18,19,20,17};
int[] classAge2 = {18,19,20};
int[] classAge3 = {18,19};
//整个年级的年龄
//int[][] allClassAges = new int[][] {classAge1,classAge2,classAge3};
int[][] allClassAges = new int[][] {
{18,19,20,17},
{19,19,20},
{30,19}
};
二维数组遍历
for(int i = 0; i < allClassAges.length; i++) {
int[] array = allClassAges[i];
for(int j = 0; j < array.length; j++) {
System.out.println(array[j]);
}
}
快速遍历
普通遍历
int[] ages = {10,20,30};
//遍历数组
for(int i = 0; i < ages.length; i++) {
System.out.println(i);
System.out.println(ages[i]);
}
快速遍历
//遍历数组foreach
//for (数组类型 遍历出来的元素 : 数组的名称)
for (int i : ages) { //是一个语法糖
System.out.println(i);
}
String[] names = {"zs","ls","xq","123"};
for (String name : names) {
System.out.println(name);
}
可变参数
数组当作参数传递
static void sum(int[]args) { //把数组当作参数进行传递
int res = 0;
for(int i = 0; i < args.length; i++) {
res = res + args[i];
}
System.out.println(res);
}
可变参数
static void sum(int...args) { //语法糖
int res = 0;
for(int i = 0; i < args.length; i++) {
res = res + args[i];
}
System.out.println(res);
}
public static void main(String[] args) {
int[] params = {1,2,3,4};
sum(params);
sum(1,2,3,4);
}
变量作用域
什么是作用域
生效(能使用的范围)的范围
变量作用域
生效范围是:在创建变量的大括号当中生效。超过了大括号就不生效(不能再使用了)
在方法内部定义的变量,跟外界没有任何关系
test();
int a = 10;
System.out.println(a);
{ //代码块
int b = 20;
System.out.println(b);
}//b过完大括号就没有了
int b = 30;