Java—数组的定义与使用

int[] arr = {1, 2, 3};

for (int x : arr) {

System.out.println(x);

}

}

三,数组作为方法的参数

================

1,基本用法


代码示例: 打印数组内容

ublic static void main(String[] args) {

int[] arr = {1, 2, 3};

printArray(arr);

}

public static void printArray(int[] a) {

for (int x : a) {

System.out.println(x);

}

}

2,理解引用类型


代码示例1 参数传数组类型

public static void printf(int[] array) {

for (int i = 0; i < array.length; i++) {

System.out.print(array[i]+" ");

}

System.out.println();

}

public static void main(String[] args) {

int[] array = {1,2,3,4,5,6};

printf(array);

}

代码示例2 参数传内置类型

public static void func1(int[] array) {

array = new int[]{11,2,13,4,51,61};

}

public static void func(int[] array) {

array[0] = 899;

}

public static void main(String[] args) {

int[] array = {1,2,3,4,5,6};

System.out.println(Arrays.toString(array));

func1(array);

System.out.println(Arrays.toString(array));

}

public static void func1(int[] array) {

array = new int[]{11,2,13,4,51,61};

}

public static void func2(int[] array) {

array[0] = 899;

}

public static void main(String[] args) {

int[] array = {1,2,3,4,5,6};

System.out.println(Arrays.toString(array));

func2(array);

System.out.println(Arrays.toString(array));

}

总结: 所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实 只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).

3,认识 null


null 在 Java 中表示 “空引用” , 也就是一个无效的引用.

public static void main(String[] args) {

int[] arr = null;

System.out.println(arr[0]);

}

null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操 作. 一旦尝试读写, 就会抛出 NullPointerException.

4,初识 JVM 内存区域划分


一个宿舍楼会划分成几个不同的区域: 大一学生, 大二学生… 计算机专业学生, 通信专业学生… 内存也是类似, 这个大走廊被分成很多部分, 每个区域存放不同的数据.

程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址.

虚拟机栈(JVM Stack): 重点是存储局部变量表(当然也有其他信息). 我们刚才创建的 int[] arr 这样的存储地 址的引用就是在这里保存.

本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局 部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的. 堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} )

方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据. 方法编译出的的字节码就是保存在这个区域.

运行时常量池(Runtime Constant Pool): 是方法区的一部分, 存放字面量(字符串常量)与符号引用. (注意 从 JDK 1.7 开始, 运行时常量池在堆上).

Native 方法:

JVM 是一个基于 C++ 实现的程序. 在 Java 程序执行过程中, 本质上也需要调用 C++ 提供的一些函数进行和操 作系统底层进行一些交互. 因此在 Java 开发中也会调用到一些 C++ 实现的函数.

这里的 Native 方法就是指这些 C++ 实现的, 再由 Java 来调用的函数

四,数组作为方法的返回值

================

代码示例: 写一个方法, 将数组中的每个元素都 * 2

public static void main(String[] args) {

int[] arr = {1, 2, 3};

transform(arr);

printArray(arr);

}

public static void printArray(int[] arr) {

for (int i = 0; i < arr.length; i++) {

System.out.println(arr[i]);

}

}

public static void transform(int[] arr) {

for (int i = 0; i < arr.length; i++) {

arr[i] = arr[i] * 2;

}

}

五,数组练习

==========

1,数组转字符串


public static void main(String[] args) {

int[] arr = {1,2,3,4,5,6};

String newArr = Arrays.toString(arr);

System.out.println(newArr);

}

Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法

什么是包?

例如做一碗油泼面, 需要先和面, 擀面, 扯出面条, 再烧水, 下锅煮熟, 放调料, 泼油.

但是其中的 “和面, 擀面, 扯出面条” 环节难度比较大, 不是所有人都能很容易做好. 于是超市就提供了一些直接 已经扯好的面条, 可以直接买回来下锅煮. 从而降低了做油泼面的难度, 也提高了制作效率.

程序开发也不是从零开始, 而是要站在巨人的肩膀上.

像我们很多程序写的过程中不必把所有的细节都自己实现, 已经有大量的标准库(JDK提供好的代码)和海量的 第三方库(其他机构组织提供的代码)供我们直接使用. 这些代码就放在一个一个的 “包” 之中. 所谓的包就相当 于卖面条的超市. 只不过, 超市的面条只有寥寥几种, 而我们可以使用的 “包” , 有成千上万.

我们实现一个自己版本的数组转字符串

public static void main(String[] args) {

int[] arr = {1,2,3,4,5,6};

System.out.println(toString(arr));

}

public static String toString(int[] arr) {

String ret = “[”;

for (int i = 0; i < arr.length; i++) {

// 借助 String += 进行拼接字符串

ret += arr[i];

// 除了最后一个元素之外, 其他元素后面都要加上 ", "

if (i != arr.length - 1) {

ret += ", ";

}

}

ret += “]”;

return ret;

}

2,数组拷贝


public static void main(String[] args) {

int[] arr = {1,2,3,4,5,6};

int[] newArr = Arrays.copyOf(arr, arr.length);

System.out.println("newArr: " + Arrays.toString(newArr));

arr[0] = 10;

System.out.println("arr: " + Arrays.toString(arr));

System.out.println("newArr: " + Arrays.toString(newArr));

// 拷贝某个范围.

int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);

System.out.println("newArr2: " + Arrays.toString(newArr2));

}

实现自己版本的拷贝数组

public static int[] copyOf(int[] arr) {

int[] ret = new int[arr.length];

for (int i = 0; i < arr.length; i++) {

ret[i] = arr[i];

}

return ret;

}

3,找数组中的最大元素


public static void main(String[] args) {

int[] arr = {1,2,3,4,5,6};

System.out.println(max(arr));

}

public static int max(int[] arr) {

int max = arr[0];

for (int i = 1; i < arr.length; i++) {

if (arr[i] > max) {

max = arr[i];

}

}

return max;

}

4,求数组中元素的平均值


public static void main(String[] args) {

int[] arr = {1,2,3,4,5,6};

System.out.println(avg(arr));

}

public static double avg(int[] arr) {

int sum = 0;

for (int x : arr) {

sum += x;

}

return (double)sum / (double)arr.length;

}

5,查找数组中指定元素(顺序查找)


public static void main(String[] args) {

int[] arr = {1,2,3,10,5,6};

System.out.println(find(arr, 10));

}

public static int find(int[] arr, int toFind) {

for (int i = 0; i < arr.length; i++) {

if (arr[i] == toFind) {

return i;

}

}

return -1; // 表示没有找到

}

6,查找数组中指定元素(二分查找)


public static void main(String[] args) {

int[] arr = {1,2,3,4,5,6};

System.out.println(binarySearch(arr, 6));

}

public static int binarySearch(int[] arr, int toFind) {

int left = 0;

int right = arr.length - 1;

while (left <= right) {

int mid = (left + right) / 2;

if (toFind < arr[mid]) {

// 去左侧区间找

right = mid - 1;

} else if (toFind > arr[mid]) {

// 去右侧区间找

left = mid + 1;

} else {

// 相等, 说明找到了

return mid;

}

}

// 循环结束, 说明没找到

return -1;

}

7,检查数组的有序性


public static void main(String[] args) {

int[] arr = {1,2,3,10,5,6};

System.out.println(isSorted(arr));

}

public static boolean isSorted(int[] arr) {

for (int i = 0; i < arr.length - 1; i++) {

if (arr[i] > arr[i + 1]) {

return false;

}

}

return true;

}

8,数组排序(冒泡排序)


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

image

Java面试精选题、架构实战文档

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
nL-1712044022208)]

[外链图片转存中…(img-j62XgDUs-1712044022208)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

[外链图片转存中…(img-o198Khea-1712044022208)]

Java面试精选题、架构实战文档

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值