Java - List or Array?
我知道JavaS使Java中的事情变得更容易,而不是使用硬数组(列表允许您随意添加/删除元素,并自动调整大小等)。
我已经阅读了一些建议,只要可能,数组应该在Java中避免使用,因为它们根本不灵活(有时会施加奇怪的限制,例如,如果你不知道数组的大小,等等)。
这是一个"好的实践"来停止使用数组,而只使用列表逻辑吗?我确信列表类型比数组消耗更多的内存,因此开销更大,但是这有意义吗?大多数列表在运行时都会被收集起来,如果它们被放在任何地方,那么这可能不像我想的那么重要?
- 除非你能证明它的重要性,否则它永远都不重要。
- 大猩猩还是鲨鱼?
- 如果您知道大小并确定它不会改变,那么可以使用数组。
- 所有语言都是一样的。如果您不知道数组的大小,list很有用,否则您也可以对数组做同样的事情。
- 你在哪里读到的?听起来很有趣。
- @路易斯:什么?
- @罗伯特哈维一号虽然OP的意思是使用List或ArrayList,所以我把它标为复制品。我的错。
- 这很奇怪,因为我见过类似的问题被关闭或删除。
- 这个也关门了。它只是有一个新的亲切,温和的措辞。
- 感谢大家的意见。我想我将开始切换到list<>=new array list<>();现在,除非我确定数组是最好的。在使用数组之前我已经被烧掉了,一些外部的事情发生了,并导致了outofindex错误,列表应该有助于防止这种情况发生。
- 我认为问题的关键不在于是使用List还是Array,而在于了解两者之间的区别,以便在一个优于另一个的情况下加以理解。就像学习pointers一样,即使你只是在Java中编码。
- @snakedoc:听起来像是逻辑错误。除非方法本身是可疑的,否则更改为列表只会覆盖它。
- @我认为你是对的。例如:string[]strary=string.split(",");--这里的数组最好,因为strary[]总是设置为split的大小。但在其他情况下,如果您必须遍历某些数据(例如,结果集)并跟踪某些提取的数据,而不知道将返回的结果数,那么在这里使用数组可能会比较困难。所以一份清单会更合适。
- 如果项目数不固定,或者不知道项目数,则需要列表而不是数组。也就是说,如果数据访问层从查询中返回一个项目数组,它将指示该数组的大小,并且不太可能向它添加更多的项目。
- @RobertHarvey使用类似"select orderid,ordervalue from orders"的查询;"woudl返回一个长度未知的结果集,导致试图在数组中捕获结果时出现逻辑困难,除非您执行了一些糟糕的编码,如"string[]str=new string[10000]"……对返回数据的大小估计过高。在我看来,这只是糟糕的编码,这里的列表会更有意义。如果某个对象返回一个数组,那么它很可能已经是最好的数据类型,并且可以使用(除非您要添加新记录或删除它们并需要它调整大小)。
- @snakedoc:数组可以与foreach迭代,这与大小无关。数组的代表性很差;当人们应该首先到达数组时,他们首先到达列表,然后在需要列表提供的附加功能时到达列表。
我不喜欢教条。知道规则;知道何时打破规则。
"从不"太强,尤其是在软件方面。
Arrays和Lists都是GC的潜在目标,所以这是一个清洗。
是的,在开始之前必须知道数组的大小。当你这样做的时候,没有什么问题。
使用java.util.Collections和java.util.Arrays类很容易根据需要来回切换。
我认为一个好的经验法则是使用Lists,除非您需要Array(出于内存/性能原因)。否则,Lists通常更容易维护,因此不太可能引起将来的错误。
列表在自动扩展方面提供了更多的灵活性/功能,因此,除非您需要内存(并且无法负担列表所产生的开销),或者不介意在数组扩展/收缩时保持数组大小,否则我建议您使用列表。
尽量不要对代码进行过多的微观管理,而应该关注更清晰易读的组件。
这取决于清单。LinkedList可能只在需要时占用空间,而ArrayList通常在达到容量时会大大增加空间。在内部,ArrayList是使用数组实现的,但它是一个始终比您想要的大的数组。但是,由于它存储引用,而不是对象,所以在大多数情况下,内存开销是可以忽略的,我相信方便是值得的。
我不得不说我遵循了使用collections框架的这种方法,否则我可能会使用数组。与数组相比,这些集合为您提供了许多好处和便利,但是的,可能会对性能造成一些影响。
编写易于理解且难以破解的代码更好,数组要求您放入大量的检查代码,以确保您不访问不应访问的数组位,或者不应在其中放入许多内容等。鉴于大多数时间性能不是问题,因此不应担心。