精华内容
下载资源
问答
  • 与性能一样:尽可能编写最简单的代码,并对其进行测试以确定其性能是否足够好.如果您只需要元素(而不是索引...但是如果你确实需要索引,并假设你没有在任何地方更改数组,我相信JIT编译器会优化本机代码只获取一次长度....

    与性能一样:尽可能编写最简单的代码,并对其进行测试以确定其性能是否足够好.

    如果您只需要元素(而不是索引),我建议您使用enhanced-for循环:

    for (int value : array) {

    ...

    }

    根据JLS 14.14.2,它基本上等同于你的第一段代码,但代码只讨论你真正感兴趣的内容.

    但是如果你确实需要索引,并假设你没有在任何地方更改数组,我相信JIT编译器会优化本机代码只获取一次长度.获取长度是一个O(1)操作,因为它基本上只是数组中的一个字段,但显然它确实涉及命中内存,所以最终代码只做一次这样做更好……但这并不意味着你的代码必须这样做.请注意,我不希望Java编译器(javac)执行此优化 – 我期望JIT能够执行此操作.

    事实上,我相信一个好的JIT实际上会看到如下代码:

    for (int i = 0; i < array.length; i++) {

    int value = array[i];

    ...

    }

    并且能够优化掉数组边界检查 – 它可以识别出,如果它一直访问同一个数组对象,那么数组边界错误就不会失败,所以它可以避免检查.对于能够预先获取长度的更“聪明”的代码,它可能会做同样的事情,但是JIT优化通常会故意针对非常常见的代码模式(为了获得最大的“降压”)以及上面的迭代方式在阵列上很常见.

    展开全文
  • 数组的一些特性java数组要求所有的元素具有相同的数据类型,因此一个数组只能存储一种数据类型的数据,而不能存储多种数据类型的数据。比如你这个数组是int类型的数组,那这个数组就不能存储boolean float...

    数组的定义

    数组是相同类型数据的有序集合。

    简单理解就是:数组是由若干个相同类型的数据,按照一定的顺序组合而成的。数组中的每一个数据我们可以称为元素,每个元素可以通过索引(下标)来访问(获取)。

    数组的一些特性

    1. java数组要求所有的元素具有相同的数据类型,因此一个数组只能存储一种数据类型的数据,而不能存储多种数据类型的数据。比如你这个数组是int类型的数组,那这个数组就不能存储boolean float string等其他类型的数据,只能存储int类型数据。(这里要注意Object类型的数组,由于Object类是所有类的父类,由于继承关系,所以看上去可以存储不同类型的数据)
    2. .数组的长度是固定的,一旦数组初始化完成,数组在内存中所占用的空间就被固定下来不可改变。
    3. java数组既可以存储基本类型的数据,也可以存储引用类型的数据,只要所有的数组元素具有相同的类型即可。(数组也是一种数据类型,它本身是一种引用类型)
    4. 数组初始化后数组元素必须有值,如果不指定元素的值,系统会自动为每个元素设置默认值。

    声明数组

    java数组有两种格式来声明数组:

    1. type [ ] arrayName => 数组的数据类型 [ ] 数组的名称
    2. type arrayNmae [ ]

    数组是一种引用类型的数据,当我们声明一个数组类型的变量(int [] num)时,仅仅表示定义了一个变量(num),数组还未真正创建, 这个变量还未指向任何有效内存,所以这个数组还无法使用,只有对数组进行初始化后才可以使用。

    数组的初始化

    数组的初始化有两种方式:

    1. 静态初始化:int [ ] num = new int[ ]{1,2,3} 或 int [ ] num = {1,2,3} 初始化时由程序员显式的指定每个数组元素的初始值,由系统计算数组的长度。
    2. 动态初始化:int [ ] num = new int[3] 初始化时由程序员指定数组的长度,由系统为数组元素分配默认值。

    系统分配的默认值规则如下:

    数组元素的类型是基本数据类型中的整数型(byte,short,int,long)则数组元素默认值为 0

    数组元素的类型是基本数据类型中的浮点型(float,double)则数组元素默认值为 0.0

    数组元素的类型是基本数据类型中的字符型(char)则数组元素默认值为

    数组元素的类型是基本数据类型中的布尔型(boolean)则数组元素默认值为 false

    数组元素的类型是引用类型(类,接口,数组)则数组元素默认值为 null

    注意:不能同时使用静态初始化和动态初始化int [ ] num = new int[3]{1,2,3}

    数组遍历

    数组的遍历我们可以使用for循环和foreach循环,要注意foreach循环中无法修改数组元素

    public static void main(String[] args) { int [] num = {1,2,3,4}; for(int n : num){ //修改数组元素都为6 n = 6; } System.out.println(num[1]);//结果不变仍为2}

    数组的内存分析

    对于以下代码:

    //声明一个int类型的数组,变量名为intArr1int [] iArr; //初始化这个数组iArr= new int[5];//以上可以简写为int [] iArr= new int[5];

    首先执行 int[ ]iArr; 在栈内存中定义了一个空引用也就是变量iArr,此时变量iArr并未指向任何有效内存,所以此时数组无法使用,如图

    0246f35f8dbb93bd20920417d1884705.png

    当执行iArr = new int[5]; 进行动态初始化之后,系统负责为该数组分配内存空间,并分配默认初始化值,然后将这个内存空间的地址赋值给变量iArr

    0e13f47b2030878cbc9336a61e42c1e3.png

    这里要注意,对于基本数据类型的数组,数据存储在对应的数组元素中。而对于引用类型的数组,数组对应的元素存储是数据的引用(地址)

    多维数组

    java中对于多维数组可以简单理解为数组中嵌套数组。

    比如二维数组,我们可以理解为在一维数组中保存的元素类型也是一个数组。

    多维数组的声明同样按照数组声明的方式 type [ ] arrayName(或type arrayNmae [ ])

    这里的类型type就变成了数组类型,比如int[ ][ ] nums = new int[2][3];这里type=>int[ ]

    下期我们手写一个动态数组,改变数组长度固定的缺点

    ---------本文源于日常学习笔记记录,如有错误欢迎批评指正

    展开全文
  • 设置一个类, 命名为 MyList 类中包含属性:Object[] element 方法有如下几个: ...当前存储数据量 size : 获取当前存储的有效数据长度 动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新

    设置一个类, 命名为 MyList 类中包含属性:Object[] element 方法有如下几个:

    1. 增加方法 add : 可以向数组属性中依次存储 Object,数组内容存满时,需实现动态扩容(详解在下面)。
    2. 删除方法 remove :可以根据数据或下标,从数组属性中删除Object 数据,删除后,数组后续元素需前移。
    3. 查询方法 get :方法传入下标,返回数组中指定下标的数据。
    4. 当前存储数据量 size : 获取当前存储的有效数据长度
    • 动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,失去引用会被GC自动回收。

    第一步

    创建MyList类,包含数组属性Object[] element,紧接着写上各个方法和功能
    
    public class MyList {
    		//属性,创建的数组
    		Object[] element;
    		//规定数组初始长度,注意命名规范
    		final int BEGAIN = 3;
    		//构造无参方法
    		public MyList(){}
    		//构造有参方法
    		public MyList(Object[] element) {
    			this.element = element;
    		}
    		//Object[] element的getter,setter方法,可使用快捷键添加
    		public Object[] getElement() {
    			return element;
    		}
    		public void setElement(Object[] element) {
    			this.element = element;
    		}
    		
    		/*
    		 * 1.	增加方法add:
    		 * 		可以向数组属性中 依次 存储 Object,数组内容存满时,需实现动态扩容
    		 * 
    		 * 分析:
    		 * 传入Object内容 和 数组当中非空的位置(若传入的是element.length-1,则说明该数组已满需要开辟新数组)
    		 */
    		public void add(String txet,int n) {
    			if(n==element.length) {
    				//数组已满则需要开辟新数组,长度为之前的2倍
    				Object[] newElement = new Object[element.length*2];
    				for(int i=0;i<element.length;i++) {
    					//遍历把旧数组内容传递给新数组
    					newElement[i] = element[i];
    				}
    				//把需要赋值的text赋值到新数组当中最后一个非空元素的后面
    				newElement[element.length] = new String(txet);
    				//将原始数组变为新数组
    				element = newElement;
    			}else {
    				//输入未满,直接赋值到数组当中最后一个非空元素的后面
    				element[n] = new String(txet);
    			}
    			
    		}
    		
    		/*
    		 * 2.	删除方法remove
    		 * 		可以根据数据或下标,从数组属性中删除Object 数据,删除后,数组后续元素需前移
    		 * 
    		 * 分析:分为两种情况(使用多态)
    		 * 1.输入下标。根据相关下标要求找到,赋值,移动即可
    		 * 2.输入数据。使用equals的方法遍历找到与目标数据相同的数,找到以后重复查找下标的方法进行操作
    		 *
    		 */
    		//输入下标类
    		public void remove(Object[] element,int index) {
    			if(index == element.length) {
    				//当需要删除的下标为最后一个时,直接把最后一个元素赋值为null即可
    				element[element.length-1] = null;
    			}else {
    				for(int i=index;i<element.length-1;i++) {
    					//逐个把在下标为index后的数组向前移动一个
    					element[i] = element[i+1];
    				}
    				if(element[element.length-1] != null) {
    					//把最后一个元素赋值为null
    					element[element.length-1] = null;
    				}
    			}
    			
    		}
    		// 输入数据类
    		public void remove(Object[] element,Object text) {
    			RemoveEquals m1 = new Judge(text);
    			RemoveEquals m2 = new Judge();
    			for(int i=0;i<element.length;i++) {
    				//为了在循环时能在找到目标数据前逐个输入测试
    				m2.setText(element[i]);
    				//调用equals方法查询是否有与目标数据相同的,这里的equals方法得重写
    				if(m2.equals(m1)) {
    					//找到与目标数据相同的元素
    					if(i == element.length-1) {
    						//该数据位于数组最后一个,直接赋值为null即可
    						element[i] = null;
    						break;
    					}else {
    						for(int j=i;j<element.length-1;j++) {
    							//逐个把在下标为i后的数组向前移动一个
    							element[j] = element[j+1];
    						}
    						if(element[element.length-1] != null) {
    							//把最后一个元素赋值为null
    							element[element.length-1] = null;
    						}
    					}
    				}
    			}
    			
    		}
    		
    		
    		/*
    		 * 3.	查询方法get
    		 * 		方法传入下标,返回数组中指定下标的数据
    		 * 分析:
    		 * 获取下标后判断下标是否越界,没有越界直接返回对应的下标元素,越界返回false
    		 *
    		 */
    		public Object get(Object[] element,int index) {
    			if((index>=0) && (index<=element.length-1)) {
    				//需要输出的下标在0-element.leng-1之间直接进行return
    				return element[index];			
    			}else {
    				//需要输出的下标越界返回false
    				return false;
    			}
    		}
    		
    		/*
    		 * 4.	当前存储数据量 size
    		 * 		获取当前存储的有效数据长度
    		 * 分析:
    		 * 遍历数组,当下标还未越界时遇到空的下标元素则return该下标(有效数据长度就是该下标)
    		 * 当下标越界时,说明数组已满,return element.length即可
    		 *
    		 */
    		public int size(Object[] element) {
    			for(int i=0;i<=element.length-1;i++) {
    				if(element[i]==null) {
    					return i;
    				}
    			}
    			return element.length;
    		}		
    		
    		//遍历打印数组数据
    		public void print() {
    			for(int i=0;i<element.length;i++) {
    				System.out.println(element[i]);
    			}
    		}	
    }
    
    

    第二步

    创建一个提供equals方法使用的类,定义为Judge
    
    //与MyList类在一个包里面
    public class RemoveEquals {
    		//构造无参方法
    		public RemoveEquals() {
    			super();
    		}
    		//构造有参方法
    		public RemoveEquals(Object text) {
    			super();
    			this.text = text;
    		}
    		
    		private Object text;
    		//快捷键属性的getter,setter方法
    		public Object getText() {
    			return text;
    		}
    		public void setText(Object text) {
    			this.text = text;
    		}
    
    		//快捷键属性的equals方法,相当于重写
    		@Override
    		public boolean equals(Object obj) {
    			if (this == obj)
    				return true;
    			if (obj == null)
    				return false;
    			if (getClass() != obj.getClass())
    				return false;
    			Judge other = (Judge) obj;
    			if (text == null) {
    				if (other.text != null)
    					return false;
    			} else if (!text.equals(other.text))
    				return false;
    			return true;
    		}
    		
    }
    
    

    第三步

    构造测试类测试各个功能是否完善
    
    //与MyList类、RemoveEquals类在一个包里面
    public class MylistTest {
    
    	public static void main(String[] args) {
    		MyList e = new MyList();
    		
    		//定义原数组长度为2
    		e.element = new Object[e.BEGAIN];
    		
    		//添加超过3个元素
    		e.add("one", e.size(e.element));
    		e.add("two", e.size(e.element));
    		e.add("three", e.size(e.element));
    		e.add("four", e.size(e.element));
    		e.add("five", e.size(e.element));
    		
    		
    		//遍历打印数组数据
    		e.print();
    		//获取数组下标为n的数据
    		System.out.println(e.get(e.element, 3));
    		
    		//删除数组下标为n的元素
    		e.remove(e.element, 2);
    		//遍历打印数组数据
    		e.print();
    		
    		//删除指定数据的数组
    		e.remove(e.element, "two");
    		//遍历打印数组数据
    		e.print();
    		
    
    	}
    
    }
    
    
    有许多不足,待改进之地,不喜勿喷!
    
    注:其中包得自己创建!
    
    展开全文
  • 数组

    2021-01-24 19:25:57
    一维数组 在Java中,整形、字符型和浮点型...数组长度决定分配给数组的空间长度,可以通过length属性来获取数组长度。 数组在存储数组元素时,会分配给每一个数组元素一个元素下标,可以通过元素下标找到该数据元素在数

    一维数组

    在Java中,整形、字符型和浮点型等数据类型操作往往都是单个数据的操作。如果要定义的变量个数太多,则不利于数据处理,对此Java提供了另一种有效的存储方式,即是数组。

    1、定义数组
    数据类型 [] 数组名=new 数据类型[数组长度];
    在定义数组时,一定要指定数组名和数组长度,中括号也必须定义,表示定义了一个数组,而不是一个变量。数组长度决定分配给数组的空间长度,可以通过length属性来获取数组长度。
    数组在存储数组元素时,会分配给每一个数组元素一个元素下标,可以通过元素下标找到该数据元素在数组中的位置。从0开始,依次递增,即数组的一个数据元素的元素下标是0。

    2、数据初始化
    数据初始化就是在定义数组的同时给数组完成赋值操作。
    数组初始化的语法格式:

    数据类型 [] 数组名={值1,值2,…,值n};
    或者:
    数据类型 [] 数组名=new 数据类型[]{值1,值2,…,值n};

    二维数组

    二维数组,或者称为多维数组,语法与一维数组类似。在实际应用中,三维及以上的数组很少使用,除了一维数组,就是二维数组应用比较多一点。
    定义二位数组的语法格式:

    数据类型[] [] 数组名;
    或者:
    数据类型 数组名[] [];

    数据类型为数组元素的类型。“[] []”用于表明定义了一个二维数组,通过多个元素下标进行数据访问。

    在JDK中提供了一个专门用于操作数组的工具类,即Arrays类,该类提供了一系列的方法来对数组进行操作,如排序、复制、比较、填充等。

    Arrays类的常用方法介绍表
    方法 返回类型 说明
    equals(array1,arrays2) booleam 比较两个数组是否相等
    sort(array) void 对数组array的元素进行升序排列
    toString(array) String 将一个数组array转换成一个字符串
    fill(array,val) void 把数组array的所有元素都赋值为val
    copyOf(array,length) 与array数据类型一致 把数组array复制成一个长度为length的新数组
    binarySearch(array,val) int 查询元素值val在数组array中的下标
    展开全文
  • 数组知识点

    2021-01-25 11:19:38
    一维数组 在Java中,整形、字符型和浮点型...数组长度决定分配给数组的空间长度,可以通过length属性来获取数组长度。 数组在存储数组元素时,会分配给每一个数组元素一个元素下标,可以通过元素下标找到该数据元素在数
  • 数组和集合(二)

    2017-04-28 17:27:29
    所以我们用集合来克服数组的不足:数组长度不可改变,这一点一定和c++区分出来,刚学习c++时,有一种动态数组,其长度是可以申请改变的,而java数组长度就是固定的,数组没有提供可以查看数组有效元素个数的...
  • java数据结构

    2017-12-09 18:57:54
    Array数组java中有8中...通过.length获取数组长度, equals():比较两个数组是否相等,拥有相同元素个数,且所有对应元素两两相等。 数组是访问数据最有效率的数据结构,但很不灵活。大小固定。Collection集合List接
  • java集合

    2021-01-23 20:37:18
    集合、数组都是对多个数据进行存储操作的结构,简称Java容器。 数组在存储多个数据方面的特点: ... 获取数组有效元素的个数需求,数组没有提供 > 数组存储数据的特点:有序、可重复。对于无序,不可重
  • JOptionPane.showMessageDialog(null, "读取数据过程中未获取有效数据!请检查设备或程序!", "错误", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } } } catch ...
  • JAVA集合类(一)

    2020-04-20 14:40:27
    集合是JAVA中用途很广泛的一类容器,与数组类似,集合用于存储、获取、操作对象。但它与数组又有一些区别。 首先我们可以看看数组的一些弊端: 1.数组长度是不可变的,在我们声明时指定好长度就不可以再变化 2....
  • 使用length属性获取数组长度,public,private,protected,friendly。 计算2 * 8的最有效方法是等于几个 这两个对象具有相同的值,x.equal(y)==true,但可以有不同的哈希码。这不是真的。 集合和集合之间的...
  •  数组长度不可变,数组没有提供可以查看有效元素个数的方法2. 集合的长度是可变的,集合可以存储任意类型的对象,集合只能存储对象Java的集合框架接口主要有两个接口派生二次:Collection和Map, 这两个接口是...
  • 正在为Java程序员岗位而做准备?...使用length属性获取数组长度,public、private、protected、friendly区别最有效率的方法算2*8等于几两个对象值相同,x.equal(y)==true,但是却可有不同的hashcode...
  • java---集合与泛型

    2018-05-18 11:02:45
    数组的弊端①数组长度是不可变的 ②没有提供可以查看有效元素个数的方法2. 集合的特点①集合的长度是可变的②集合可以存储任意类型的对象③集合只能存储对象3. 集合框架:java.util.Collection : 集合层级的根...
  •  ②数组没有提供可以查看有效元素个数的方法   2. 集合的特点  ①集合的长度是可变的  ②集合可以存储任意类型的对象  ③集合只能存储对象   3. 集合框架  java.util.Collection : 集合层次的...
  • java集合总结

    2020-01-22 17:22:30
    (2)数组无法获取有效元素的个数,需要借助例如total这样得变量 3.集合存储的优点: 集合的底层存储结构有很多种,程序员在选择时可以多样化。 可以选择有序的,无序的,可重复的,不可重复的。 4.数...
  • 正在为Java程序员岗位而做准备?只要准备好六部分的知识点,包你面试无...使用length属性获取数组长度,public、private、protected、friendly区别 最有效率的方法算2*8等于几 两个对象值相同,x.equal(y)==tru...
  • JAVA基础之集合

    2018-10-30 00:06:11
    一、集合相比数组的优势 不限制长度,动态改变 可以频繁的对数据进行增删 可以存储具有一对一关系的数据 ...底层由数组实现,在列表尾部插入或者删除数据非常有效 方法: get():获取单个数据...
  • Java经典编程300例(code)

    千次下载 热门讨论 2013-01-09 10:26:53
    实例077 创建长度可变的数组 117 实例078 利用反射重写toString()方法 119 第8章 字符串与包装类 121 实例079 将数字格式化为货币字符串 122 实例080 货币金额大写格式 123 实例081 String类格式化当前日期 125 实例...
  • 3.有效的数字转成String数组获取长度输出数字的位数; 4.定义一个空字符串; 4.,遍历:循环内部每个元素转为int判断是否为奇数,如果是就拼接到第4步的字符串; 5.判断最终拼接的字符串,不是空(null和“”)...
  • 思路:将字符串转为字符数组,定义两个指针,left和right分别指向第一个元素和第二个元素,right往后移,遍历数组,每次后移,判断left和right中间是否存在回文子串,存在的时候记录回文子串的长度和最左、最右两个...
  • java面试宝典

    2013-02-28 16:04:01
    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...
  • java 面试题 总结

    2009-09-16 08:45:34
    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    如何获得数组长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和对象的概念,掌握面向对象编程的本质 49.静态变量和静态...
  • 集合与泛型

    2019-06-11 19:44:00
    数组长度不可变 ②数组没有提供可以查看有效元素个数的方法 2. 集合的特点 ①集合的长度是可变的 ②集合可以存储任意类型的对象 ③集合只能存储对象 3. 集合框架 java.util.Collection : 集合层次的根接口 |...
  •  ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,...
  • 实例159 创建长度可变的数组 206 实例160 利用反射重写toString()方法 208 实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 ...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

java获取数组有效长度

java 订阅