十五、内部类、数组

一、内部类

(1)什么是内部类?
在类的内部又定义了一个新的类,被称为内部类
(2)内部类的分类:
静态内部类:类似静态变量
实力内部类:类似实例变量
局部内部类:类似局部变量

1.匿名内部类

(1)是局部内部类的一种,因为没有名字得名
(2)想用一个接口先要用类实现,匿名内部类可以跳过用类实现这一步骤,之间在调用的时候new接口

二、数组

1.Java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object。

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

3.数组当中可以存储基本数据类型的数据,也可以存储引用数据类型的数据。

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

5.数组当中如果存储的是“java对象”的话,实际上存储的是对象的“引用(内存地址)”数组中不能直接存储java对象。

6.数组一旦创建,长度不可改变。

7.数组的分类:一维数组、二维数组、三维数组、多维数组…(一维数组用的较多,二维数组偶尔使用)。

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

9.java中数组要求数组中元素的类型统一。

10.数组中的数据的内存地址是连续的。数组实际上是一种简单的数据结构

11.所有的数组都是拿第一个元素的地址作为整个数组的内存地址。

12.数组中每一个元素都是有下标的,从0开始,最后一个元素的下标是:length - 1 ,下标非常重要,想要对数组的元素进行“存取”都需要下标。
 
13.数组的优点和缺点:
  优点:查询/查找/检索某个下标上的元素时效率极高。可以说是查询效率最高的一个数据结构
  为什么检索效率高?
  第一:每个元素内存地址是连续的。
  第二:每个元素类型相同,占用空间大小一样。
  第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,就能通过一个数学表达式来计算出某个下标上元素的内存地址,直接通过内存地址定位元素,所以数组的检索效率是最高的。

缺点:
 第一:由于数组中每个元素内存地址是连续的,所以想要删除或者增加元素效率较低,这涉及到增删元素后面的元素的统一向前或者向后位移的操作。
  第二:数组不能存储大数据量,因为很难在内存空间上找到一块特别大的连续的内存空间。

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

14.数组中的异常
ArrayIndexOutOfBoundsException(比较著名的异常)数值下标越界异常

1.一维数组

(1).如果声明/定义一个一维数组?

语法格式:
int[ ] array1;
double[ ] array2;
boolean[ ] array3;
String[ ] array4;
Object[ ] array5;
(2).如何初始化一个一维数组?

      2.1.静态初始化一维数组
    int[ ] array = {1, 2, 3, 4};
      2.2.动态初始化一维数组
    int[ ] array = new int[5]; //这个5表示元素的个数
                //初始化一个5个长度的int类型数值,每个元素默认值为0

      2.3.什么时候采用静态初始化方式,什么时候采用动态初始化方式
    当你创建数组的时候,确定数组中存储哪些具体的元素时,采用静态初始化方式。
    当你创建数组的时候,不确定数组中存储哪些元素的时候,可以采用动态初始化的方式,预先分配内存空间

      2.4.直接传递数组
    直接传递静态数组:printArray(new int[ ]{1, 2, 3});
    直接传递动态数组:printArray (new int[3]);
      2.5.main方法上面的“String[ ] args”有什么用?
    public static void main(String[ ] args)
    JVM在调用main方法的时候,会自动传一个String数组过来。
    相当于数组创建了,但是里面没有任何数据
    这个数组其实是留给用户的,用户可以在控制台上输入参数,这个参数会自动被转换为“String[ ] args”
    例如运行以下程序:java ArrayTest01 123 456 789
    那么这个时候JVM会自动将“123 456 789”通过空格的方式进行分离,分离完了之后,自动放到“String[ ] args”之中。

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

      2.7.关于一维数组的扩容
    对于java来说是先创建一个大的数组,然后将原本的数组一个一个拷进去。
    数组扩容效率较低,因为涉及到拷贝的问题,所以再以后的开发中,尽可能少的进行数组的拷贝,最好是在创建的时候就预估计好。

      2.8.java中的拷贝
    方法:System.arraycopy(Object src, int srcpos(源起始位置), Object dest, int destPos(目标起始位置), int length (拷贝长度))
        int[ ] src = {x, y, z, a, b}; //拷贝源(从这个数组中拷贝)
        int[ ] dest = new int[20]; //动态初始化一个长度为20的数组,每一个元素默认值为0
                    //拷贝目标(拷贝到这个目标数组上)
        System.arraycopy(src,1,dest, 3, 2 )

2.二维数组

(1).二维数组就是一个特殊的一维数组,特殊在这个一维数组当中的每一个元素是一个一维数组。

(2).三维数组是一个特殊的二维数组,特殊在这个二维数组中每一个元素是一个一维数组。
  实际开发中使用最多是一维数组,二维数组也很少不用,三维数组几乎不用。

(3).二维数组静态初始化:

int[ ][ ] a = {
             {1, 2, 3}, 
             {8, 9, 86, 99},
             {0}
};

(4).关于二维数组中元素的读和改

读: int[ ] a1(第一个一维数组)= a[0];
    int a2(第一个一维数组的第一个元素)= a1[0];
    System.out.println(a2);

合并就是:System.out.println(a[0][0]);

改: a[0][0] = 123;

(5).二维数组的遍历
  静态数组的遍历:

for(int i = 0; i < a.length(当前二维数组的长度); i++){
       for(int j = 0; j < a[i].length; j++){
            System.out.println(a[i].length + " ");
       }
       System.out.println( );
}

动态数组的遍历:

int a[ ][ ] = new int[ ][ ]
for(int i = 0; i < a.length(当前二维数组的长度); i++){
	for(int j = 0; j < a[i].length; j++){
		System.out.println(a[i][j] + “ “);
	}
	System.out.println( );
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值