JAVA进阶教学之(一维数组)

1、java语言中的数组是一种引用数据类型。不属于基本数据类型

      数组的父类是object

 

2、数组实际上是一个容器,可以同时容纳多个元素(数组是一个数据的集合)

 

3、字面意思:数组意味着一组数据

 

4、数组当中可以存储“基本数据类型”的数据,也可以存储“引用数据类型” 的数据

 

5、数组因为是引用类型,所以数组对象是堆内存中(数组是存储在堆当中的)

 

6、数组中如果存储的是java对象的话,实际上存储的是对象的引用(内存地址)

 

7、数组一旦创建,在java中规定,数组长度不可改变

 

8、数组的分类:一维数组、二维数组、三维数组

 

9、所有数组对象都有length属性(java自带的),用来获取数组中元素的个数

 

10、java中的数组要求数组中元素的类型统一,比如:int类型数组只能存储int类型,Person类型数组只能存储Person类型

 

11、数组在内存方面存储的时候,数组中的元素内存地址是连续的 (存储的每一个元素都是有规则的挨着排列的)

 

12、所有的数组都是拿“第一个小方框的内存地址”作为整个数组对象的内存地址

       这就意味着只要我们获取到数组的第一个内存地址,就可以通过数学表达式推算出数组其它空间的内存地址


图示:

 

 

图示:

 

13、数组的每一个元素都是有下标的,下标从0开始,以1递增,最后一个元素的下标是length - 1

       下标非常重要,因为我们对数组中元素进行存取的时候,都需要通过下标进行

 

 

 

14、数组这种数据结构的优点和缺点:

优点:

查询、查找、检索某个下标上的元素时效率极高。可以说是查询效率最高的一个数据结构

为什么检索效率高:

第一:每一个元素的内存地址在空间存储上都是连续的

第二:每一个元素的类型相同,所以占用的内存空间大小是一样的

第三:知道第一个元素的内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址

           直接通过内存地址定位元素,所以数组的检索效率是最高的

数组中存储100个元素,或者存储100万个元素,在元素查询、检索方面,效率是相同的,因为数组中元素查找的时候,不会一个个找,是通过数学表达式计算出来的

【算出一个内存地址,直接定位的】

 

 

缺点:

第一:由于为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,效率极低,因为随机增删元素会设计到后面元素统一向前或者向后位移的操作。

第二:数组不能存储大的数据量,因为很难在内存空间中找到一块特别大的连续的内存空间

 

注意:对于数组中,最后一个元素的增删,是没有效率影响的

 

 

15、怎么声明一个一维数组?

语法格式:

int[ ] array1;

double[ ] array2;

String[ ]  array3;

Object[ ] array4;

 

16、怎么初始化一个一维数组呢?

包括两种方式:静态初始化一维数组,动态初始化一维数组

静态初始化语法格式:

int[ ] array = {100,200,300};

 

动态初始化语法格式:

int[ ] array = new int [5];

这里的5表示数组的元素个数,意思是初始化一个5个长度的int类型数组,每个元素默认值为0

String[ ] names = new String[6];

这里的6表示数组的元素个数,意思是初始化一个6个长度的String类型数组,每个元素默认值为null

 

案例测试:

package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/2/15 20:42* @Copyright 公司*/
public class ArrayTest01 {public static void main(String[] args) {//声明一个int类型的数组,使用静态初始化的方式int[] a1={1,100,10,20};//所有的数组对象都有length属性System.out.println("数组中元素的个数"+a1.length);//数组中的每个元素都有下标//通过下标对数组中的元素进行存取System.out.println("第一个元素"+a1[0]);System.out.println("最后一个元素"+a1[3]);System.out.println("最后一个元素"+a1[a1.length-1]);}
}

 

运行结果:

 

 

以下演示静态初始化数组的例子:

package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/2/15 20:42* @Copyright 公司*/
public class ArrayTest01 {public static void main(String[] args) {//声明一个int类型的数组,使用静态初始化的方式int[] a1={1,100,10,20};//所有的数组对象都有length属性System.out.println("数组中元素的个数"+a1.length);//数组中的每个元素都有下标//通过下标对数组中的元素进行存(改操作)/取(读操作)System.out.println("第一个元素"+a1[0]);System.out.println("最后一个元素"+a1[3]);System.out.println("最后一个元素"+a1[a1.length-1]);//存(改操作)//把第一个元素改为100a1[0]=100;//把最后一个元素改为1a1[3]=1;a1[a1.length-1]=1;//结果演示System.out.println("修改后第一个元素"+a1[0]);System.out.println("修改后最后一个元素"+a1[3]);System.out.println("修改后最后一个元素"+a1[a1.length-1]);//一维数组如何遍历呢?for (int i=0;i<a1.length;i++){System.out.println("遍历后的数组为"+"第"+i+"个"+a1[i]);}//下标为4表示为第5个元素,系统检测到第5个元素没有,说明下标越界,会出现下标越界异常//ArrayIndexOutOfBoundsException//System.out.println(a1[4]);//从最后一个元素遍历到第1个元素for(int i=a1.length-1;i>=0;i--){System.out.println("颠倒遍历后的数组为"+"第"+i+"个"+a1[i]);}}
}

演示结果:

 

 

 

 

以下是动态初始化一维数组的演示:

什么时候采用静态初始化方式,什么时候使用动态初始化方式?

静态初始化:当你创建数组的时候,确定数组中存储哪些具体的元素时候,采用静态初始化的方式

动态初始化:当你创建数组的时候,不决定将来数组中存储哪些数据,你可以采用动态初始化的方式,预先分配内存空间

package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/2/16 21:55* @Copyright 公司*/
public class ArrayTest02 {public static void main(String[] args) {//声明一个数组,采用动态初始化的方式创建//创建长度为3的数组,数组中每个元素都存在系统自带的默认值int[] a=new int[3];//遍历数组for(int i=0;i<a.length;i++){System.out.println("遍历出数组的"+i+"个元素"+a[i]);}}
}

 

 

 

以下演示的是方法的参数是数组的时候的例子

package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/2/16 22:47* @Copyright 公司*/
public class ArrayTest04 {public static void main(String[] args) {//静态初始化一维数组int[] a={1,2,3};printArray(a);//思考:传递一个静态数组的是时候,为什么下面这样语法不行//printArray({1,2,3});//动态初始化一维数组int[] a2=new int[3];printArray(a2);//和上面的不同之处在于,数组内的值是自定义的,不是系统默认的,相当于静态一维数组printArray(new int[]{1,2,3});}//为什么要使用静态方法?因为方便,不需要new对象public static void printArray(int[] array){for (int i = 0; i <array.length; i++) {System.out.println(array[i]);}}
}

 

 

思考:

main方法上面的String[] args 有什么用?

分析:

谁负责调用main方法

答案:

JVM

JVM调用main方法的时候,会自动传递一个String数组过来

main方法上面的String[] args 数组主要是用来接收用户输入参数的

package com.lbj.javase.array;public class ArrayTest05 {public static void main(String[] args) {//JVM默认传递过来的这个数组对象的长度默认是0//通过测试得出args不是nullSystem.out.println("JVM传递过来的String数组参数,它这个数组的长度是?"+args.length);//这个数组什么时候里面会有值呢?//其实这个数组是留给用户的,用户可以在控制台上输入参数,这个参数会自动被转换成 String[] agrs}
}

 

 

模拟一个系统,假设这个系统要使用,必须输入用户名和密码
package com.lbj.javase.array;/**
模拟一个系统,假设这个系统要使用,必须输入用户名和密码*/
public class ArrayTest06 {//用户名和密码输入到String[] args 数组中public static void main(String[] args) {if (args.length != 2) {System.out.println("请输入正确的格式例如 张三 123");return;}//程序执行到此处说明用户提供了账号和密码//接下来你就应该判断账号和密码是否正确//取出账号String name=args[0];//取出密码String password=args[1];//假设账号是admin,密码是123//判断这两个字符串是否相等,需要使用equals方法//if(name.equals("admin") && password.equals("123")){//上面写可能会导致空指针异常//采用以下编码风格,即使name和password都是null,也不会出现空指针异常//这是老程序员给的建议if("admin".equals(name) && "123".equals(password)){System.out.println("登录成功");}else{System.out.println("对不起,账号密码不存在");}}
}

 

 

 

 

 

 

 

 

 

一维数组的深入,数组中存储的类型为:引用数据类型
 对于数组来书,实际上只能存储java对象的内存地址,数组中存储的每个元素都是“引用”

package com.lbj.javase.array;/**
一维数组的深入,数组中存储的类型为:引用数据类型对于数组来书,实际上只能存储java对象的内存地址,数组中存储的每个元素都是“引用”*/
public class ArrayTest07 {public static void main(String[] args) {//静态初始化创建一个Animal类型的数组Animal a1=new Animal();Animal a2=new Animal();Animal[] animals={a1,a2};//对数组进行遍历for (int i = 0; i <animals.length ; i++) {Animal a=animals[i];a.move();System.out.println("遍历结果为"+i+animals[i]);}//动态初始化一个长度为2的Animal类型一维数组Animal[] a3=new Animal[2];//创建一个animal对象,放到数组的第一个盒子中a3[0]=new Animal();//Animal和Product没有关系,因此Animal数组中只能存放Animal类型的数据//a3[1]=new Product();报错//Animal数组中可以存放Cat类型的数据,因为Cat是一个Animal的子类//子类对象指向父类,这就是多态的用法a3[1]=new Cat();//向下类型转换要强制类型转换,向上类型转换需要自动类型转换//创建一个Animal类型的数组,数组中存放的Cat和BirdCat cat=new Cat();Bird bird=new Bird();Animal[] animals1={cat,bird};//Animal[] animals1={new Cat(),new Bird()};//该数组中存储了两个对象的内存地址for (int i = 0; i <animals.length ; i++) {//这个取出来可能是Cat类型的,也可能是Bird类型的,不过,肯定是一个Animal类型的//注意:以下代码演示的是如果调用的方法是父类中存在的方法则不需要向下转型,直接使用父类型调用即可//向下类型转换要强制类型转换,向上类型转换需要自动类型转换//注意:这里不是向下转型,这是子类重写了父类的方法,多以调用子类的时候运行的是Cat和BirdAnimal animals2=animals1[i];animals2.move();//调用子类中特有方法的话,需要向下转型if(animals1[i] instanceof Cat){Cat cat1= (Cat) animals1[i];cat1.catchMouse();}else if(animals1[i] instanceof Bird){Bird bird1= (Bird) animals1[i];bird1.sing();}}}}class Animal{public void move(){System.out.println("move...");}
}//创建一个毫不相关的商品类
class Product{}//创建一个继承Animal类的子类Cat类
class Cat extends Animal{//重写父类的方法public void move(){System.out.println("Cat can moveCat...");}//Cat类特有的方法public void catchMouse(){System.out.println("Cat can catchMouse");}
}//创建一个继承Animal类的子类Bird类
class Bird extends Animal{//重写父类的方法public void move(){System.out.println("Bird can moveBird...");}//Bird类特有的方法public void sing(){System.out.println("Bird can sing");}}

 

 

 

关于一维数组的扩容

问:

在java开发中,数组长度一旦确定意味着不可变,呢们数组满了怎么办?

答案:

数组满了需要扩容

问:

如何扩容

答案:

java中对数组的扩容是,先创建一个大容量的数组,然后将原先小容量数组中数据一个一个拷贝到大数据中

结论:

数组扩容效率较低,因为涉及到拷贝问题,应该尽可能少进行对数组的扩容

解决:

可以在创建数组对象的时候预估计一下多长合适,这样可以减少数组的扩容次数,提高效率

 

因此我们引入一个方法

    public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);
Object src源数组地址、int  srcPos源数组拷贝位置、Object dest新数组地址、int destPos新数组拷贝位置、int length拷贝长度

 

其实拷贝就是将内存地址进行复制到一个新的位置去存储,新的数组实际上也是用内存地址去指向对象,只不过新数组和源数组的内存地址不一致

 

以下是代码演示:

package com.lbj.javase.array;/**
java中数组的拷贝*/
public class ArrayTest08 {public static void main(String[] args) {//    public static native void arraycopy(Object src,  int  srcPos,//                                        Object dest, int destPos,//                                        int length);//Object src源数组地址、int  srcPos源数组拷贝位置、Object dest新数组地址、int destPos新数组拷贝位置、int length拷贝长度//源数组地址int[] src={1,2,3};//新数组地址int[] dest=new int[20];//调用JDK System类中的arraycopy方法,来完成数组的拷贝//System.arraycopy(src,1,dest,2,1);//如果源数组的拷贝位置和拷贝长度有矛盾,拷贝会报错//        Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException//	at java.lang.System.arraycopy(Native Method)//	at com.lbj.javase.array.ArrayTest08.main(ArrayTest08.java:22)System.arraycopy(src,1,dest,2,src.length);//拷贝源数组的全部元素到新数组上//System.arraycopy(src,0,dest,0,src.length);//遍历拷贝完后的新数组for (int i = 0; i <dest.length ; i++) {System.out.println(dest[i]);}}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python画五角星填充不同颜色_不同颜色牡丹怎么画?3种牡丹图解教你画,适合0基础学习,收藏...

不同颜色的牡丹画法【黄牡丹】1 选取小号羊毫笔&#xff0c;笔肚先蘸取白粉&#xff0c;再在笔尖蘸藤黄稍加调和&#xff0c;运用斡水法&#xff0c;瓣片环花心而发&#xff0c;第一层花瓣要成弧形排列。2 再在笔尖上蘸藤黄&#xff0c;待蘸饱后&#xff0c;笔尖向内&#xff0…

JAVA进阶开发之(二维数组)

1、二维数组其实是一个特殊的一维数组&#xff0c;特殊在这个二维数组中每一个元素是一个一维数组 2、就是一维数组里面都是一样的元素&#xff0c;二维数组就是把元素换成了一维数组 3、实际开发中&#xff0c;使用最多的就是一维数组&#xff0c;二维数组很少使用&#xff0c…

python语言中包含的标准数据类型_Python对象——标准类型的分类

如果让我们最啰嗦的描述标准类型&#xff0c;我们也许会称它们是Python 的“基本内建数据对象原始类型”。 z “基本”&#xff0c;是指这些类型都是Python 提供的标准或核心类型。 z “内建”&#xff0c;是由于这些类型是Python 默认就提供的 z “数据”&#xff0c;因为他们…

JAVA进阶级开发之(Array工具类)

目录 常见的算法&#xff1a; 1、排序算法&#xff1a; 2、查找算法&#xff1a; 3、算法&#xff1a; 4、冒泡排序算法&#xff08;理论&#xff09; 4、选择排序算法&#xff08;理论&#xff09; 5、数组的元素查找&#xff1a; 6、介绍一下java.util.Arrays工具类 …

css怎么使元素绝对定位有过度效果_CSS定位属性Position实例分析

CSS所提供的Position定位属性在进行网页页面布局过程中非常重要&#xff0c;通过使用Position定位属性可以实现对页面元素进行精确定位&#xff0c;最终达到较好的设计及页面展示效果。本文主要针对Position属性设计教学案例&#xff0c;实现教学。CSS学习教程Position定位属性…

JAVA进阶开发之(String字符串的存储原理)

我们现在开始学习的就是一些工具类 这些工具类只需要我们学会查阅帮助文档进行开发就可以实现很多功能 例如&#xff1a;我们查看工具类String 关于java JDK中内置的一个类&#xff1a;java.lang.String 1、String表示字符串类型&#xff0c;属于引用数据类型&#xff0c;不属…

sqlmap使用_sqlmap于sql labs下使用

本文主要是写sqlmap在sql labs下的使用学习记录&#xff0c;目的在于模拟黑盒测试&#xff0c;不太在意原理。&#xff08;当然&#xff0c;原理还是要学习好才这么干的。&#xff09;不得不说收获还是蛮大的。首先推荐下sqlmap使用的学习视频。1-9&#xff1a;python sqlmap.p…

JAVA进阶教学之(String类的构造方法)

试题&#xff1a; 问&#xff1a;以下程序一共创建了几个对象 public class StringTest03 {public static void main(String[] args) {String s1new String("aaa");String s2new String("aaa");} }答&#xff1a;一共创建了3个对象 1个对象是"aaa&…

JAVA进阶教学之(String类的常用方法)

接下来我们进入的学习章程&#xff0c;就是可以通过查阅帮助文档进行实际的应有 1. charcharAt(int index) 返回指定索引的 char价值。 代码示例&#xff1a; public class StringTest04 {public static void main(String[] args) {//String中常用的方法//“中国人”是一个…

sql having是什么意思_图解sql面试题:如何查找重复数据?

【题目】编写一个SQL查询&#xff0c;查找学生表中所有重复的学生名。【解题思路】1.看到“找重复”的关键字眼&#xff0c;首先要用分组函数&#xff08;group by&#xff09;&#xff0c;再用聚合函数中的计数函数count()给姓名列计数。2. 分组汇总后&#xff0c;生成了一个如…

JAVA进阶教学之(StrngBuffer进行字符串拼接)

使用StringBuffer字符串拼接目的就是为了让字符串占用的内存空间减少&#xff0c;提高效率 思考&#xff1a;我们在实际的开发中&#xff0c;如果需要进行字符串的频繁拼接&#xff0c;会有什么问题&#xff1f; 答案&#xff1a; 因为java中的字符串是不可变的&#xff0c;每一…

JAVA进阶教学之(StringBuider进行字符串拼接)

这一章节我们学习到的是StringBuider进行字符串拼接&#xff0c;有同学们问&#xff0c;为什么学了StringBuffer字符串拼接后还要看这个&#xff0c;下面我们来说道说道 代码演示&#xff1a; public class StringTest06 {public static void main(String[] args) {StringBui…

javamail 解码 base64 html格式邮件_python使用QQ邮箱实现自动发送邮件

最近用到Python自动发送邮件&#xff0c;主要就是三步&#xff0c;登录邮件、写邮件内容、发送&#xff0c;用到的库是 smtplib 和 email&#xff0c;直接使用pip安装即可我使用的是QQ邮箱&#xff0c;首先需要设置QQ邮箱POP3/SMTP服务记住这个授权码&#xff0c;这个授权码就是…

JAVA进阶教学之(8种包装类)

代码演示&#xff1a; public class IntegerTest01 {public static void main(String[] args) {//把100这个数字经过构造方法包装成对象MyInt myInt new MyInt(100);//doSome()方法虽然不能直接传100,但是可以传一个100对应的包装类型IntegerTest01.doSome(myInt);}public sta…

java 线程状态_面试官问:为什么Java线程没有Running状态?我懵了

点击上方“占小狼的博客”&#xff0c;选择“设为星标“本文阅读时间大约4分钟。来源&#xff1a;https://dwz.cn/dLRLBZabJava虚拟机层面所暴露给我们的状态&#xff0c;与操作系统底层的线程状态是两个不同层面的事。具体而言&#xff0c;这里说的 Java 线程状态均来自于 Thr…

viewpager 自定义翻页效果_Android RecyclerView自定义LayoutManager

在第一篇中已经讲过&#xff0c;LayoutManager主要用于布局其中的Item&#xff0c;在LayoutManager中能够对每个Item的大小&#xff0c;位置进行更改&#xff0c;将它放在我们想要的位置&#xff0c;在很多优秀的效果中&#xff0c;都是通过自定义LayoutManager来实现的&#x…

delphi gui编辑工具源码_Python 快速构建一个简单的 GUI 应用

点击上方“AirPython”&#xff0c;选择“加为星标”第一时间关注 Python 技术干货&#xff01;1. 介绍Python GUI 常用的 3 种框架是&#xff1a;Tkinter、wxpython、PyQt5PyQt5 基于 Qt&#xff0c;是 Python 和 Qt 的结合体&#xff0c;可以用 Python 语言编写跨平台的 GUI …

Python入门级教学之(Python中的输出函数)

print()函数 括号内容可以是数字、字符串、含有运算符的表达式 输出的目的地是显示器、文件 输出的形式是换行、不换行 代码演示&#xff1a; # 项目负责人: LBJ # 开发日期&#xff1a;2021/3/16 20:36# 输出数字、字符串、运算表达式 print(123) print("123") pri…

processing创意图形代码_2020年外贸B2C店铺的黑色星期五创意营销想法(下)

10.外贸B2C店铺黑色星期五创意营销理念——创建促销内容日历随着黑色星期五的临近&#xff0c;您将希望巩固自己的整体策略。伟大的第一步是创建一个内容日历&#xff0c;其中要共享什么资产和内容以及何时共享。计划提前一个月计划&#xff0c;并在黑色星期五的一周开始促销活…

python 识别图形验证码_Python验证码识别

大致介绍在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题&#xff0c;现在的验证码大多分为四类&#xff1a;1、计算验证码2、滑块验证码3、识图验证码4、语音验证码这篇博客主要写的就是识图验证码&#xff0c;识别的是简单的验证码&#xff0c;要想让识别…