Java——一维数组

一维数组

一维数组定义:长度不可变的容器,且其存储的数据类型必须一致。格式:(如下)数组内存模型栈内存:堆内存:实例:数组的遍历——循环遍历输出数组数组的元素拷贝数组工具类常用方法:toString数组工具类常用方法:sort数组工具类常用方法:fill数组查找:binarySearch (二分查找)数组的排序算法——冒泡排序

定义:长度不可变的容器,且其存储的数据类型必须一致。

格式:(如下)

   //数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度]; 
 ​
 •        int[] arr = new int[3]; //动态初始化
 ​
 •        //数  据类型[] 数组名= new 数据类型[]{元素1,元素2,元素3...}; 
 ​
 •        int[] arr1 = new int[]{1,2,3,4,5}; //静态初始化                
 ​
 •        //数据类型[] 数组名= {元素1,元素2,元素3...}; 
 ​
 •        int[] arr2 = {1,2,3,4,5};

注意:数组长度允许为0

int [] a = null; 和 int []a = new int[0]; 是不同的

数组内存模型

一基本类型和弓|用类型存储的区别

● 基本数据类型的变量中存储的即为值本身 ●引用类型变量中存储的值指向了内存中另一个地方,通过这个“引用” 来访问该内存中的数据

栈内存:

栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中 的都是局部变量(方法外的是全局变量) , for循环内部定义的也是局部变量, 是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变 量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快, 因为局部变量的生命周期都很短。

堆内存:

存储的是数组和对象(其实数组就是对象) , 凡是new建立的都是在堆 中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体 的多个属性) , 如果一个数据消失,这个实体也没有消失,还可以用,所以堆是 不会随时释放的,但是栈不一-样,栈里存放的都是单个变量,变量被释放了,那 就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机

总结:基本数据类型的变量中存储的即为值本身;

引用类型变量中存储的值指向了内存中另一个地方通过这个“引用”来访问该内存中的数据;

实例:

 public static void main(String[] args) {
         // TODO Auto-generated method stub
         int a = 10;
         int []b = {1,2,3,4,8};
         int []c = {1,2,3,4,5};
         fun(a);
         fun1(b);
         fun2(c);
         System.out.println(a);
         System.out.println(b[0]);
         System.out.println(c[0]);
     }
     public static void fun(int a) {
         a = 20;
     }
     public static void fun1(int []b) {
         b = new int[] {4,5,6,8,9};
 //      System.out.println(b[0]);
     }
     public static void fun2(int []c) {
         for (int i = 0; i < c.length; i++) {
             c[i]=0;
         }
     }
 //结果
 10
 1
 0

分析:

 

数组的遍历

——循环遍历输出数组

1.使用普通的for循环

 for(int i = 0;i<arr.length;i++){
     System.out.println(arr[i]+",");
 }

2.使用for-each循环

 for(int num : arr){
     System.out.println(num+",");
 }

数组的元素拷贝

——1.通过循环拷贝

 示例:从a数组的m号位置的元素将len个元素拷贝到b数组的n号开始后的元素上
 for(int i = m,j = n ;i<a.length && j<b.length && len > 0;i++,j++,len++){
  b[j] = a[i];
 }

——2.通过系统函数

 示例:从a数组的m号位置的元素将len个元素拷贝到b数组的n号开始后的元素上
 System.arraycopy(a,m,b,n,len);

数组工具类常用方法:toString

——将数组内容转换为字符串,格式为”[元素1,元素2,....]“

 示例
 int[]arr = {13,92,54,22,30,23};
 String str = Arrays.toString(arr);
 System.out.println(str);
 输出:
 [13,92,54,22,30,23]

数组工具类常用方法:sort

——将数组内容按照自然顺序进行升序排列

 int[]a = {47,77,83,7,43,93,15};
 Arrays.sort(a);
 System.oout.prngtln("对a数组整体排序后:"+Arrays.toString(a));
 int[]b = {80,17,84,78,33,13,10,30,68,91};
 Arrays.sort(b,3,8);//顾前不顾后
 System.out.println("对b数组部分排序后:"+Arrays.toString(b));
 //输出
 对a数组整体排序后:[7,15,43,47,83,93]
 对b数组整体排序后:[80,17,84,10,13,30,33,78,68,91]

补充

——Arrays类对比较器(Comparartor)的支持---自定义排序

 //自定义比较器对象,只能支持引用类型的排序!
         Integer[] ages = {34,12,42,23};
         /*
         参数一:被排序的数组必须是引用类型的元素
         参数二:匿名内部类对象,代表了一个比较器对象
          */
         Arrays.sort(ages, new Comparator<Integer>() {
             @Override
             public int compare(Integer o1, Integer o2) {
                 //指定比较规则
                return o2 - o1;
             }
         });
         System.out.println(Arrays.toString(ages));

数组工具类常用方法:fill

——使用指定的数值填充数组元素,也可以指定填充的范围

 int[]a = {47,77,83,7,43,93,15};
 Arrays.fill(a,66);
 System.out.println("对a数组整体填充后:"+Arrays.toString(a));
 int[]b = {80,17,84,78,33,13,10,30,68,91};
 Arrays.fill(b,3,8,66);//顾前不顾后
 System.out.println("对b数组整体填充后:"+Arrays.toString(b));
 //输出
 对a数组整体填充后:[66,66,66,66,66,66,66]
 对b数组整体填充后:[80,17,84,66,66,66,66,66,68,91]

数组查找:binarySearch (二分查找)

——在数组(或指定的范围)中使用二分搜索法来搜索指定的值,如 果搜索到则返回其索引,如果没有搜索到,返回值为插入点-1 ( *插入点为第一个大于搜索目标的元素位置)</u> 注意: ●使用二分搜索法搜索的目标数组(或目标范围)必须先进行排序 ( Arrays.sort ) ●如果搜索目标中包含多个相同结果,无法保证找到的是哪一 个

 int[]a = {47,77,83,7,43,93,15};
 Arrays.sort(a);
 System.oout.prngtln("对a数组整体排序后:"+Arrays.toString(a));
 int index = Arrays.binarySearch(a,77);
 System.out.println("查找目标77结果是:"+index);
 intdex = Arrays.binarySearch(a,78);
 System.out.println("查找目标78结果是:"+index);
对a数组整体排序后:[7,15,43,47,77,83,93]
 查找目标77结果是:4
 查找目标78结果是:-6

数组的排序算法

——冒泡排序

算法步骤

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

图示:

算法实现:

 public class maopao {
     public static void main(String[] args) {
         int a [] = {12,36,11,43,23};
         for (int i = 0; i < a.length-1; i++) {
             for (int j = 0; j <a.length-i-1;j++) {
                 if (a[j]>a[j+1]) {
                     int temp = a[j];
                     a[j]=a[j+1];
                     a[j+1]=temp;
                 }
             }
         }
         //遍历输出
         for (int i = 0; i < a.length; i++) {
             System.out.print(a[i]+"\t");
         }
     }

——直接选择排序

算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

图示:

算法实现:

 //定义数组
 int[] arr = {5,1,2,3};
 //           0 1 2 3
 //定义一个循环控制选择几轮
 for (int i = 0; i < arr.length-1; i++) {
     //定义内部循环控制选择几轮
     for (int j = i+1; j <arr.length; j++) {
                 if (arr[i]>arr[j]){
                    int temp = arr[i];
                     arr[i] = arr[j];
                     arr[j] = temp;
                 }
             }
         }  System.out.println(Arrays.toString(arr));
 }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值