bilibiliJava学习数组练习

1.JVM分为五个区域

方法区,本地方法栈,Java虚拟机栈,堆,程序计数器

今日重点学习Java虚拟机栈和堆的内容 

 2.昨日小内容

public static void main(String[] args) {
    int[] array = {1,2,3,4};
    int[] array2 = array;

    //当前array3不引用任何对象
    int[] array3 = null;
    //开辟了一块新的内存;
    int[] array4 = new int[]{1,2,3,4,5};
    
    //这样是错误的,没有初始化
   int[] array5;
   //array5 = {1,2,3,4};只能写为
    array5 = new int[]{1,2,3,4,5};
    

3.数组转字符串

解析:用到的是 Arrays.toString(array);

public static void main(String[] args) {
    int[] array = {1,2,3,4};
    String ret = Arrays.toString(array);
    System.out.println(ret);
}

.Arrays;是操作数组相关的工具类,还可以自己写一个toString来进行转字符串

public class Test {
    public static String mytoString(int[] tmp){
        if(tmp == null){
            return null;
        }
        String ret = "[";
        for (int i = 0; i < tmp.length; i++) {
            ret = ret + tmp[i];
            if(i != tmp.length-1){
                ret +=", ";
            }
        }ret +="]";
        return ret;

    }

    public static void main(String[] args) {
        int[] array = {1,2,3,4};
        String ret = Arrays.toString(array);
        String ret1 = mytoString(array);
        System.out.println(ret);
        System.out.println(ret1);
    }

4.数组拷贝

(1)自己写的

public static void main(String[] args) {
    int[] array = {1,2,3,4};
    int[] temp = new int[array.length];
    for (int i = 0; i < array.length; i++) {
        temp[i] = array[i];
    }
    System.out.println(Arrays.toString(temp));


}

就是这样,牛逼

(2)勾八,有一个新方法Arrays.copyOf(拷贝的数组,拷贝多长)

int[] array2 = Arrays.copyOf(array,array.length);
System.out.println(Arrays.toString(array2));

他居然还能扩容

//扩容两倍
int[] array2 = Arrays.copyOf(array,array.length*2);
System.out.println(Arrays.toString(array2));

所得到的就是下面的结果

[1, 2, 3, 4]
[1, 2, 3, 4, 0, 0, 0, 0]

 (3)还有一个更牛逼的

还支持局部的拷贝

int[] array3 = {1,3,5,7,9};
int[] copy = new int[array3.length];

System.arraycopy(array3,0,copy,0,array3.length);
System.out.println(Arrays.toString(copy));

(4)拷贝范围copyrange新方法

//方法4拷贝范围
int[] array = {1,2,3,4};
int[] array4 = Arrays.copyOfRange(array,1,3);
System.out.println(Arrays.toString(array4));

他这个结果案例来说应该得到的是2,3,4.

但是实际结果是2,3

原因是在Java它的集合是左闭右开的,就是[0,4),它不包括右集合

(5)克隆

int[] array = {1,2,3,4};
//方法5克隆
int[] array5 = array.clone();
System.out.println(Arrays.toString(array5));

用2,3比较多,就是Arrays.copyOf和System.arraycopy(array3,0,copy,0,array3.length);

注意:数组当中储存的是基本数据类型时,不论怎么拷贝基本都不会出现什么问题,但是如果存储型,拷贝时需要考虑深浅拷贝的问题,关于深浅拷贝在后续详细再说。 

5.求数组中元素的平均值

public static double avg(int[] array){
    int sum = 0;
    for (int x:
         array) {
        sum += x;
    }
    return sum*1.0 / array.length;
}
public static void main(String[] args) {
    int[] array = {1,2,3,4};
    System.out.println(avg(array));
}

6.查找数组中指定元素(顺序查找)

public static int find(int[] array,int n){
    for (int i = 0; i < array.length ; i++) {
        if(array[i] == n){
            return i;
        }
    }
    //代表没找到,因为-1是不存在于下标中的
    return -1;
}
public static void main(String[] args) {
    int[] array = {1,2,3,4,5,6};
    System.out.println(find(array,5));
}

(二分查找)一定是建立在有序的情况下才能用

public static int binarySearch(int[]array,int n){
    int left = 0;
    int right = array.length - 1;
    //   就是除以2
    while(left <= right){
        int mid = (left + right) / 2;
        if(array[mid] < n){
            left = mid + 1;
        }else if(array[mid] > n){
            right = mid - 1;
        }else {
            return mid;
        }
    }return -1;
}
public static void main(String[] args) {
    int[] array = {1,2,3,4,8,9,7,2,10,56,88,0,-1,6,7};
    Arrays.sort(array);
    System.out.println(Arrays.toString(array));
   int ret = binarySearch(array,8);
    System.out.println(ret);
}

Arrays.sort是函数的一个快排,不是冒泡排序,它是默认升序的。它是存在于函数库里的可以直接用

int ret1 = Arrays.binarySearch(array,9);
System.out.println(ret1);

要是想搞降序

Integer[] array = {1,2,3,4,8,9,7,2,10,56,88,0,-1,6,7};
Arrays.sort(array);
Arrays.sort(array, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1-o2;//降序就是o2-o1
    }
});

具体步骤就是把数组搞成Integer类型的,然后打代码Array.sort(array, new Comparator<Interger>)回车就行了

7.数组逆序

public static void  reverse(int[] array){
    int left = 0;
    int right = array.length - 1;
    int tmp = 0;
    while(left != right){
        tmp = array[left];
        array[left] = array[right];
        array[right] = tmp;
        left++;
        right--;
    }
    return array[left];
}

public static void main(String[] args) {
    int[] array = {15,16,17,18,19};
    reverse(array);
    System.out.println(Arrays.toString(array));
}

8.数组判断相等

public static void main(String[] args) {
    int[] array = {5,5,5,5,9,9,5,7452,2,4544,5};
    int[] array2 = {5,5,5,5,9,9,5,7452,2,4544,5};
    boolean flg = Arrays.equals(array,array2);
    System.out.println(flg);

Arrays.equals的源码

 9.让数组初始化为固定数值

public static void main(String[] args) {
    int[] array1 = new int[10];
    //让array1全初始化为-1
    Arrays.fill(array1,-1);
    System.out.println(Arrays.toString(array1));
    //让array1从[2到5)初始化为-1
    Arrays.fill(array1,2,5,-1);
    System.out.println(Arrays.toString(array1));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值