首页 > 其他分享 >第八章 数组的定义和使用

第八章 数组的定义和使用

时间:2024-11-22 12:46:16浏览次数:3  
标签:Java 定义 int 第八章 C语言 内存 数组 引用

一  数组的创建

1.作用:用于批量创建相同类型的变量

2.要求:相同类型变量

3.初始化:

(1)动态初始化:定义其长度,内部不具体赋值

(2)静态初始化:直接赋值,由其所赋的值来确定

注:

(1)有带new int[]的初始化和赋值/赋长度可以分两步写

若单纯赋值只带{}的,则不可以分开写

(2)动态初始化和静态初始化必须占一个,并且只能占一个

(3)编程中静态与动态的解释:

动态:运行过程中确定的信息

静态:编译过程中确定的信息

4.元素的初始值:

(1)情况:如果动态初始化,没有初始值,系统会赋一个初始值

(2)赋值情况:

(i)基本类型:整形和浮点型为0/0.0,字符型为空字符,boolean为false

(ii)引用数据类型:空引用

5.与C语言的区别:

(1)在C语言中即使变量被const修饰,也不能作为数组长度。Java中支持变量作为数组长度

(2)在C语言中数组长度是数组类型的一部分,即int[2]和int[4]是不同类型。在Java中数组长度不属于数组类型的一部分,前面所说的二者都属于int[]类型

(3)在C语言中如果不进行初始化会赋给元素随机值。Java中会将元素赋值为0

二  数组的使用

1.获取数组长度

(1)方式:数组引用名.length

2.遍历数组

(1)使用for-each

(i)格式:for(int i:arr){

}

(ii)缺点:

只能从头到尾地遍历+只能读取不能修改

原因:其本质是一个赋值操作,其等价于int i=arr[0],即使改也是改i的值,数组内部不会发生变化

注意:其i是赋一整个元素,而不是作为其下标

(2)访问数组元素:利用[],下标/索引(index)

访问:指对数组的元素进行某种操作

区别:

C语言中面对下标越界访问会有不确定行为,可能给出一个随机值或者直接程序崩溃

Java中会检查下标是否越界,会有确定行为,直接触发异常,无法运行通过

报错:ArrayIndexOutOfBoundsException

注:java这样做可以减少出错,但是会降低一定的效率,而C语言为了追求性能在这一点上没有做出完善

3.打印对象的hasCode

(1)情况:直接打印对象的引用类型得到不是内存地址,而是对象的hasCode

注:在Java中,其将内存地址这个概念隐藏起来,我们无法通过常规手段获取到对象的地址

4.数组转字符串

(1)原因:printfln本质上是打印字符串的,所以需要将数组转化成字符串后再进行打印

Java中的各种对象也是这样的

(2)方法:Arrays.toString(数组名)

三  引用类型

1.用途:

(1)互相赋值

(2)比较==和!=

(3)使用.成员访问

(4)使用[]访问元素(数组特有)

2.与基本引用类型的区别

(1)基本引用类型:其内存中存是其本身的值,其比较相等时是比较其值是否相等

(2)引用数据类型:其内存中存的是其引用的对象在堆区的地址,通过该地址可以去操作其对应的那个对象,其比较相等时是比较其引用的是否为同一个对象

3.空引用(null):

(1)特征:不指向任何有效对象,为无效的引用

(2)区别于C语言:

在C语言中,空指针即为地址为0的指针

在Java中,并没有指定空引用和地址为0的指针的关系,具体如何取决于JVM的实现

(3)注意:

(1)不可用其进行成员访问和下标访问操作,否则会报错:NullPointerException

(2)任何引用类型都可以用null来赋值

四  内存

注:Java程序运行需要消耗内存,而Java程序都是跑在JVM上的,Java程序运行消耗的内存就是JVM消耗的内存

在机器的内春中有一块是JVM的内存,而由于要存储的东西不同,JVM又对内存区域进行了划分

1.内存区域的划分:

(1)程序计数器:用于存放下一条指令的地址

(2)方法区:用于放类中的各种成员方法

(3)堆:new出来的对象都放于此,程序开始时创建,程序结束时销毁,只要内部的对象还有在使用,就不会销毁

(4)栈:每一次方法调用就会创建一个栈帧,栈帧中放了局部变量等各种执行方法要用的信息,以及存放了方法的调用关系(即调用栈)

2.特例:

public static int[] arr(){

int [] arr1=new int[]{1,2,3,4}

return arr1;

}

区别:

在C语言中,其返回的是一个野指针,因为这个数组在出了这个方法之后就不存在,其在内存中的空间被释放了,arr1指向的不为有效地址

在Java中,其没有出错,因为其是创建了一个对象,该对象存储于堆中,只要堆上的对象还有在使用,其就不会被销毁,此时只是arr1整个临时变量被销毁了,其存储于堆上的对象并没有,其地址仍然为有效地址

原因:垃圾回收机制

(1)作用:当你不使用任何对象或数组的时候,就会被JVM自动释放掉,取决于Java使用了一种垃圾回收机制(garbage collection)”GC",堆上的内存都是由GC自动管理的

(2)区别:而在C/C++中则需要手动释放,很容易造成内存泄露

内存泄露的特点;(i)非常隐蔽(ii)后果严重(程序崩溃/系统卡顿)

(3)缺点:

(i)耗费更多资源

(ii)运行起来耗费更多时间

五  数组的应用

1.作为函数参数:作为引用类型可以传个地址过去,就不用复制整个数组过去,耗费资源,并且对数组内部元素的改动是会影响原数组的

2.作为函数的返回值(注意:堆上对象的生命周期的问题)

六  数组的特殊方法

1.数组转字符串:

(1)Arrays.toString(数组)

(2)自己版本:

(i)String可以通过+=来实现与其它类型的拼接

2.数组拷贝(创建一个新的数组)

(1)方式:Arrays.copyOf(数组名,拷贝长度)

(2)有范围地拷贝:Arrays.copyOfRange(数组名,头,尾)

注:在编程中提到的区间基本上都是前闭后开,原因是中间多少个元素可以直接进行计算,少部分是前闭后闭

(3)自己实现要比较原数组与新数组的长度时,可以利用Math.Min方法

3.查找;

(1)顺序查找:适用于所有数组

(2)二分查找:仅适用于有序数组

4.冒泡排序

(1)Arrays.sort(数组)

七  二维数组

1.定义:二维数组本质上是一维数组,只不过其元素都为一维数组

2.区别于C语言

C语言中由于数组长度也是数组类型的一部分,并且数组要求类型一致,所以每一个一维数组的长度都得保持一致

而Java中二维数组中的元素一维数组长度可以不一致,都是int[]这个类型,数组长度不属于类型的一部分,所以长度可以不一致(会取决于静态初始化时所赋的数来决定大小)

3.注意二维数组length得到的是对应一维数组的个数

标签:Java,定义,int,第八章,C语言,内存,数组,引用
From: https://blog.csdn.net/huipeng926/article/details/143964041

相关文章

  • fastadmin自定义主题并随切换变更iframe颜色
    一、不同皮肤主题的css文件fastadmin自带一些皮肤,不同的皮肤对应不同的css样式文件,对应目录:public/assets/css/skins。比如拿其中一个css自定义一些样式,记住所需要强制定义样式的css前面一定加所在皮肤文件的样式头,如.skin-black-blue 二、随着切换皮肤主题,修改ifrme的样......
  • Taro微信小程序,自定义TabBar在开发者工具中能显示,但真机调试不显示
    问题背景Taro开发小程序,自定义TabBar,在app.config.ts中,已配置好:tabBar:{custom:true,}并自定义了custom-tab-bar文件夹,配置好了自定义的tabbar,在微信开发者工具中,正常显示但是在真机调试中一片空白,检查wxml,元素存在,并且高度宽度正常,位置正常,只是被遮挡,添加z-index......
  • 写一个函数找出给定数组中的最大差值
    /***Findsthemaximumdifferencebetweenanytwoelementsinanarray.**@param{number[]}arrTheinputarrayofnumbers.*@returns{number}Themaximumdifference,or0ifthearrayisemptyorhasonlyoneelement.*/functionfindMaxDifferen......
  • 4.寻找两个正序数组的中位数 python
    寻找两个正序数组的中位数题目描述示例1:示例2:提示:题目链接解题思路Python实现详细解释题目描述给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))......
  • C语音学习——字符数组与字符串
    目录1.字符数组的定义2.字符数组的初始化示例:二、字符串1.C语言中的无奈事实2.字符串中的0元素3.“字符串变量”—字符数组  注意:4.字符串工具包—string.h字符串函数(1)strlen()函数(2)strcmp()函数(3)strcpy()函数(4)strcat()函数1.字符数组的定义字符数组是......
  • 【C#应用】Windows Forms 自定义仪表盘控件开发
    本教程将详细介绍如何在WindowsForms中创建一个自定义的仪表盘控件。这个控件具有以下特性:可配置的颜色区间平滑的动画效果可自定义的外观刻度和数值显示设计时支持,这个以前没咋研究过,有点尴尬了。。先看一下效果以前一直没有认真的实现过控件集合编辑,发现这块还......
  • vxe-grid 自定义插槽模板
    在vxe-table中使用vxe-grid渲染表格,当配置式不能满足需求时,。需要使用自定义插槽模板来自定义业务需求,实现更灵活的功能。vxe-grid支持多种自定义方式,可以使用插槽模板,也可以使用插槽来自定义模板。自定义单元格模板<template><div><vxe-gridv-bind="gridOptions......
  • 【BitMap】 java中实现BitMap位图 byte数组实现的bitmap位图
      转载自: https://blog.csdn.net/heshiyuan1406146854/article/details/122687988 /***byte数组实现的bitmap**@authorSXD*@date2024/11/21*/publicclassMyBitmap{privatebyte[]buckets;publicMyBitmap(intmaxNum){this.ini......
  • 【Python】0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、p
    0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、pickle序列化、序列化升级函数参数传递参数传递类型标注函数细分task任务型函数consumer消费型函数functional功能型函数类的信息元类type作用自定义元类pickle序列化序列化反序列化序列化升......
  • 有个数组{1,2,3,4,5},可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后的那个元素,当
    1importjava.util.Scanner;2publicclassarray03{3publicstaticvoidmain(String[]args){4ScannermyScanner=newScanner(System.in);56789int[]arr={1,2,3,4,5};101112......