关于数组

简介:

1.数组的初始化:

    静态初始化: 程序员在初始化数组时为数组每个元素赋值;

        动态初始化: 数组初始化时,程序员只指定数组的长度,由系统为每个元素赋初值。

复制代码
 1 public class ArrayInit {  
 2     public static void main(String[] args) {  
 3         //String[] str = new String[];
 4         //这样初始化数组是错误的.和String字符串是不一样的.
 5         //数组初始化最起码要指定长度.
 6         
 7         //静态初始化数组:方法一      
 8         String cats[] = new String[] {  
 9                 "Tom","Sam","Mimi"  
10         };  
11         //静态初始化数组:方法二  
12         String dogs[] = {"Jimmy","Gougou","Doggy"};  
13         
14         //动态初始化数据  
15         String books[] = new String[2];  
16         books[0] = "Thinking in Java";  
17         books[1] = "Effective Java";  
18           
19         System.out.println(cats.length);  
20         System.out.println(dogs.length);  
21         System.out.println(books.length);  
22     }  
23 }
复制代码

 

  2.数组是否必须初始化

        对于这个问题,关键在于要弄清楚数组变量和数组对象的差别。数组变量是存放在栈内存中的,数组对象是存放在堆内存中的。数组变量只是一个引用变量,它能够指向实际的数组对象。

       所谓的数组初始化并非对数组变量初始化,而是对数组对象进行初始化。

       数组必须要有其长度。

关于内存的划分:

复制代码
内存的划分
1.    寄存器   CPU处理的。
2.    本地方法区  所在系统相关的。 java的jvm分版本,不同的系统,不同的jvm。
3.    方法区  以后讲。。。现在还没有接触到更多的类加载方式。
4.    栈内存
      存储的都是局部变量。(方法中的变量都是局部变量)
          变量所属的作用用户一旦结束,该变量就自动释放
          栈内存的更新速度很快,因为局部变量的生命周期都比较短
5.    堆内存
存储是数组和对象(其实数组就是对象) 凡是new建立在堆中。
复制代码

 

复制代码
特点:
1.    每一个实体都有一个首地址值。
2.    堆内存中的每一个变量都有一个变量默认初始化值,
      根据类型的不同而不同,整数是0,小数是0.0或者0,0f。boolean是false
      char类型是’\u0000’(带转义字符,是unicode编码,是空格的意思)
3.    垃圾回收机制。
复制代码

 

 关于下面语句的分析:

int [] arr = new int [3];

 

arr 是局部变量,在主函数中,(局部变量在栈中,局部变量又在主函数中,所以主函数也在栈中,方法不进栈,局部变量也无法进栈)。

new int[3] 是数组对象,在堆内存中,是实体,是实实在在存储的个体。实体就是用来封装数据,而且可以用来封装多个。实体中有一堆数据,有一个挂了,其他的还可以用,

但是栈内存中都是存储的变量,挂了接着消失。堆内存中的实体中变量会默认初始化值,栈内存不会默认初始化,不同类型初始化的内容是不一样的。

 

如果想让arr不做任何指向,给arr=null,就取消了arr的指向。

这样之前的指向就取消了,之前指向的内容不会在堆内存中自动释放,而是作为垃圾在堆内存中,java中有垃圾回收机制是一段程序,至于什么时候去回收不知道。

优秀的内存管理机制。但是c++中的垃圾是由程序员手动去处理垃圾。是由析构函数来处理的,否则在内存中会越积越多。多了就挂了。。。

关于int [] arr = new int [3];内存分析图:

分析图二:

多个实体可以指向同一个对象。

数组越界和空指针异常是数组中经常遇到的异常

ArrayIndexOutofBounds 和 NullPointException

 直接打印数组对象,打印出来的是打印出的是数组实体的哈希值。

System.out.println(arr)@****  [I@52e922 [F@52e922

哈希是一种算法,由这种算法来定义数组实体在内存中的位置,可以简单的理解为地址值。

但是在javascript中个直接打印数组对象arr可以直接打印出数组中的内容(貌似是字符串的方式,数组中的每个元素之间还有逗号隔开,这是和java不同的地方。

关于哈希值:

该地址值是由windows来支持的,java是通过调用windows的这种哈希编码方式来算出其位置

最终开辟内存空间是windows说了算。

哈希值是十六进制值

@的左边是实体的类型 带中括号是数组类型 有字母I是Int类型

@的右边不用看,只看左边就能知道是什么类型的实体

进制越大表现形式越短。内存地址都是用十六进制来表示的。


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4307077.html,如需转载请自行联系原作者

相关文章
|
Kubernetes API 计算机视觉
利用 member update 实现 etcd 灾难恢复 [也可实现 etcd 集群迁移]
利用 member update 实现 etcd 灾难恢复 [也可实现 etcd 集群迁移]
1635 0
|
存储 算法 NoSQL
6 种常见分布式唯一ID生成策略及它们的优缺点对比
全局唯一的 ID 几乎是所有系统都会遇到的刚需。这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义
6 种常见分布式唯一ID生成策略及它们的优缺点对比
|
人工智能 测试技术 数据中心
|
程序员 持续交付 开发工具
4种常见分支模式解析及优劣对比 | 研发效能提升36计
团队研发的本质并不是团队规模越大,研发的效率就越高。我们以为团队规模越大,研发效率就会越高,可以做越多的东西,但是我们发现团队规模大到一定程度,整个研发效率是会下降的,甚至降得非常快。为什么团队的规模越来越大,我们的发布反而越来越慢了?
1460 1
4种常见分支模式解析及优劣对比 | 研发效能提升36计
|
SQL 关系型数据库 MySQL
数据库的连接方法
数据库的连接方法
480 0
数据库的连接方法
|
Linux Windows
linux实用技巧:ubuntu18.04安装配置ibus中文输入法
linux实用技巧:ubuntu18.04安装配置ibus中文输入法
linux实用技巧:ubuntu18.04安装配置ibus中文输入法
|
IDE 测试技术 开发工具
用 airtest 做滑动解锁怎么搞?其实很简单!
用 airtest 做滑动解锁怎么搞?其实很简单!
1022 0
用 airtest 做滑动解锁怎么搞?其实很简单!
|
存储 数据采集 分布式计算
连载:阿里巴巴大数据实践—实时技术
相对于离线批处理技术,流式实时处理技术作为一个非常重要的技术补充,在阿里巴巴集团内被广泛使用。
4555 0
连载:阿里巴巴大数据实践—实时技术
|
Cloud Native Java 测试技术
手把手教你在本地搭建 Nacos 服务注册和配置管理中心
Hello 大家好,我是阿粉,现如今微服务早就成为每个互联网公司必备的架构,在微服务中服务的注册发现和统一配置中心是不可或缺的重要角色。现有的服务注册中心主要有 ZooKeeper、Eureka、Consul ,Etcd、Nacos,而统一配置中心主要有 Apollo,Spring Cloud Config,Disconf,Nacos 可以看到服务注册中心和统一配置管理有很多,而且每一种都是网上比较流行的,使用人数也偏多,但是我们可以发现只有 Nacos 是集两者于一身的。这篇文章主要给大家介绍一下 Naocs 的基本信息以及安装步骤,后面的文章再带大家更深入的了解一下Nacos。
2003 0
手把手教你在本地搭建 Nacos 服务注册和配置管理中心