精华内容
下载资源
问答
  • 声明一个数组的过程中是如何分配内存的②Java数组初始化一共有哪几种方式③基本数据类型数组和引用类型数组之间,初始化时内存分配机制有什么区别一.java的初始化java数组是静态的,必须经过初始化后才能使用,...

    ——疯狂Java读书笔记

    3个问题:

    ①java中,声明一个数组的过程中是如何分配内存的

    ②Java数组的初始化一共有哪几种方式

    ③基本数据类型数组和引用类型数组之间,初始化时内存分配机制有什么区别

    一.java的初始化

    java数组是静态的,必须经过初始化后才能使用,并且一旦初始化指定了数组的长度,该长度是不可变的。

    两种初始化的方式:

    1.静态初始化:初始化时由程序猿显示指定每个数组元素的初始值,由系统决定数组的长度

    举个栗子:

    String[] names = new String[]{"孙猴子","唐僧","猪八戒"};

    2.动态初始化:就是与静态初始化相对的撒,23333。其实动态初始化就是在初始化的时候指定数组长度(这时已经分配内存)

    举个栗子:

    String[] names = new String[3];

    names[0]="孙猴子";

    names[1]="唐僧";

    names[2]="猪八戒";

    但是初始化只有这两种方式吗?我们需要理解到真正的初始化到底做了什么工作。

    先了解一下初始化后它在内存中是这个样子的。

    73971b5b16da

    初始化后的内存示意图.png

    提示:所有的局部变量都是放在栈内存中保存的,不管其实基本类型的变量还是引用类型的变量,都是存储在各自的方法栈区中;但引用类型变量所引用的对象(包括数据,普通java对象)则总是存储在堆内存中。

    Java中数组是引用变量(类似于C语言中的指针变量),我们初始化操作后,就是将它的引用指向了堆内存中开辟的指定长度的连续内存空间。

    所以我们真正所做的初始化是将栈中数组变量指向有效的内存。

    这样初始化也是完全可以的。

    String[] names = new String[3];

    names[0]="孙猴子";

    names[1]="唐僧";

    names[2]="猪八戒";

    String[] names2;

    names2 = names;

    对于java中的所有引用变量,它们都不需要经过所谓的初始化操作,需要进行初始化操作的是该应用变量所引用的对象。比如,数组变量不需要进行初始化操作,而数组对象本身需要初始化;对象的引用变量也不需要初始化,而对象本身才需要进行初始化

    基本类型的初始化

    两个步骤:

    ①程序直接先为数组分配内存空间

    ②再将数组元素的值存入对于的内存中

    int iArr[];

    iArr = new int[]{1,2,3};

    73971b5b16da

    基本数据类型初始化后再内存中的存储形式.png

    引用类型的初始化

    引用类型数组中的元素仍然是引用类型,因此数组元素里存储的还是引用,它指向另一块内存。

    public static void main(String[] args){

    People[] peoples = new People[2];

    People people1 = new People();

    people1.name = "小明";

    People people2 = new People();

    people2.name = "小红";

    people[0] = people1;

    people[1] = people2;

    }

    public static class People{

    public String name;

    }

    下面对应内存中的分配流程:

    73971b5b16da

    peoples数组初始化

    73971b5b16da

    两个对象初始化完成

    73971b5b16da

    为数组元素赋值后

    从上图我们可以看到,people1与people[0]、people2与people[1]指向的是同一内存区(堆内存)的。(这里与java中的值传递有关系)

    展开全文
  • 最近在看一本李刚老师的书《java程序员的基本修养》,看了之后突然觉得自己虽然用了两年的java却实际上根本了解java ...3.基本类型数组和引用类型数组之间,在初始化时的内存分配机制有什么区别? class Java

    最近在看一本李刚老师的书《java程序员的基本修养》,看了之后突然觉得自己虽然用了两年的java却实际上根本不了解java

    下面就来分享一下学习经历吧!

    有如下几个问题:

    1.在java中,声明并创建数组的过程中,内存是如何分配的?

    2.java数组的初始化一共有哪几种方式?

    有如下程序:

    class JavaTest
    {
        //数组的内存分配
        public static void main(String[] args)
    	{
    	   //数组初始化有两种方式,一种是静态初始化,一种是动态初始化
    	   //静态初始化第一个数组
    	   String[] books = new String[]{
    	      "java程序设计",
    		  "C程序设计",
    		  "C++程序设计"
    	   };
    	   //动态初始化第二个数组
    	   String[] names = new String[5];
    	   //初始化数组时,数组变量books和names保存在栈内存中,他们的值只是指向数组对象的地址,
    	   //而数组对象保存在堆内存中
    	   System.out.println("第一个数组的长度:"+books.length);//3
    	   System.out.println("第二个数组的长度:"+names.length);//5
    	   //此时在内存的分配如图1.1所示
    	   
    	   //注意:
    	   //1、不要同时使用静态初始化和动态初始化
    	   //2、数组元素的内存空间分配结束之后程序只能改变数组的值,而无法改变数组的长度,但有如下情况
    	   
    	   //将数组books赋给names
    	   names = books;
    	   System.out.println("改变后的第二个数组的长度:"+names.length);//3
    	   //注意:这里确实改变了长度,但是原本初始化的第二个数组对象并没有改变,改变的是names这个变量,
    	   //如图1.2所示,names变量重新引用了第一个数组对象,这样造成的数组可以改变的假象
    	   
    	}
         
    }



    3.基本类型数组和引用类型数组之间,在初始化时的内存分配机制有什么区别?

    上面讲的是基本类型数组的初始化,接下来讲讲引用类型数组的初始化

    有如下程序

    class Person
    {
       public int age;
       public String name;
       public void info(){
          System.out.println("我的名字:"+name);
       }
    }
    
    class ReferenceArray
    {
     
       public static void main(String[] args)
    	{
    	//动态初始化一个引用类型数组
    	  Person[] students;
    	  students = new Person[2];
    	  //此时内存分配如图1.3所示
    	  System.out.println("students所引用的数组的长度是:"+students.length);
    	  //创建一个Person实例
    	  Person zhong = new Person();
    	  zhong.age=20;
    	  zhong.name="joffy";
    	  
    	  //创建另一个Person实例
    	  Person lee = new Person();
    	  lee.age=21;
    	  lee.name="david";
    	  //此时内存分配如图1.4所示
    	  //将两个person实例赋给students数组
    	  students[0]=zhong;
    	  students[1]=lee;
    	  //students数组保存的仍然是一个引用,指向另一块内存,该内存保存zhong和lee对象
    	  //调用info方法
    	  lee.info();//david
    	  students[0].info();//joffy
    	}
    }


    以上就是本次介绍的内容,如果有错的地方欢迎补充讨论



    展开全文
  • char c[10]="hello"有什么区别呢? 字符串常量存储在数据区中的常量区,好处是相同的字符串,比如hello只会存储一遍,常量区的含义就是字符串本身是可修改的,所以我们称之为字符串常量,hello存在字符串常量区...

    字符指针和字符数组的初始化

    例如: char *p=“hello”;和char c[10]="hello"有什么区别呢?

    字符串常量存储在数据区中的常量区,好处是相同的字符串,比如hello只会存储一遍,常量区的含义就是字符串本身是不可修改的,所以我们称之为字符串常量,hello存在字符串常量区,占用6个字节,有自己的首地址。

    char *p="hello"是将字符串常量"hello"的首地址赋值给p
    char c[10]=“hello”,字符数组c在栈空间有10个字节大小的空间,这个初始化是将字符串hello通过strcpy给字符数组c
    因此我们可以将c[0]修改为H,而p[0]拿到的是常量区的空间,所以不可以修改。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      //字符指针 指向常量区的首地址
    	char *p="hello";
      //字符数组 等价于strcpy(c,"hello");
    	char c[10]="hello";
    	c[0]='H';
    	//p[0]修改的是首地址,不可以
    	// 字符串本身代表着地址
    	printf("p=%s\n",p);
    	printf("c=%s\n",c);
    	system("pause");
    }
    
    展开全文
  • 两种类型的数组。...给定值的语法(变量/字段初始化):int[]num={1,2,3,4,5};或者(太喜欢)intnum[]={1,2,3,4,5};注意:为了方便int [] num更可取,因为它清楚地告诉你这里是关于数组的。否则没什么区别。一点...

    有两种类型的数组。

    一维数组

    默认值的语法:int[] num = new int[5];

    或者(不太喜欢)int num[] = new int[5];

    给定值的语法(变量/字段初始化):int[] num = {1,2,3,4,5};

    或者(不太喜欢)int num[] = {1, 2, 3, 4, 5};

    注意:为了方便int [] num更可取,因为它清楚地告诉你这里是关于数组的。否则没什么区别。一点也不。

    多维数组

    宣言int[][] num = new int[5][2];

    要么int num[][] = new int[5][2];

    要么int[] num[] = new int[5][2];

    初始化num[0][0]=1;

    num[0][1]=2;

    num[1][0]=1;

    num[1][1]=2;

    num[2][0]=1;

    num[2][1]=2;

    num[3][0]=1;

    num[3][1]=2;

    num[4][0]=1;

    num[4][1]=2;

    要么int[][] num={ {1,2}, {1,2}, {1,2}, {1,2}, {1,2} };

    衣衫褴褛的阵列(或非矩形阵列)int[][] num = new int[5][];

    num[0] = new int[1];

    num[1] = new int[5];

    num[2] = new int[2];

    num[3] = new int[3];

    所以我们在这里明确定义列。

    其他方式:int[][] num={ {1}, {1,2}, {1,2,3,4,5}, {1,2}, {1,2,3} };

    用于访问:for (int i=0; i

    for (int j=0;j

    System.out.println(num[i][j]);}

    或者:for (int[] a : num) {

    for (int i : a) {

    System.out.println(i);

    }}

    Ragged数组是多维数组。

    有关解释,请参阅官方java教程中的多维数组详细信息

    展开全文
  • 声明一个数组的过程中是如何分配内存的②Java数组初始化一共有哪几种方式③基本数据类型数组和引用类型数组之间,初始化时内存分配机制有什么区别一.java的初始化java数组是静态的,必须经过初始化后才能使用,...
  • 定义一个函数如下: test() { char a; char b[10]; } 编译后test的入口地址假设为0x5000; 改写后 test() { char a=0; char b[10];...为什么这样的区别,数据char变量的初始化不一样吗?
  • 在我们刷数据结构面试题的时候总会看见一道数组和链表有什么区别的题目,很显然这是一道考的非常频繁的问题,也是非常基础的一道数据结构问题,然而他的答案也非常的显而易见。数组在申请内存空间的时候需要连续的...
  • Array:它是数组,申明数组的时候就要初始化并确定长度,长度可变,而且它只能存储同一类型的数据,比如申明为String类型的数组,那么它只能存储S听类型数据 ArrayList:它是一个集合,需要先申明,然后再添加...
  • A: int a[10]={ } //大括号里写值初始化值为0;写,初始化为随机数Int b[] = {1,2,3,4,5,6,7,}编译,链接,执行(编译时得到数组大小)X = sizeof(b) :结果:28数组空间大小的算法:s...
  • 问题描述:我们在newHashMap(16)new ConcurrentHashMap(16)时,这两个16有什么区别呢? 结论: HashMap中initialCapacity指数组大小,比如指定inittialCapacity为16,那么初始化创建的数组大小就是16; ...
  • golang 数组和切片解析

    2020-06-16 16:11:45
    golang切片与数组数组数组的初始化函数对数组的调用切片切片的初始化切片的容量与长度切片的基本操作 数组 数组:有限个类型相同的变量的集合...go中数组初始化非常麻烦 简便主要以下方法: 仅声明不初始化会给值赋对
  • 基本数据类型数组和引用类型数组之间有什么区别,在初始化时的内存分配机制有什么区别吗? 数组初始化: java语言是典型的静态语言,因此java的数组是静态的,即当数组初始化之后,该数组的长度是可变的。...
  • 数组与内存控制

    2013-11-01 22:29:08
    ------- android培训、java培训、期待与您交流!...3,基本类型数组和引用类型数组之间,在初始化时的内存分配机制有什么区别?   Java中,数组是静态的,当数组初始化之后,该数组长度是可变的。Java
  • C语言:字符串数组与字符串指针数组

    万次阅读 多人点赞 2019-04-27 21:46:19
    1,首先,不论是局部,静态还是全局数组都必须在定义的时候初始化,否则就得通过其他方式,eg 循环操作,字符串处理函数strcpy() ...3,那么问题来了,字符串数组和字符串指针数组有什么区别 ...
  • 字符串数组与字符串指针数组

    千次阅读 2018-07-27 00:02:54
    1,首先,不论是局部,静态还是全局数组都必须在定义的时候初始化,否则就得通过其他方式,eg 循环操作,字符串处理函数strcpy() ...3,那么问题来了,字符串数组和字符串指针数组有什么区别 ...
  • 2020-08-14:HashMap HashTable 有什么区别?前言HashMap HashTable 有什么区别? 前言 每日一题专栏 HashMap HashTable 有什么区别? 一、 HashMap 是线程安全的,HashTable 是线程安全的; 二、由于...
  • 数组与其他种类的容器之间的区别有三方面 效率 类型保存基本类型的能力 数组可以持有基本类型 而泛型之前的容器则能 但是了泛型 容器就可以指定并检查它们所持有对象的类型 并且了自动包装机制 容器看起来还...
  • 它是变量的一种取值,表明变量没有初始化,如果要查询对象的属性或者数组元素的值时返回undefined,则说明这个属性或者数组元素存在,如果数组没有特定任何返回值,则返回undefined,引用没有提供实参的函数形参的...
  • ``` #include int main(void) { char arr[100] = "123456"; arr[100] = "ubdyu" ;//(能直接赋值) ...为什么字符数组不能够等号赋值字符串,而初始化可以?...初始化和赋值区别吗?
  • 十六、 数组 16.1 数组什么特殊 数组与其他种类的容器之间的区别有三方面:效率、类型保存基本类型的能力。 java中数组是一种效率最高的存储...以下是对初始化数组的各种方式以及对指向数组的引用赋值 public clas
  • 1. int *p=NULL *p=NULL 有什么区别 int *p = NULL;  第一句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是 int类型的数据;在定义变量的同时把p的值设置为 0x00000000,而不是把 *p的值设置...
  • (形式参数类型是基本数据类型String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变影响...
  • 参考答案: ①、HashMap 是线程安全的,HashTable 是线程安全的; ②、由于线程安全,所以 HashTable ...④、HashMap 默认初始化数组的大小为16,HashTable 为 11,前者扩容时,扩大两倍,后者扩大两倍+1; ⑤、H...
  • 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变影响...
  • 首先第一个指针形式的str指向一个...第二种数组形式的str,其实数组名就是指针常量,也就是说一旦他初始化了,它指向的地址就固定了,就能再用别的字符串赋值了(这就不同于指针形式的str),但是这个地址里放什么
  • List,Set,Map都是接口List、Set是继承与Collection接口,Map是键值对组成的集合List:有序可...他的初始化大小在源码中是private static final int DEFAULT_CAPACITY= 10;该集合是自动扩容;它是线程安全的,支持...
  • 以及JDK1.71.8又有什么样的区别? 我们先来介绍1.7版本的ConcurrentHashMap: 在初始化ConcurrentHashMap的时候,会初始化一个Segment数组,容量为16,而每个Segment都继承了ReentrantLock类,也就是说每个Segment...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 222
精华内容 88
关键字:

数组初始化和不初始化有什么区别