从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异常 以前虽然知道一 ...
随机推荐
- 打造适合你的ABP(1)---- 完善日志系统
最近使用Abp开发了一个项目,对abp有一个大概的了解,第一个小项目接近尾声,新的项目马上开始,针对开发第一个项目中发现的问题及不方便的地方,本人做一些修改,特此记录,请大家多多指正! 本人的开发环境 ...
- Redis源码学习:Lua脚本
Redis源码学习:Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开 ...
- android 自定义view之侧滑效果
效果图: 看网上的都是两个view拼接,默认右侧的不显示,水平移动的时候把右侧的view显示出来.但是看最新版QQ上的效果不是这样的,但给人的感觉却很好,所以献丑来一发比较高仿的. 知识点: 1.Vi ...
- 非阻塞IO服务器模型
我们来考虑一个情形,你跟千千万万个玩家是魔兽世界的超级粉丝,每周末准时组团打boss.每当周末游戏服务器就亚历山大,因为起码几十万用户同时在线.如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?先 ...
- Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构
转载请把头部出处链接和尾部二维码一起转载,本文出自: http://blog.csdn.net/hejjunlin/article/details/52435789 前面几节中,都是通过java层调用 ...
- T-SQL注意事项(1)——SET NOCOUNT ON的去与留
前言 用了一段时间T-SQL之后,哪怕自己没用过,也多多少少看过SSMS中的SET NOCOUNT ON命令,很多性能优化文章中都有提到这个东西,它们建议尽可能使用这个命令减少网络传输的压力,那么今天 ...
- 一个maven项目打多个可执行Jar文件
使用maven-jar-plugin插件可以将一个maven项目按照需求打出多个可执行的jar文件. pom关键配置如下所示: <plugin> <groupId>org.ap ...
- 什么时候App委托会收到App进程被结束的消息
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在Xcode建立的新项目后,在AppDelegate类会发 ...
- 1.1、Android Studio创建一个项目
Android Studio中的项目包含一个或多个模块.本节帮助你创建一个新的项目. 创建一个新的项目 如果你之前没有打开项目,Android Studio显示欢迎页面,通过点击Start a New ...
- UNIX网络编程——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)
程池模式一般分为两种:L/F领导者与跟随者模式.HS/HA半同步/半异步模式. HS/HA 半同步/ 半异步模式 :分为三层,同步层.队列层.异步层,又称为生产者消费者模式,主线程处理I/O事件并解析 ...