精华内容
下载资源
问答
  • 动态初始化:初始化时指定数组的长度java数组变量是一种引用类型的变量数组元素和数组变量在内存里是分开的。实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存...

    初始化数组的两种方式

    1.静态初始化:初始化时指定每个元素的值

    2.动态初始化:初始化时指定数组的长度

    java数组变量是一种引用类型的变量

    数组元素和数组变量在内存里是分开的。
    实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中。
    当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈随之销毁。因此,所有在方法中定义的变量都是放在栈内存中的;当我们在程序中创建一个对象时,这个对象将被保存在运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存的独享不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量引用,则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在合适的时候回收它。


    1.基本类型数组的初始化

    当程序定义并初始化了a、b两个数组时,系统内存中实际产生了4块内存区,其中栈内存中有两个引用变量:a和b;堆内存中也有两块内存区,分别用于存储a和b引用所指向的数组本身。
    内存的存储示意图如下图所示:
    当b=a代码时,系统将会把a的值赋给b,a和b都是引用类型变量,存储的是地址。因此把a的值赋给b后,就是让b指向a所指向的地址。此时计算机内存的存储示意图如下所示:
    当执行了b=a之后,堆内存中第一个数组中具有了两个引用:a变量和b便来那个都指向了第一个数组。
    此时第二个数组失去了作用,变成垃圾,只有等待垃圾回收来回收它——但它的长度依然不会改变,直到它彻底消失。


    2.引用类型数组的初始化

    引用类型数组的数组元素是引用:每个数组元素里存储还是引用,它指向另一块内存,这块内存里存储了有效数据。

    //定义一个students数组变量,其类型是Person[]
    Person[] students;   //这行代码仅仅在栈内存中定义了一个引用变量,也就是一个指针,这个指针并未指向任何有效的内存区。此时内存中存储示意图如下所示:

    //执行动态初始化
    students =new Person[2]; //
    //创建一个Person示例,并将这个Person示例赋给zhang变量
    Person zhang=new Person();
    //为zhang所引用的Person对象的属性赋值
    zhang.age=15;
    zhang.height=158;
    //创建一个Person示例,并将这个Person实例赋值给lee变量
    Perosn lee=new Person();
    //为lee所引用的Person对象的属性赋值
    lee.age=16;
    lee.height=161;
    //定义两个Person实例,定义这两个实例实际上分配了4块内存,在栈内存中存储了zhang和lee两个引用变量,还在堆内存中存储了两个Person实例。此时的内存存储示意图如下所示:
    //将zhang变量的值赋给第一个数组元素
    students[0]=zhang;
    //将lee变量的值赋给第二个数组元素
    students[1]=lee;
    //当程序把张赋给students数组的第一个元素,把lee赋给students数组的第二个元素,students数组的两个数组元素将会指向有效的内存区。此时的内存存储示意图如下所示:
    从上面图可以看出:此时zhang和students[0]指向同一个内存区,而且它们都是引用类型变量,因此通过zhang和student[0]来访问Person实例的属性和方法的效果完全一样,不论修改students[0]所指向的Person实例的属性,还是修改zhang变量所指向的Person实例的属性,所修改的其实是同一个内存区,所以必然互相影响。同理,lee和students[1]也有相同的效果。


    展开全文
  • java数组的内存图解

    2019-07-19 21:33:56
    数组的长度在创建时指定,每元素都有下标,可以通过下标来访问数组的元素. 数组的内存图解 栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放, 堆内存:1. 数组和对象,通用new建立的实例都存在在堆内存...

    数组

    数组是一种数据结构,在java中可以理解为一种特殊的数据类型,它表示由同一类型数据组成的大小固定的有序集合.从它的定义可以看出,数组有两个明显的特征,分别是大小固定和有序.数组的长度在创建时指定,每个元素都有下标,可以通过下标来访问数组的元素.

    一维数组的内存图解

    栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放,
    
    堆内存:1. 数组和对象,通用new建立的实例都存在在堆内存中
    	  2. 每个实体都有内存地址值.
    	  3. 实体中的变量都有默认初始化值.
    	  4. 实体不被使用会在不确定的时间内被垃圾回收器回收.
    

    在这里插入图片描述
    创建一个数组arr,该数组指向堆内存中内存地址值为0x11ab,数组长度为3,默认初始化值为0;

    两个数组的内存图解

    在这里插入图片描述

    两个引用指向同一个数组

    在这里插入图片描述

    1. 引用: 数据的地址,称数据的地址就是引用.
    2. 引用类型变量:如果在内存中一个变量,存储的另一个数据的地址,这种变量就是引用变量;
    3. 两个引用指向同一个数组:
      两个数组名变量,存储的是同一个数组的地址;
      会出现只要使用其中一个数组名修改了数组的元素,使用另一个数组名访问就是修改之后的结果.
    展开全文
  • 基础---Java的数组

    2020-11-07 15:34:13
    、数组 1、概念 数组Array是用于存储多相同类型数据的集合 想要获取数组中的元素值,可以通过元素下标来获取,下标是...数组的动态初始化在创建数组之初只需要指定数组的长度建立的数组有着对应类型的默认值,

    一、数组

    1、概念

    数组Array是用于存储多个相同类型数据的集合
    想要获取数组中的元素值,可以通过元素下标来获取,下标是从零开始的


    数组是最为常见的一种数据结构,是相同类型的用一个标识符封装到一起的基本类型数据序列或对象序列,可以用一个统一的数组名和小标来唯一确定数组中的元素。实质上,数组是一个简单的线性序列,因此访问速度很快。

    2、数组的创建

    数组的常见分为静态初始化和动态初始化

    2.1 静态初始化

    静态初始化数组不会指定数组的长度,创建数组的时候就把数据加入到数组中去.

    (1) int[]a={1,2,3,4,5,6,7}
    (2) int[]a=new int[]{1,2,3,4,5,6}
    

    2.2 动态初始化

    数组的动态初始化在创建数组之初只需要指定数组的长度,建立好的数组有着对应类型的默认值,这个默认值和数组的类型作为成员变量的默认值一样,例如int类型数组的数据默认值为0.
    int[]a=new int[5]
    这里把数组的地址值交给变量a保存

    3 数组的长度和遍历

    3.1 数组的长度
    1、length属性获取数组的长度(数组.length 属性不是方法)
    2、数组一旦创建长度不可变
    3、允许0长度的数组
    

    3.2 数组的遍历

    从头到尾,一次访问数组的位置
    
    3.2.1 for循环遍历
    public class Main {
        public static void main(String[] args) {
            int[] ns = { 1, 4, 9, 16, 25 };
            for (int i=0; i<ns.length; i++) {
                int n = ns[i];
                System.out.println(n);
            }
        }
    }
    
    3.3.2 for each循环遍历

    for each循环虽然机构更加简单,但是无法获得数组的索引,根据实际情况使用。

    
    public class Main {
        public static void main(String[] args) {
            int[] ns = { 1, 1, 2, 3, 5, 8 };
    		for (int n : ns) {
    		    System.out.print(n + ", ");
    		}
        }
    }
    

    4、数组工具类Arrays

    工具类里面的里面方法是是静态的方法,不是静态的类

    4.1 Arrays.tostring(数组)
    把数组里的数据,用逗号连接成一个字符串,格式:[1,2,3,4,5,6].(和直接输出集合的效果一样)
    
    4.2 Arrays.sort(数组)
    对数组排序,对于基本类型的数组使用优化后的快速排序算法,效率高
    对应用类型,使用优化后的合并排序算法。
    
    4.3 Arrays.copyOf(数组,新的长度)
    把数组赋值成一个指定长度的新数组
    新数组的长度大于原数组,相当于复制,并增加位置。--数组的扩容
    新数组的长度小于原数组,相当于截取前一部分数据。--数组的缩容
    
    4.4 方法的具体体现
    int[] a = Arrays.copyOf(arr, 10);//数组的复制,大于原来长度相当于扩容
    System.out.println(Arrays.toString(a));//[12, 30, 20, 90, 34, 0, 0, 0, 0, 0]
    System.out.println(a.length);//10       
    int[] a2 = Arrays.copyOf(arr, 3);//数组的复制,晓宇原来长度相当于截取前几个数据
    System.out.println(Arrays.toString(a2));//[12, 30, 20]
    System.out.println(a2.length);//10
    

    5、数组的拓展

    5.1 二维数组

    存放数组的数组,也就是说数组里面存的哈市数组的数据形式。
    在这里插入图片描述

    5.2 数组的冒泡法排序

    1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
    3、针对所有的元素重复以上的步骤,除了最后一个。
    4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    5.3 排序算法(十二种)
    5.3.1 排序算法分别有:

    插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序

    5.3.2 以为算法总结写得非常好的文章

    排序散发总结连接

    展开全文
  • 数组会在内存当中开辟一块连续存储空间,需要指定长度 数组当中一个元素都有索引,查询话通过索引可以直接定位到 某一个元素,效率很高,但是进行删除话,数组会进行移动, 所以效率很低. 链表不需要连续存储...

    9.集合类
    9.1常用的数据结构 数组和链表
    9.2数组和链表有什么区别?
    数组会在内存当中开辟一块连续的存储空间,需要指定长度
    数组当中的每一个元素都有索引,查询的话通过索引可以直接定位到
    某一个元素,效率很高,但是进行删除的话,数组会进行移动,
    所以效率很低.
    链表不需要连续的存储单元,链表中的上一个元素通过指针指向
    下一个元素,所以链表结构进行查询的话,头部尾部比较快,
    中间元素查找速度比较慢,但是删除的话,只需要删除前后指针,重新
    建立指针就可以了,所以删除的性能很高.

    9.3 java当中的集合类或集合框架(重点)
    collection接口是集合类的顶层接口,collections是工具类
    collection有两个子接口,一个list接口,一个是set接口
    list接口有序可重复,set接口无序不可重复
    list接口常用的实现类有
    arrayList 基于数组实现的
    linkedList 基于链表实现的 区别参考数组和链表区别
    vector 基于数组实现的,但是是线程安全的(synchronized)
    copyOnwriteArrayList 复制数组副本来实现的
    set接口常用实现类
    HashSet 基于hashMap来实现的,实现不可重复是通过 hashCode方法和equals方法进行两次比较,先比较hashCode,再通过equals
    TreeSet 基于二叉树来实现的,可以对元素进行排序(排序规则默认是自然顺序,可以自定义比较器,实现自定义排序)
    Map接口(key value结构的)-----和class类 类似 private String name;
    map接口的实现类
    HashMap key不可重复,无序,可以为null
    实现原理 基于数组和链表来实现的
    当存入一组键值对的时候,先对key进行hash,然后映射到一个初始化长度为16的数组上,当不同的key产生hash碰撞的时候,value会通过链表结构来进行存储,jdk1.8之后对hashMap进行了改进,当链表长度达到临界值8,会通过红黑树来存储value,hashMap有两个参数,一个是初始化数组长度16,负载因子0.75,当满足扩容阈值的时候(当数组的12个元素被存满,并且有hash碰撞了),动态扩容,以2倍的增长方式进行扩容.
    HashTable
    HashTable是线程安全的hashMap(synchronized机制)key不准许为null
    TreeMap基于二叉树来实现的,可对key进行自然排序(自定义比较器,写比较规则)
    ConcurrentHashMap是线程安全的,对整个hash桶采用分段策略,拆分成若干个段segment,对每一个段上锁(synchronized),极大的提高了并发修改的效率.

    10.线程
    10.1进程和线程有什么区别?
    进程是指应用程序在运行时的状态,进程会占用系统的cpu以及内存资源
    线程是指进程当中的执行流程,多个线程协同工作,会共同使用进程的资源,
    才确保进程的功能得以实现.
    10.2 java当中如何实现线程呢?
    1:继承Thread类
    2:实现runnable接口,只是任务类,还需手动创建线程对象
    3:线程池机制来创建和管理线程 ThreadPool
    singleThreadPool 创建一个线程的线程池
    fixedThreadPool 创建固定数量的线程池
    cachedThreadPool 数量可缓存的线程池
    ScheduledThreadPool 有定时功能的线程池

    10.3线程的生命周期
    新建状态(new一个线程的时候)
    调用线程.start方法的时候,等待cpu分配时间片
    可运行状态
    当cpu分配到了时间片之后,线程开始运行,运行run方法当中的内容
    运行状态
    当线程遇到sleep、wait等方法的时候,线程会进入阻塞状态
    阻塞状态
    当休眠时间到期,或者被notify了,线程又回到了可运行状态
    死亡状态
    线程运行结束之后,就会销毁,被jvm的gc回收
    10.4多线程并发或线程安全问题如何解决?(重点)
    1:通过volatile 关键字修饰变量,可以实现线程之间的可见性,避免变量脏读的出现,
    底层是通过限制jvm指令的重排序来实现的,适用于一个线程修改,多个线程读的场景
    2:通过synchronized锁(任意对象)来实现线程同步,自动锁的思想,
    底层实现原理:当有线程进入同步代码块之后,利用jvm的计数器将
    锁的标记置为1,当别的线程再想进入的时候,发现锁的标记为1,
    该线程就去锁池等待,当第一个线程出来之后,锁的标记会置为0,
    之后cpu会随机分配一个线程再次进入同步代码块.
    3:通过lock锁的机制,进行手动lock,和unlock,但是这种很容易出现死锁。
    注意加锁以及解锁的顺序,就可以避免死锁
    4:通过线程安全的集合类,可以解决并发问题
    ConcurrentHashMap
    CopyonWriteArrayList
    5:使用并发包下面的原子类,底层使用的是cas机制(乐观锁),可以解决并发问题 atomicInteger 线程安全的原子整型类
    6:使用线程池来创建和管理线程,也可以一定程度上解决并发问题
    7:使用ThreadLocal来修饰变量,可以解决并发问题
    ThreadLocal底层是怎么实现的?
    多个线程会复制一份threadLocao变量的副本进行操作,互不影响,来保证线程安全的

    10.5线程之间如何进行通信?
    1:使用synchronized锁的wait和notify进行等待和唤醒
    2:使用lock锁的condition的await和signal进行等待唤醒
    10.6悲观锁和乐观锁
    悲观锁的思想对线程并发持悲观态度,使用互斥锁的机制来解决并发问题
    乐观锁的思想是使用cas(compareAndSwapper)机制,不上锁,但也能解决并发问题

    悲观锁和乐观锁
    mysql如何实现悲观锁和乐观锁
    1:mysql提供了表锁和行锁的机制,这就是悲观锁的体现
    select * from user where id=1 for update
    2:mysql没有提供乐观锁的机制,需要自己手动实现
    更新user表当真 id=1的username的值
    每一条记录都有一个最后一次修改时间,
    进行更新操作之前,先把上一次的最后一次修改时间查询出
    执行sql语句 update user set username =“新值” where id=1 and
    updateTime=上次查询的那个时间

    公平锁和非公平锁
    公平锁是指线程运行是有序的,FIFO RetrantLock(true)
    非公平锁是指线程运行允许插队,具有随机性 RetrantLock(false)

    int count=100;
    最后一次修改的时间戳或者版本号;
    1:先查询一下变量的值以及它的最后一次修改的时间戳;
    2:在本地修改变量的值
    3:对变量进行修改的时候,先比对一下最后一次修改的时间戳是否发生变化了,如果没发生变化,修改变量的值, 如果发生变化了,重试以上流程
    
    线程的使用场景:
        1:项目当中使用线程池(注册完毕发邮件和短信)
         2:tomcat本身就是通过线程的机制来处理用户的请求
    

    IO(input输入 output输出)
    数据存储的形式
    文件形式 类似于湖泊
    IO流的形式 类似于河流
    File file=new File(“d:\1.txt”);
    FileInputStream in=new FileInputStream(“d:\1.txt”);
    java当中IO流的分类
    字节流 InputStream(抽象类) OutputStream
    FileInputStream FileOutputStream (实现类)
    装饰者模式对传统的字节流进行了封装,增加了缓冲区功能
    BufferedInputStream BufferedOutputStream(带有缓冲区的字节流)
    字符流 Reader writer
    FileReader FileWriter
    BufferedReader BufferedWriter

    展开全文
  •  SessionBean: Stateless Session Bean 生命周期是由容器决定,当客户机发出请求要建立一个Bean实例时,EJB容器不一定要创建一个新Bean实例供客户机调用,而是随便找一个现有实例提供给客户机。...
  • 1 栈,特点:先进后出(入栈123,出栈321,单出口) 2 队列,特点:先进先出(一入口,一...增删慢:但是想要增添数据,只能建立一个的数组,复制,添加。因为数组的长度不可改变。因此慢。 数组的索引越界异常...
  • Arrays.copyOf() 使用:

    2021-03-10 14:02:21
    copyOf()第二自变量指定建立的数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值,例如: import java.util.Arrays; public class ArrayDemo { public static void main(String[] args) {
  • 只需要很少编程知识你就能使用PHP建立一个真正交互WEB站点。本教程并不想让你完全了解这种语言,只是能使你尽快加入开发动态web站点行列。我假定你有一些HTML(或者HTML编辑器)基本知识和一些编程思想。 1...
  • java 面试题 总结

    2009-09-16 08:45:34
    但通常情况下,由于Java Bean是被容器所创建(如Tomcat),所以Java Bean应具有一个无参构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean持久性。Java Bean实际上相当于微软COM模型中本地...
  • java范例开发大全

    2013-03-08 20:06:54
    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 ...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    一个方法,实现字符串反转,如:输入abc,输出cba 写一个方法,实现字符串替换,如:输入bbbwlirbbb,输出bbbhhtccc。 3.数据类型之间转换 如何将数值型字符转换为数字(Integer,Double) 如何将数字...
  • Java之IO流学习总结

    2014-10-19 11:22:20
    在输出部分没有对应部分,我们完全可以自己建立一个LineNumberOutputStream,在最初写入时会有一个基准行号,以后每次遇到换行时会在下一行添加一个行号,看起来也是可以。好像更不入流了。 ...
  • Java经典编程300例(code)

    千次下载 热门讨论 2013-01-09 10:26:53
    实例077 创建长度可变的数组 117 实例078 利用反射重写toString()方法 119 第8章 字符串与包装类 121 实例079 将数字格式化为货币字符串 122 实例080 货币金额大写格式 123 实例081 String类格式化当前日期 125 实例...
  • java范例开发大全源代码

    热门讨论 2011-10-30 23:31:51
     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12 ...
  • Java范例开发大全 (源程序)

    热门讨论 2011-04-27 07:47:22
     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5...
  • Java范例开发大全(全书源程序)

    热门讨论 2013-04-05 11:50:26
    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...
  • 实例159 创建长度可变的数组 实例160 利用反射重写toString()方法 实例161 反射与动态代理 7.3 常见的未检查型异常 实例162 算数异常 实例163 数组存值异常 实例164 数组下标越界异常 实例165 空指针异常 ...
  • 实例159 创建长度可变的数组 实例160 利用反射重写toString()方法 实例161 反射与动态代理 7.3 常见的未检查型异常 实例162 算数异常 实例163 数组存值异常 实例164 数组下标越界异常 实例165 空指针异常 ...
  • 实例159 创建长度可变的数组 206 实例160 利用反射重写toString()方法 208 实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 ...
  • 实例159 创建长度可变的数组 206 实例160 利用反射重写toString()方法 208 实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 ...
  • 11.4 将一个类放在另一个类中  11.5 使用关键字this  11.6 使用类方法和类变量  11.7 总结  11.8 问与答  11.9 测验  11.9.1 问题  11.9.2 答案  11.10 练习  第12章 充分利用现有对象  12.1 ...
  • 实例133 把整型数据格式化为指定长度的字符串 实例134 将长整型的数字分位显示 实例135 过滤输入字符串中的危险字符 实例136 过滤字符串中的空格与NULL值 实例137 获得汉字的拼音简码 5.2 数据验证 实例138 ...
  • Java开发实战1200例.第2卷.part3

    热门讨论 2013-05-08 22:46:34
    实例067 建立Java DB数据库连接 132 3.2 数据库与数据表 133 实例068 列举SQL Server数据库中数据表 133 实例069 列举MySQL数据库中数据表 134 实例070 查看数据表结构 135 实例071 动态维护投票数据库 136 ...
  • Java开发实战1200例.第2卷.part2

    热门讨论 2013-05-08 22:45:35
    实例067 建立Java DB数据库连接 132 3.2 数据库与数据表 133 实例068 列举SQL Server数据库中数据表 133 实例069 列举MySQL数据库中数据表 134 实例070 查看数据表结构 135 实例071 动态维护投票数据库 136 ...
  • Java开发实战1200例.第2卷.part1

    热门讨论 2013-05-08 22:44:13
    实例067 建立Java DB数据库连接 132 3.2 数据库与数据表 133 实例068 列举SQL Server数据库中数据表 133 实例069 列举MySQL数据库中数据表 134 实例070 查看数据表结构 135 实例071 动态维护投票数据库 136 ...
  •  《Java Web开发实战1200例》分为I、II两卷共计1200例子,包括了开发中各个方面最常用实例,是目前市场上实例最全面开发类图书;书中实例来源于多位工程师多年积累,具有很强实用性。 本书是第II卷,以...
  • 10.8 规划一个桥接网络 73 10.9 大楼间桥接 74 10.10 远程桥接 74 10.11 网桥环 75 10.12 分布生成树 76 10.13 交换 77 10.14 交换机与集线器结合 78 10.15 其他技术中桥接和交换 78 10.16 小结 78 练习 79 第11...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

java建立一个指定长度的数组

java 订阅