目录
7. 数组的扩容
注意:数组的长度是固定的 所以长度是无法改变的
我们这里所谓的扩容其实是 将原数组中的内容 复制到新数组中
然后再将原数组的地址
指向新数组的空间
public class TestArrayGrow {
public static void main(String[] args) {
int [] oldArr = {1,2,3,4,5};
int [] newArr = new int[oldArr.length * 2];
for(int i = 0;i < oldArr.length;i++){
// 这里要执行复制元素的操作
// 等号右边赋值给等号左边的
newArr[i] = oldArr[i];
}
System.out.println(Arrays.toString(newArr));
System.out.println(oldArr);
System.out.println(newArr);
oldArr = newArr;
System.out.println(oldArr);
System.out.println(newArr);
}
}
8. 数组的复制
复制数组的三种方式:
1.编写循环实现复制
2.void System.arraycopy(原数组,起始位置,新数组,起始位置,复制元素个数)
注意下标和元素个数不要超出范围
3.数组 [ ] Arrays.copyOf(原数组,新长度)
public class TestArrayCopy {
public static void main(String[] args) {
int [] oldArr = {1,2,3,4,5};
int [] newArr = new int[oldArr.length];
System.arraycopy(oldArr, 0,newArr,0,5);
System.out.println(Arrays.toString(newArr));
System.out.println("--------------------------------------------------");
// [1, 2, 3, 4, 5]
int [] copyArr = Arrays.copyOf(newArr, 10);
System.out.println(Arrays.toString(copyArr));
}
}
9.数组类型的参数和返回值
不管是作为参数,还是作为返回值,跟之前的使用方式相同
/**
* 需求:
* 1.编写方法实现统计5门课程成绩 并且返回
* 2.编写方法用于接收一个成绩数组 然后将成绩进行打印
*
*/
public class TestArrayParameterReturned {
public static double[] inputScore(){
Scanner input = new Scanner(System.in);
double [] scores = new double[5];
for(int i =0;i < scores.length;i++){
System.out.println("请输入第" + (i + 1) + "门成绩");
scores[i] = input.nextDouble();
}
return scores;
}
public static void printScore(double [] scores){
for(int i = 0;i < scores.length;i++){
System.out.println("第" + (i + 1) + "门成绩为:" + scores[i]);
}
}
public static void main(String[] args) {
double [] scores = inputScore();
printScore(scores);
System.out.println(Arrays.toString(scores));、
}
}
10. 值传递和引用传递
Java官方明确表示 Java中只有值传递 没有引用传递 “引用传递”也属于值传递 只不过这个值是一个地址 也是一个引用
基本数据类型传参 属于值传递 在方法中对值的改变 不会影响原变量
引用数据类型传参 属于引用传递 在方法中根据地址操作数据 会影响原变量
String类型是特殊的引用数据类型 作为参数传递不会改变原变量
public class TestTransfer {
public static void transferValue(int num){
num++;
System.out.println("transferValue方法中num的取值为:" + num);
}
public static void transferAddress(int [] nums){
System.out.println("transferAddress方法中数组的地址值为:" + nums);
for(int i = 0;i < nums.length;i++){
nums[i]++;
}
}
public static void main(String[] args) {
int a = 10;
transferValue(a);
System.out.println(a);
int [] arr = {1,2,3,4,5};
System.out.println(arr);
transferAddress(arr);
System.out.println(Arrays.toString(arr));
}
}
11. 排序
冒泡排序:冒泡排序是两个元素比较完成以后 符合条件 立即交换位置 这样对于元素的移动比较频繁
选择排序:使用一个元素 依次与其他元素比较大小 遇到需要交换位置的元素 先不交换 等待第一轮比较完成后再交换位置
11.1 冒泡排序
public class TestBubbleSort {
public static void main(String[] args) {
int [] nums = {89,56,441,552,6369,741,85};
int a = 10;
int b = 20;
// int temp = a;
// a = b;
// b = temp;
for(int i = 0;i < nums.length-1;i++){ // 控制比较的轮数
for(int j = 0;j < nums.length -1 -i;j++){
if(nums[j] < nums[j + 1]){
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
System.out.println("第"+(i + 1)+"轮比较完成以后数组的顺序为:" + Arrays.toString(nums));
}
System.out.println(Arrays.toString(nums));
}
}
11.2选择排序
/**
* 选择排序
* 外层循环属于比较的数A 从第一个元素开始 直到 倒数第二个元素 int i = 0;i < nums.length - 1;i++
* 内层循环属于比较的数B 永远是从比较的数A相邻的后边的元素开始 int j = i + 1;j < nums.length;j++
*/
public class TestChoiceSort {
public static void main(String[] args) {
int [] nums = {8888,89,100,56,441,552,6369,741,85};
for(int i = 0;i < nums.length - 1;i++){
int index = i; // index变量默认值和i相同 用来记录最初i的取值 以及在比较过程中交换下标使用
for(int j = i + 1;j < nums.length;j++){
if(nums[index] < nums[j]){
index = j;
}
}
if(index != i){ // 当这个条件 表示需要交换位置 反之不需要交换
int temp = nums[index];
nums[index] = nums[i];
nums[i] = temp;
}
}
System.out.println(Arrays.toString(nums));
}
}
11.3 二分查找
二分查找算法:根据指定的元素 查找此元素在序列中的下标 如果未找到 则返回-1 找到则返回对应的下标
前提:必须是有序数组
将序列一分为二,如果查找的元素小于中间值 则从左边开始查找 如果是大于中间值 则从右边查找
如果等于中间值 则直接返回即可 重复以上过程 直到找到 或者循环条件不成立
public class TestBinarySearch {
public static void main(String[] args) {
int [] nums = {8888,89,100,56,441,552,6369,741,85};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
System.out.println(binarySearch(nums, 666));
System.out.println(Arrays.binarySearch(nums, 666));
}
public static int binarySearch(int [] nums,int num){
int index = -1; // 最终用于返回的下标 默认初识值为-1
int begin = 0; // 开始位置
int end = nums.length -1; // 结束位置
int middle = ( begin + end ) / 2; // 中间位置
while (begin <= end) { //
if(num < nums[middle]){
// 从左边查找
// 因为是小于中间值 所以查找范围为中间下标左侧的序列
// 所以此时我们需要改变结束下标的位置
end = middle -1;
}else if(num > nums[middle]){
// 从右边查找
begin = middle + 1;
}else{
index = middle;
break;
}
middle = (begin + end) / 2;
}
return index;
}
}
11.4 数组的插入
1.先创建一个比原来长度长1的数组
2.循环实现元素的移动
如果 下标小于插入的位置 则直接复制到新数组中
大于等于插入的位置 则将原数组的元素移动到新数组下标+1的位置
3.将新数组空缺的位置 直接插入元素即可
4.将新数组返回
public class TestArraysInsert {
public static void main(String[] args) {
int [] nums = {11,22,33,44,55};
int[] newArr = insert(nums, 888, 2); // .var 自动生成对应类型的变量接收返回值
System.out.println(Arrays.toString(newArr));
}
/**
* @param nums 被插入元素的数组
* @param num 插入元素
* @param index 插入位置
* @return
*/
public static int[] insert(int [] nums,int num,int index){
if(index < 0 || index > nums.length -1){
return nums;
}
int [] newArr = new int[nums.length + 1];
for(int i = 0;i < nums.length;i++){
if(i < index){
newArr[i] = nums[i];
}else{
newArr[i + 1] = nums[i];
}
}
newArr[index] = num;
return newArr;
}
}
11.5 数组的删除
1.先创建一个比原数组长度-1的数组
2.循环实现数组的移动
如果 下标小于插入的位置 则直接复制到新数组中
如果大于等于插入的位置 则将原数组中的元素 从删除下标+1位置开始
移动到新数组相应的位置
3.将新数组返回
public class TestArraysRemove {
public static void main(String[] args) {
int [] nums = {11,22,33,44,55};
int[] newArr = remove(nums, 3);
System.out.println(Arrays.toString(newArr));
}
public static int[] remove(int [] nums,int index){
if(index < 0 || index > nums.length -1){
return nums;
}
int [] newArr = new int[nums.length -1];
for(int i = 0;i < newArr.length;i++){
if(i < index){
newArr[i] = nums[i];
}else{
newArr[i] = nums[i + 1];
}
}
return newArr;
}
}
12. 可变长参数
可变长参数:可接收0个或多个同类型实参,个数不限,使用方式与数组相同。
语法:数据类型...形参名
要求:必须定义在形参列表的最后,且整个形参列表中只能有一个可变长参数。
public class TestModifyParameter { public static void m1(int...args){ for(int i = 0;i < args.length;i++){ System.out.println(args[i]); } System.out.println("m1方法执行完毕"); } public static void main(String... args) { m1(1,2,3,4,5); } }
13. 二维数组
二维数组:数组中的元素还是(一维数组)数组
定义:与一维数组基本一样 四种方式。特别之处,二维数组在定义的时候,高维度的长度必须指定,低维度可以根据需要 是否立即指定
数组的默认值:引用类型为null
二维数组的遍历,使用嵌套循环