从length与length()开始谈Java
翻译人员: 铁锚
翻译时间: 2013年11月23日
原文链接: Start
from length & length() in Java
首先请看下面的问题,你能快速地回答上来吗?
- 假设没有任何集成开发环境和自动补全功能,如何获取数组的长度?如何取得字符串的长度?
我将为 新手以及中等水平这个水平之间的开发者回答这个问题:。因为他们中的很多人并不能正确回答出来,或者是对自己的答案缺乏信心(译者注: 老外的初级程序员真的这样么).
虽然IDE提供了方便快捷的代码补全功能,但同时也附带了一个缺点,称为 表面上很了解(surface understandin)。
本文将解释Java数组的一些重要概念。
上面问题的答案是:
int[] arr = new int[3]; System.out.println(arr.length);//数组长度 String str = "abc"; System.out.println(str.length());//字符串长度
问题是为什么数组有length属性域而String没有呢?或者说为什么字符串对象有 length() 方法而数组没有呢?
1. 为什么数组有length属性?
首先,数组是一个容器对象,用于保存单个类型的固定数量的值。在数组创建以后,其长度是固定不变的。所以数组的length属性可以作为一个final域存在.
因此length可以作为数组(array)的定义属性(defining attribute).
数组有两张创建方式:
1) new 数组创建表达式
2) 大括号形式的数组初始化器( array initializer)
数组在创建的时候,其大小就被指定了.
上面的例子中就使用到了数组创建表达式( array creation expression ),表达式指定了元素的类型, 数组的维度,以及最少要指定最顶层维度的大小。
下面的声明也是合法的,因为指明了数组的维度以及顶层维度的大小。
int[][] arr = new int[3][];
数组初始化器(array initializer) 通过指定包含的所有元素来创建一个数组,在大括号"{ }"中用分号(,)分开的表达式列表.例如:
int[] arr = {1,2,3};
2. 为什么不像String一样定义一个"Array"类呢?
既然数组是对象,那么下面的代码就是合法的:
Object obj = new int[10];
数组对象含有所有从Object类继承的成员(除了 clone 方法).为什么没有定义一个array的类呢? 我们也不能找到一个叫做 Array.java 的类(文件).
一个粗略的即使是这个类对开发者不可见。
可以思考这个问题? —— 如果有一个显式的Array类,那么它应该是什么样子呢? 它仍然需要一个数组来保存 数组元素,对吧? 因此定义这样一个类是不太合理的。
实际上我们可以得到一个数组的 class(属性),代码如下所示:
int[] arr = new int[3]; System.out.println(arr.getClass());
输出结果:
class [I
"class [I" 代表 "一个成员类型是 int 的数组" 的运行时签名.
3. 为什么String有length() 方法呢?
String对象背后的数据结构是 char 字符数组, 并不需要定义一个不怎么用到的属性域, 和C语言不一样,在Java中一个 char型的数组并不是String。
参考资料:
相关阅读:
- How
to Convert Array to ArrayList in Java? - Example
of Sorting Arrays - Java
Method to Shuffle an Array - Top
10 Methods for Java Arrays
从length与length()开始谈Java的更多相关文章
- 灵魂拷问:Java如何获取数组和字符串的长度?length还是length()?
限时 1 秒钟给出答案,来来来,听我口令:"Java 如何获取数组和字符串的长度?length 还是 length()?" 在逛 programcreek 的时候,我发现了上面这个 ...
- 【JAVA】java中的length和length()
参考链接: 你注意到Java中的length和length()了吗?外加一个size() java中的求长度length有时有小括号,有时没有小括号,到底什么时候该加小括号呢? 总结: Java中St ...
- 分析Java中的length和length()
在不适用任何带有自动补全功能的IDE的情况下,我们怎么获取一个数组的长度?如何获取字符串的长度? 这里我们先举用实例去分析一下:int[] arr=new int[3]:System.out.prin ...
- 关于Java中length、length()、size()的区别
length——数组的属性: length()——String的方法: size()——集合/映射的方法:(List.Set.Map) 转载自https://blog.csdn.net/qq_3323 ...
- 浅谈JAVA集合框架
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 谈JAVA的内存回收(一)
谈JAVA的内存回收 程序员需要通过关键字new创建Java对象,即可视为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间,当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除他 ...
- 【转】浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...
- 浅谈Java中的hashcode方法(转)
原文链接:http://www.cnblogs.com/dolphin0520/p/3681042.html 浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
随机推荐
- 2-学习GPRS_Air202(Air202开发板介绍和下载第一个程序)
http://www.cnblogs.com/yangfengwu/p/8887933.html 资料链接 链接:https://pan.baidu.com/s/1968t2QITuxoyXlE_Nz ...
- eclipse中启动tomcat,localhost:8080无法访问
问题 eclipse中启动tomcat,项目可以正常运行,但是localhost:8080无法访问. 关闭eclipse中的Tomact,直接从tomcat/bin 下的startup.bat启动,l ...
- opencv视屏流嵌入wxpython框架
前几篇博客分享搭建人脸识别与情绪判断的环境和源码,但是没有UI,界面很难看,一打开就是opencv弹出的一个视屏框.处女座的我看着非常难受,于是决定做一个UI,稍微规矩好看一点,再怎么说,这样的话也算 ...
- Docker使用 Supervisor 来管理进程
Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务.但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个 ...
- 启动Docker容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动. 因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器. 新建并 ...
- 介绍Docker容器
容器是 Docker 又一核心概念. 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用 ...
- win10+ubuntu双系统安装方案
网上有很多教程,大多是win7,win8的,我折腾了一天,今天终于都安装好了,折腾的够呛,很多人都说挺简单的,嗯其实的确很简单,很多人回复说安装不成功,很有可能就是电脑安全权限的问题,我用的是华硕的电 ...
- 一个貌似比较吊的递归转换为loop--总算成功了.--第二弹
前段时间用类似于散弹式编程的方式,各种猜测-运行验证-修正结果,最终成功转换了一个看起来比较有难度的递归函数.但总觉得很蛋疼,原因如下: 1.虽然正确,但是逻辑搞得比较复杂.现在去看,一头雾水,不知道 ...
- 基于Web在线考试系统的设计与实现
这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出,下载地址:http://download.csdn.net/detail/sdksdk0/9361973 ...
- SQLite 删除表(http://www.w3cschool.cc/sqlite/sqlite-drop-table.html)
SQLite 删除表 SQLite 的 DROP TABLE 语句用来删除表定义及其所有相关数据.索引.触发器.约束和该表的权限规范. 使用此命令时要特别注意,因为一旦一个表被删除,表中所有信息也将永 ...