Java中的length和length()深⼊分析
在开始本⽂前先考虑以下⼀个问题
在不使⽤任何带有⾃动补全功能IDE的情况下,如何获取⼀个数组的长度?以及,如何获取⼀个字符串的长度?
这个问题我问过不同⽔平的程序员,包括初级和中级⽔平的。他们都不能准确⽽⾃信地回答这个问题(如果你能很准确很⾃信的回答这个问题,那么证明针对这⼀知识点你⽐⼤多数中级程序员掌握的好)。由于现在很多IDE都有代码补全功能,这使得开发⼈员在很多问题上都理解的很肤浅。
上⾯问题的正确回答姿势应该是这样的:
int[] arr = new int[3];
System.out.println(arr.length);//使⽤length获取数组的程度
String str = "abc";
System.out.println(str.length());//使⽤length()获取字符串的长度
那么问题来了,为什么数组有length属性,⽽字符串没有?或者,为什么字符串有length()⽅法,⽽数组没有?
为什么数组有length属性?
⾸先,数组是⼀个容器对象,其中包含固定数量的同⼀类型的值。⼀旦数组被创建,他的长度就是固定的了。数组的长度可以作为final实例变量的长度。因此,长度可以被视为⼀个数组的属性。
springboot其实就是spring有两种创建数组的⽅法:
1、通过数组表达式创建数组。
2、通过初始化值创建数组。
⽆论使⽤哪种⽅式,⼀旦数组被创建,其⼤⼩就固定了。
使⽤表达式创建数组⽅式如下,该⽅式指明了元素类型、数组的维度、以及⾄少⼀个维度的数组的长度。
该声明⽅式是符合要求的,因为他指定了⼀个维度的长度(该数组的类型为int,维度为2,第⼀维度的长度为3)
int[][] arr = new int[3][];
使⽤数组初始化的⽅式创建数组时需要提供所有的初始值。形式是使⽤{和}将所有初始值括在⼀起并⽤,隔开。
int[] arr = {1,2,3};
注:
这⾥可能会有⼀个疑问,既然数组⼤⼩是初始化时就规定好的,那么int[][] arr = new int[3][];定义的数组并没有给出数组的第⼆维的⼤⼩,那么这个arr的长度到底是如何“规定好”的呢?
其实,arr的长度就是3。其实Java中所有的数组,⽆论⼏维,其实都是⼀维数组。例如arr,分配了3个空间,每个空间存放⼀个⼀维数组的地址,这样就成了“⼆维”数组。但是对于arr来说,他的长度就是3。
int[][] a=new int[3][];
System.out.println(a.length);//3
int[][] b=new int[3][5];
System.out.println(b.length);//3
Java中为什么没有定义⼀个类似String⼀样Array类
因为数组也是对象,所以下⾯的代码也是合法的:
Object obj = new int[10];
数组包含所有从Object继承下来⽅法(Java中数组的继承关系),除clone()之外。为什么没有⼀个array类呢?在Java中没有Array.java⽂件。⼀个简单的解释是它被隐藏起来了(注:Java中的数组有点类似于基本数据类型,是⼀个内建类型,并没有实际的类与他对应)。你可以思考这样⼀个问题——如果有⼀个Array类,那它会像什么样?它会仍然需要⼀个数组来存放所有的数组元素,对吗?因此,定义出⼀个Array类不是⼀个好的主意。(译者注:这⾥可能有点绕,道理有点类似于:鸡⽣蛋蛋⽣鸡问题,可能⽐喻也不是很恰当,请读者⾃⾏理解)
事实上我们可以获得数组的类定义,通过下⾯的代码:
int[] arr = new int[3];
System.out.Class());
输出:
class [I
“class [I”代表着”成员类型是int的数组”的class对象运⾏时类型的签名
为什么String有length()⽅法?
String背后的数据结构是⼀个char数组,所以没有必要来定义⼀个不必要的属性(因为该属性在char数值中已经提供了)。和C 不同的是,Java中char的数组并不等于字符串,虽然String的内部机制是char数组实现的。(注:C语⾔中,并没有String类,定义字符串通常使⽤char string[6] = "hollis";的形式)
注:要想把char[]转成字符串有以下⽅式:
char []s = {'a','b','c'};
String string1 = s.toString();
String string2 = new String(s);
String string3 = String.valueOf(s);
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家学习或者使⽤Java能有所帮助,如果有疑问⼤家可以留⾔交流。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论