- 浏览: 158165 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
szxiaoli:
都打不开呀,
240个jQuery实现AJAX插件 -
Corwen:
class要声明为final 不一定需要这个吧
不可变对象,深层次克隆等总结 -
chengqianl:
厉害 形象
大部分领导都是屁眼而已 -
xiangzi21:
m. show engies; --->应该是show ...
Mysql中show的用法 -
fromaust:
可以用inverse="true"来解决这 ...
[转]hibernate n+1问题
数组的使用可以被证明为是相当快的,这里指的是与ArrayList的比较,但是array不能伸缩,上来就要固定长度,这个是它的局限性,也是它速度快的原因。
ArrayList可以变换长度,会自动帮你扩展,现在想一下,它是怎么扩展的呢?很容易想到,它就是新建一个数组,把现有的东西复制到一个这个更大的数组中去,实现的,这样的效率极其低下。
有个问题,我事先要是不知道长度呢,我怎么定,可能会想,我估个值,尽可能大,就行了,这样的做法虽然浪费了许多空间,但是
当然数组不能存储对象类型,ArrayList在大多数时是很不错的,但是如果有机会有数组实现,还是用数组实现。
数组的复制也是经常遇到的问题,通常是这样做的:
如果知道有个函数是System.arraycopy(src, srcPos, dest, destPos, length),就会这样
原因:System.arraycopy是以本机函数实现的,执行速度更快。
是啊,像你学习了~
就这么点代码,是个人都能看出来arraylist就是封装了数组在里面,你说封装个数组,还比数组快,可能么。
这也就罢了,您换个方式研究咱没意见,最后的结论竟然是为了性能请用数组。
要是这么喜欢性能,您用java干嘛阿。
PS.而且凡是读过书,读过代码,哪怕写过1k行代码的最菜的人,也知道大多数时候,维护一个定长数组需要付出多大的功夫,连cpp里面都漫天vector了。还有人发现了一块新大陆,你让别人能不吐么?
长得丑无所谓,但是出来吓人还是有所谓的。对于不懂的事情,别做总结性发言。
我也没让你来看啊,你自己非要进来看,还回帖一直在这冷嘲热讽,不过还是给谢谢你的建议。
arraylist是随机存储介质,适合于需要访问某个特定位置的内容,而list(linkedlist)一般也就是增删容易,add没有额外的负担,但是遍历很快
需要快速定位,除非是需要key的,否则没人用hashmap,因为hasher本身也是很大的计算复杂度。
就这么点代码,是个人都能看出来arraylist就是封装了数组在里面,你说封装个数组,还比数组快,可能么。
这也就罢了,您换个方式研究咱没意见,最后的结论竟然是为了性能请用数组。
要是这么喜欢性能,您用java干嘛阿。
PS.而且凡是读过书,读过代码,哪怕写过1k行代码的最菜的人,也知道大多数时候,维护一个定长数组需要付出多大的功夫,连cpp里面都漫天vector了。还有人发现了一块新大陆,你让别人能不吐么?
长得丑无所谓,但是出来吓人还是有所谓的。对于不懂的事情,别做总结性发言。
说得好啊,其实你说出了最平凡的道理,但是能做到的人很少,咱们国家的程序员都是这样的,像古代的文人--自古相轻,你搞出了无论是不是好的东西,都会觉得你是个SB,一直是这样
吐呗,可劲吐,只是一种思考,以前从来没想过这些性能问题,而且又没说永远不许用集合对象,
只有通过细致的性能测评和对系统的详尽分析,才能做出正确的选择!!
如果你考虑性能问题就从这些地方入手,还是把编程当做业余爱好吧。
外国一个编程的高手,Peter hagger--大名鼎鼎的practicial java的作者,也考虑了这个问题,我就是看他的文章,思考的。总之,谢谢你的建议。
吐呗,可劲吐,只是一种思考,以前从来没想过这些性能问题,而且又没说永远不许用集合对象,
只有通过细致的性能测评和对系统的详尽分析,才能做出正确的选择!!
如果你考虑性能问题就从这些地方入手,还是把编程当做业余爱好吧。
吐啊吐啊就习惯了。这个版面真让人不敢来啊。
呵呵,你是不是楼上的小弟啊~
吐呗,可劲吐,只是一种思考,以前从来没想过这些性能问题,而且又没说永远不许用集合对象,
只有通过细致的性能测评和对系统的详尽分析,才能做出正确的选择!!
吐啊吐啊就习惯了。这个版面真让人不敢来啊。
ArrayList可以变换长度,会自动帮你扩展,现在想一下,它是怎么扩展的呢?很容易想到,它就是新建一个数组,把现有的东西复制到一个这个更大的数组中去,实现的,这样的效率极其低下。
引用
array在某些时候的表现,可能比ArrayList快上10倍---
Peter hagger
Peter hagger
有个问题,我事先要是不知道长度呢,我怎么定,可能会想,我估个值,尽可能大,就行了,这样的做法虽然浪费了许多空间,但是
引用
性能上的收益可能超过内存方面的代价,只有通过细致的性能测评和对系统的详尽分析,才能做出正确的选择---Peter hagger
当然数组不能存储对象类型,ArrayList在大多数时是很不错的,但是如果有机会有数组实现,还是用数组实现。
数组的复制也是经常遇到的问题,通常是这样做的:
public void copyArray(int[] src,int[] target){ for(int i:src){ target[i]=src[i]; } }
如果知道有个函数是System.arraycopy(src, srcPos, dest, destPos, length),就会这样
public void copyArray2(int[] src,int[] target){ int length = src.length; System.arraycopy(src, 0, target, 0, length); }
打印结果: 用普通复制方法的时间32 用System.arraycopy的时间15
原因:System.arraycopy是以本机函数实现的,执行速度更快。
评论
13 楼
DoubleEO
2009-01-10
抛出异常的爱 写道
如果想要多次增加数组大小
用list比array快.....因为:
如果想要快速遍历所有点.
list比array快
因为:
如果想要快速定位
用hashmap会不会更快一点呢.
用list比array快.....因为:
int newCapacity = (oldCapacity * 3)/2 + 1; //....... elementData = Arrays.copyOf(elementData, newCapacity);
如果想要快速遍历所有点.
list比array快
因为:
//当remove时 System.arraycopy(elementData, index+1, elementData, index, numMoved);
如果想要快速定位
用hashmap会不会更快一点呢.
是啊,像你学习了~
12 楼
DoubleEO
2009-01-10
hurricane1026 写道
/* * @(#)ArrayList.java 1.56 06/04/21 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.util; /** * Resizable-array implementation of the <tt>List</tt> interface. Implements * all optional list operations, and permits all elements, including * <tt>null</tt>. In addition to implementing the <tt>List</tt> interface, * this class provides methods to manipulate the size of the array that is * used internally to store the list. (This class is roughly equivalent to * <tt>Vector</tt>, except that it is unsynchronized.)<p> * * The <tt>size</tt>, <tt>isEmpty</tt>, <tt>get</tt>, <tt>set</tt>, * <tt>iterator</tt>, and <tt>listIterator</tt> operations run in constant * time. The <tt>add</tt> operation runs in <i>amortized constant time</i>, * that is, adding n elements requires O(n) time. All of the other operations * run in linear time (roughly speaking). The constant factor is low compared * to that for the <tt>LinkedList</tt> implementation.<p> * * Each <tt>ArrayList</tt> instance has a <i>capacity</i>. The capacity is * the size of the array used to store the elements in the list. It is always * at least as large as the list size. As elements are added to an ArrayList, * its capacity grows automatically. The details of the growth policy are not * specified beyond the fact that adding an element has constant amortized * time cost.<p> * * An application can increase the capacity of an <tt>ArrayList</tt> instance * before adding a large number of elements using the <tt>ensureCapacity</tt> * operation. This may reduce the amount of incremental reallocation. * * <p><strong>Note that this implementation is not synchronized.</strong> * If multiple threads access an <tt>ArrayList</tt> instance concurrently, * and at least one of the threads modifies the list structurally, it * <i>must</i> be synchronized externally. (A structural modification is * any operation that adds or deletes one or more elements, or explicitly * resizes the backing array; merely setting the value of an element is not * a structural modification.) This is typically accomplished by * synchronizing on some object that naturally encapsulates the list. * * If no such object exists, the list should be "wrapped" using the * {@link Collections#synchronizedList Collections.synchronizedList} * method. This is best done at creation time, to prevent accidental * unsynchronized access to the list:<pre> * List list = Collections.synchronizedList(new ArrayList(...));</pre> * * <p>The iterators returned by this class's <tt>iterator</tt> and * <tt>listIterator</tt> methods are <i>fail-fast</i>: if the list is * structurally modified at any time after the iterator is created, in any way * except through the iterator's own <tt>remove</tt> or <tt>add</tt> methods, * the iterator will throw a {@link ConcurrentModificationException}. Thus, in * the face of concurrent modification, the iterator fails quickly and cleanly, * rather than risking arbitrary, non-deterministic behavior at an undetermined * time in the future.<p> * * Note that the fail-fast behavior of an iterator cannot be guaranteed * as it is, generally speaking, impossible to make any hard guarantees in the * presence of unsynchronized concurrent modification. Fail-fast iterators * throw <tt>ConcurrentModificationException</tt> on a best-effort basis. * Therefore, it would be wrong to write a program that depended on this * exception for its correctness: <i>the fail-fast behavior of iterators * should be used only to detect bugs.</i><p> * * This class is a member of the * <a href="{@docRoot}/../technotes/guides/collections/index.html"> * Java Collections Framework</a>. * * @author Josh Bloch * @author Neal Gafter * @version 1.56, 04/21/06 * @see Collection * @see List * @see LinkedList * @see Vector * @since 1.2 */ public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. */ private transient Object[] elementData; /** * The size of the ArrayList (the number of elements it contains). * * @serial */ private int size; /** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @exception IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this(10); } /** * Constructs a list containing the elements of the specified * collection, in the order they are returned by the collection's * iterator. * * @param c the collection whose elements are to be placed into this list * @throws NullPointerException if the specified collection is null */ public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } /** * Trims the capacity of this <tt>ArrayList</tt> instance to be the * list's current size. An application can use this operation to minimize * the storage of an <tt>ArrayList</tt> instance. */ public void trimToSize() { modCount++; int oldCapacity = elementData.length; if (size < oldCapacity) { elementData = Arrays.copyOf(elementData, size); } } /** * Increases the capacity of this <tt>ArrayList</tt> instance, if * necessary, to ensure that it can hold at least the number of elements * specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } } /** * Returns the number of elements in this list. * * @return the number of elements in this list */ public int size() { return size; } /** * Returns <tt>true</tt> if this list contains no elements. * * @return <tt>true</tt> if this list contains no elements */ public boolean isEmpty() { return size == 0; } /** * Returns <tt>true</tt> if this list contains the specified element. * More formally, returns <tt>true</tt> if and only if this list contains * at least one element <tt>e</tt> such that * <tt>(o==null ? e==null : o.equals(e))</tt>. * * @param o element whose presence in this list is to be tested * @return <tt>true</tt> if this list contains the specified element */ public boolean contains(Object o) { return indexOf(o) >= 0; } /** * Returns the index of the first occurrence of the specified element * in this list, or -1 if this list does not contain the element. * More formally, returns the lowest index <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, * or -1 if there is no such index. */ public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; } /** * Returns the index of the last occurrence of the specified element * in this list, or -1 if this list does not contain the element. * More formally, returns the highest index <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, * or -1 if there is no such index. */ public int lastIndexOf(Object o) { if (o == null) { for (int i = size-1; i >= 0; i--) if (elementData[i]==null) return i; } else { for (int i = size-1; i >= 0; i--) if (o.equals(elementData[i])) return i; } return -1; } /** * Returns a shallow copy of this <tt>ArrayList</tt> instance. (The * elements themselves are not copied.) * * @return a clone of this <tt>ArrayList</tt> instance */ public Object clone() { try { ArrayList<E> v = (ArrayList<E>) super.clone(); v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } } /** * Returns an array containing all of the elements in this list * in proper sequence (from first to last element). * * <p>The returned array will be "safe" in that no references to it are * maintained by this list. (In other words, this method must allocate * a new array). The caller is thus free to modify the returned array. * * <p>This method acts as bridge between array-based and collection-based * APIs. * * @return an array containing all of the elements in this list in * proper sequence */ public Object[] toArray() { return Arrays.copyOf(elementData, size); } /** * Returns an array containing all of the elements in this list in proper * sequence (from first to last element); the runtime type of the returned * array is that of the specified array. If the list fits in the * specified array, it is returned therein. Otherwise, a new array is * allocated with the runtime type of the specified array and the size of * this list. * * <p>If the list fits in the specified array with room to spare * (i.e., the array has more elements than the list), the element in * the array immediately following the end of the collection is set to * <tt>null</tt>. (This is useful in determining the length of the * list <i>only</i> if the caller knows that the list does not contain * any null elements.) * * @param a the array into which the elements of the list are to * be stored, if it is big enough; otherwise, a new array of the * same runtime type is allocated for this purpose. * @return an array containing the elements of the list * @throws ArrayStoreException if the runtime type of the specified array * is not a supertype of the runtime type of every element in * this list * @throws NullPointerException if the specified array is null */ public <T> T[] toArray(T[] a) { if (a.length < size) // Make a new array of a's runtime type, but my contents: return (T[]) Arrays.copyOf(elementData, size, a.getClass()); System.arraycopy(elementData, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } // Positional Access Operations /** * Returns the element at the specified position in this list. * * @param index index of the element to return * @return the element at the specified position in this list * @throws IndexOutOfBoundsException {@inheritDoc} */ public E get(int index) { RangeCheck(index); return (E) elementData[index]; } /** * Replaces the element at the specified position in this list with * the specified element. * * @param index index of the element to replace * @param element element to be stored at the specified position * @return the element previously at the specified position * @throws IndexOutOfBoundsException {@inheritDoc} */ public E set(int index, E element) { RangeCheck(index); E oldValue = (E) elementData[index]; elementData[index] = element; return oldValue; } /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return <tt>true</tt> (as specified by {@link Collection#add}) */ public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } /** * Inserts the specified element at the specified position in this * list. Shifts the element currently at that position (if any) and * any subsequent elements to the right (adds one to their indices). * * @param index index at which the specified element is to be inserted * @param element element to be inserted * @throws IndexOutOfBoundsException {@inheritDoc} */ public void add(int index, E element) { if (index > size || index < 0) throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size); ensureCapacity(size+1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; } /** * Removes the element at the specified position in this list. * Shifts any subsequent elements to the left (subtracts one from their * indices). * * @param index the index of the element to be removed * @return the element that was removed from the list * @throws IndexOutOfBoundsException {@inheritDoc} */ public E remove(int index) { RangeCheck(index); modCount++; E oldValue = (E) elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work return oldValue; } /** * Removes the first occurrence of the specified element from this list, * if it is present. If the list does not contain the element, it is * unchanged. More formally, removes the element with the lowest index * <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt> * (if such an element exists). Returns <tt>true</tt> if this list * contained the specified element (or equivalently, if this list * changed as a result of the call). * * @param o element to be removed from this list, if present * @return <tt>true</tt> if this list contained the specified element */ public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; } /* * Private remove method that skips bounds checking and does not * return the value removed. */ private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work } /** * Removes all of the elements from this list. The list will * be empty after this call returns. */ public void clear() { modCount++; // Let gc do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; } /** * Appends all of the elements in the specified collection to the end of * this list, in the order that they are returned by the * specified collection's Iterator. The behavior of this operation is * undefined if the specified collection is modified while the operation * is in progress. (This implies that the behavior of this call is * undefined if the specified collection is this list, and this * list is nonempty.) * * @param c collection containing elements to be added to this list * @return <tt>true</tt> if this list changed as a result of the call * @throws NullPointerException if the specified collection is null */ public boolean addAll(Collection<? extends E> c) { Object[] a = c.toArray(); int numNew = a.length; ensureCapacity(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew; return numNew != 0; } /** * Inserts all of the elements in the specified collection into this * list, starting at the specified position. Shifts the element * currently at that position (if any) and any subsequent elements to * the right (increases their indices). The new elements will appear * in the list in the order that they are returned by the * specified collection's iterator. * * @param index index at which to insert the first element from the * specified collection * @param c collection containing elements to be added to this list * @return <tt>true</tt> if this list changed as a result of the call * @throws IndexOutOfBoundsException {@inheritDoc} * @throws NullPointerException if the specified collection is null */ public boolean addAll(int index, Collection<? extends E> c) { if (index > size || index < 0) throw new IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); Object[] a = c.toArray(); int numNew = a.length; ensureCapacity(size + numNew); // Increments modCount int numMoved = size - index; if (numMoved > 0) System.arraycopy(elementData, index, elementData, index + numNew, numMoved); System.arraycopy(a, 0, elementData, index, numNew); size += numNew; return numNew != 0; } /** * Removes from this list all of the elements whose index is between * <tt>fromIndex</tt>, inclusive, and <tt>toIndex</tt>, exclusive. * Shifts any succeeding elements to the left (reduces their index). * This call shortens the list by <tt>(toIndex - fromIndex)</tt> elements. * (If <tt>toIndex==fromIndex</tt>, this operation has no effect.) * * @param fromIndex index of first element to be removed * @param toIndex index after last element to be removed * @throws IndexOutOfBoundsException if fromIndex or toIndex out of * range (fromIndex < 0 || fromIndex >= size() || toIndex * > size() || toIndex < fromIndex) */ protected void removeRange(int fromIndex, int toIndex) { modCount++; int numMoved = size - toIndex; System.arraycopy(elementData, toIndex, elementData, fromIndex, numMoved); // Let gc do its work int newSize = size - (toIndex-fromIndex); while (size != newSize) elementData[--size] = null; } /** * Checks if the given index is in range. If not, throws an appropriate * runtime exception. This method does *not* check if the index is * negative: It is always used immediately prior to an array access, * which throws an ArrayIndexOutOfBoundsException if index is negative. */ private void RangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size); } /** * Save the state of the <tt>ArrayList</tt> instance to a stream (that * is, serialize it). * * @serialData The length of the array backing the <tt>ArrayList</tt> * instance is emitted (int), followed by all of its elements * (each an <tt>Object</tt>) in the proper order. */ private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff int expectedModCount = modCount; s.defaultWriteObject(); // Write out array length s.writeInt(elementData.length); // Write out all elements in the proper order. for (int i=0; i<size; i++) s.writeObject(elementData[i]); if (modCount != expectedModCount) { throw new ConcurrentModificationException(); } } /** * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is, * deserialize it). */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // Read in size, and any hidden stuff s.defaultReadObject(); // Read in array length and allocate array int arrayLength = s.readInt(); Object[] a = elementData = new Object[arrayLength]; // Read in all elements in the proper order. for (int i=0; i<size; i++) a[i] = s.readObject(); } }
就这么点代码,是个人都能看出来arraylist就是封装了数组在里面,你说封装个数组,还比数组快,可能么。
这也就罢了,您换个方式研究咱没意见,最后的结论竟然是为了性能请用数组。
要是这么喜欢性能,您用java干嘛阿。
PS.而且凡是读过书,读过代码,哪怕写过1k行代码的最菜的人,也知道大多数时候,维护一个定长数组需要付出多大的功夫,连cpp里面都漫天vector了。还有人发现了一块新大陆,你让别人能不吐么?
长得丑无所谓,但是出来吓人还是有所谓的。对于不懂的事情,别做总结性发言。
我也没让你来看啊,你自己非要进来看,还回帖一直在这冷嘲热讽,不过还是给谢谢你的建议。
11 楼
hurricane1026
2009-01-10
抛出异常的爱 写道
如果想要多次增加数组大小
用list比array快.....因为:
如果想要快速遍历所有点.
list比array快
因为:
如果想要快速定位
用hashmap会不会更快一点呢.
用list比array快.....因为:
int newCapacity = (oldCapacity * 3)/2 + 1; //....... elementData = Arrays.copyOf(elementData, newCapacity);
如果想要快速遍历所有点.
list比array快
因为:
//当remove时 System.arraycopy(elementData, index+1, elementData, index, numMoved);
如果想要快速定位
用hashmap会不会更快一点呢.
arraylist是随机存储介质,适合于需要访问某个特定位置的内容,而list(linkedlist)一般也就是增删容易,add没有额外的负担,但是遍历很快
需要快速定位,除非是需要key的,否则没人用hashmap,因为hasher本身也是很大的计算复杂度。
10 楼
抛出异常的爱
2009-01-10
如果想要多次增加数组大小
用list比array快.....因为:
如果想要快速遍历所有点.
list比array快
因为:
如果想要快速定位
用hashmap会不会更快一点呢.
用list比array快.....因为:
int newCapacity = (oldCapacity * 3)/2 + 1; //....... elementData = Arrays.copyOf(elementData, newCapacity);
如果想要快速遍历所有点.
list比array快
因为:
//当remove时 System.arraycopy(elementData, index+1, elementData, index, numMoved);
如果想要快速定位
用hashmap会不会更快一点呢.
9 楼
hurricane1026
2009-01-10
/* * @(#)ArrayList.java 1.56 06/04/21 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.util; /** * Resizable-array implementation of the <tt>List</tt> interface. Implements * all optional list operations, and permits all elements, including * <tt>null</tt>. In addition to implementing the <tt>List</tt> interface, * this class provides methods to manipulate the size of the array that is * used internally to store the list. (This class is roughly equivalent to * <tt>Vector</tt>, except that it is unsynchronized.)<p> * * The <tt>size</tt>, <tt>isEmpty</tt>, <tt>get</tt>, <tt>set</tt>, * <tt>iterator</tt>, and <tt>listIterator</tt> operations run in constant * time. The <tt>add</tt> operation runs in <i>amortized constant time</i>, * that is, adding n elements requires O(n) time. All of the other operations * run in linear time (roughly speaking). The constant factor is low compared * to that for the <tt>LinkedList</tt> implementation.<p> * * Each <tt>ArrayList</tt> instance has a <i>capacity</i>. The capacity is * the size of the array used to store the elements in the list. It is always * at least as large as the list size. As elements are added to an ArrayList, * its capacity grows automatically. The details of the growth policy are not * specified beyond the fact that adding an element has constant amortized * time cost.<p> * * An application can increase the capacity of an <tt>ArrayList</tt> instance * before adding a large number of elements using the <tt>ensureCapacity</tt> * operation. This may reduce the amount of incremental reallocation. * * <p><strong>Note that this implementation is not synchronized.</strong> * If multiple threads access an <tt>ArrayList</tt> instance concurrently, * and at least one of the threads modifies the list structurally, it * <i>must</i> be synchronized externally. (A structural modification is * any operation that adds or deletes one or more elements, or explicitly * resizes the backing array; merely setting the value of an element is not * a structural modification.) This is typically accomplished by * synchronizing on some object that naturally encapsulates the list. * * If no such object exists, the list should be "wrapped" using the * {@link Collections#synchronizedList Collections.synchronizedList} * method. This is best done at creation time, to prevent accidental * unsynchronized access to the list:<pre> * List list = Collections.synchronizedList(new ArrayList(...));</pre> * * <p>The iterators returned by this class's <tt>iterator</tt> and * <tt>listIterator</tt> methods are <i>fail-fast</i>: if the list is * structurally modified at any time after the iterator is created, in any way * except through the iterator's own <tt>remove</tt> or <tt>add</tt> methods, * the iterator will throw a {@link ConcurrentModificationException}. Thus, in * the face of concurrent modification, the iterator fails quickly and cleanly, * rather than risking arbitrary, non-deterministic behavior at an undetermined * time in the future.<p> * * Note that the fail-fast behavior of an iterator cannot be guaranteed * as it is, generally speaking, impossible to make any hard guarantees in the * presence of unsynchronized concurrent modification. Fail-fast iterators * throw <tt>ConcurrentModificationException</tt> on a best-effort basis. * Therefore, it would be wrong to write a program that depended on this * exception for its correctness: <i>the fail-fast behavior of iterators * should be used only to detect bugs.</i><p> * * This class is a member of the * <a href="{@docRoot}/../technotes/guides/collections/index.html"> * Java Collections Framework</a>. * * @author Josh Bloch * @author Neal Gafter * @version 1.56, 04/21/06 * @see Collection * @see List * @see LinkedList * @see Vector * @since 1.2 */ public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. */ private transient Object[] elementData; /** * The size of the ArrayList (the number of elements it contains). * * @serial */ private int size; /** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @exception IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this(10); } /** * Constructs a list containing the elements of the specified * collection, in the order they are returned by the collection's * iterator. * * @param c the collection whose elements are to be placed into this list * @throws NullPointerException if the specified collection is null */ public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } /** * Trims the capacity of this <tt>ArrayList</tt> instance to be the * list's current size. An application can use this operation to minimize * the storage of an <tt>ArrayList</tt> instance. */ public void trimToSize() { modCount++; int oldCapacity = elementData.length; if (size < oldCapacity) { elementData = Arrays.copyOf(elementData, size); } } /** * Increases the capacity of this <tt>ArrayList</tt> instance, if * necessary, to ensure that it can hold at least the number of elements * specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } } /** * Returns the number of elements in this list. * * @return the number of elements in this list */ public int size() { return size; } /** * Returns <tt>true</tt> if this list contains no elements. * * @return <tt>true</tt> if this list contains no elements */ public boolean isEmpty() { return size == 0; } /** * Returns <tt>true</tt> if this list contains the specified element. * More formally, returns <tt>true</tt> if and only if this list contains * at least one element <tt>e</tt> such that * <tt>(o==null ? e==null : o.equals(e))</tt>. * * @param o element whose presence in this list is to be tested * @return <tt>true</tt> if this list contains the specified element */ public boolean contains(Object o) { return indexOf(o) >= 0; } /** * Returns the index of the first occurrence of the specified element * in this list, or -1 if this list does not contain the element. * More formally, returns the lowest index <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, * or -1 if there is no such index. */ public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; } /** * Returns the index of the last occurrence of the specified element * in this list, or -1 if this list does not contain the element. * More formally, returns the highest index <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, * or -1 if there is no such index. */ public int lastIndexOf(Object o) { if (o == null) { for (int i = size-1; i >= 0; i--) if (elementData[i]==null) return i; } else { for (int i = size-1; i >= 0; i--) if (o.equals(elementData[i])) return i; } return -1; } /** * Returns a shallow copy of this <tt>ArrayList</tt> instance. (The * elements themselves are not copied.) * * @return a clone of this <tt>ArrayList</tt> instance */ public Object clone() { try { ArrayList<E> v = (ArrayList<E>) super.clone(); v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } } /** * Returns an array containing all of the elements in this list * in proper sequence (from first to last element). * * <p>The returned array will be "safe" in that no references to it are * maintained by this list. (In other words, this method must allocate * a new array). The caller is thus free to modify the returned array. * * <p>This method acts as bridge between array-based and collection-based * APIs. * * @return an array containing all of the elements in this list in * proper sequence */ public Object[] toArray() { return Arrays.copyOf(elementData, size); } /** * Returns an array containing all of the elements in this list in proper * sequence (from first to last element); the runtime type of the returned * array is that of the specified array. If the list fits in the * specified array, it is returned therein. Otherwise, a new array is * allocated with the runtime type of the specified array and the size of * this list. * * <p>If the list fits in the specified array with room to spare * (i.e., the array has more elements than the list), the element in * the array immediately following the end of the collection is set to * <tt>null</tt>. (This is useful in determining the length of the * list <i>only</i> if the caller knows that the list does not contain * any null elements.) * * @param a the array into which the elements of the list are to * be stored, if it is big enough; otherwise, a new array of the * same runtime type is allocated for this purpose. * @return an array containing the elements of the list * @throws ArrayStoreException if the runtime type of the specified array * is not a supertype of the runtime type of every element in * this list * @throws NullPointerException if the specified array is null */ public <T> T[] toArray(T[] a) { if (a.length < size) // Make a new array of a's runtime type, but my contents: return (T[]) Arrays.copyOf(elementData, size, a.getClass()); System.arraycopy(elementData, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } // Positional Access Operations /** * Returns the element at the specified position in this list. * * @param index index of the element to return * @return the element at the specified position in this list * @throws IndexOutOfBoundsException {@inheritDoc} */ public E get(int index) { RangeCheck(index); return (E) elementData[index]; } /** * Replaces the element at the specified position in this list with * the specified element. * * @param index index of the element to replace * @param element element to be stored at the specified position * @return the element previously at the specified position * @throws IndexOutOfBoundsException {@inheritDoc} */ public E set(int index, E element) { RangeCheck(index); E oldValue = (E) elementData[index]; elementData[index] = element; return oldValue; } /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return <tt>true</tt> (as specified by {@link Collection#add}) */ public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } /** * Inserts the specified element at the specified position in this * list. Shifts the element currently at that position (if any) and * any subsequent elements to the right (adds one to their indices). * * @param index index at which the specified element is to be inserted * @param element element to be inserted * @throws IndexOutOfBoundsException {@inheritDoc} */ public void add(int index, E element) { if (index > size || index < 0) throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size); ensureCapacity(size+1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; } /** * Removes the element at the specified position in this list. * Shifts any subsequent elements to the left (subtracts one from their * indices). * * @param index the index of the element to be removed * @return the element that was removed from the list * @throws IndexOutOfBoundsException {@inheritDoc} */ public E remove(int index) { RangeCheck(index); modCount++; E oldValue = (E) elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work return oldValue; } /** * Removes the first occurrence of the specified element from this list, * if it is present. If the list does not contain the element, it is * unchanged. More formally, removes the element with the lowest index * <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt> * (if such an element exists). Returns <tt>true</tt> if this list * contained the specified element (or equivalently, if this list * changed as a result of the call). * * @param o element to be removed from this list, if present * @return <tt>true</tt> if this list contained the specified element */ public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; } /* * Private remove method that skips bounds checking and does not * return the value removed. */ private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work } /** * Removes all of the elements from this list. The list will * be empty after this call returns. */ public void clear() { modCount++; // Let gc do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; } /** * Appends all of the elements in the specified collection to the end of * this list, in the order that they are returned by the * specified collection's Iterator. The behavior of this operation is * undefined if the specified collection is modified while the operation * is in progress. (This implies that the behavior of this call is * undefined if the specified collection is this list, and this * list is nonempty.) * * @param c collection containing elements to be added to this list * @return <tt>true</tt> if this list changed as a result of the call * @throws NullPointerException if the specified collection is null */ public boolean addAll(Collection<? extends E> c) { Object[] a = c.toArray(); int numNew = a.length; ensureCapacity(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew; return numNew != 0; } /** * Inserts all of the elements in the specified collection into this * list, starting at the specified position. Shifts the element * currently at that position (if any) and any subsequent elements to * the right (increases their indices). The new elements will appear * in the list in the order that they are returned by the * specified collection's iterator. * * @param index index at which to insert the first element from the * specified collection * @param c collection containing elements to be added to this list * @return <tt>true</tt> if this list changed as a result of the call * @throws IndexOutOfBoundsException {@inheritDoc} * @throws NullPointerException if the specified collection is null */ public boolean addAll(int index, Collection<? extends E> c) { if (index > size || index < 0) throw new IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); Object[] a = c.toArray(); int numNew = a.length; ensureCapacity(size + numNew); // Increments modCount int numMoved = size - index; if (numMoved > 0) System.arraycopy(elementData, index, elementData, index + numNew, numMoved); System.arraycopy(a, 0, elementData, index, numNew); size += numNew; return numNew != 0; } /** * Removes from this list all of the elements whose index is between * <tt>fromIndex</tt>, inclusive, and <tt>toIndex</tt>, exclusive. * Shifts any succeeding elements to the left (reduces their index). * This call shortens the list by <tt>(toIndex - fromIndex)</tt> elements. * (If <tt>toIndex==fromIndex</tt>, this operation has no effect.) * * @param fromIndex index of first element to be removed * @param toIndex index after last element to be removed * @throws IndexOutOfBoundsException if fromIndex or toIndex out of * range (fromIndex < 0 || fromIndex >= size() || toIndex * > size() || toIndex < fromIndex) */ protected void removeRange(int fromIndex, int toIndex) { modCount++; int numMoved = size - toIndex; System.arraycopy(elementData, toIndex, elementData, fromIndex, numMoved); // Let gc do its work int newSize = size - (toIndex-fromIndex); while (size != newSize) elementData[--size] = null; } /** * Checks if the given index is in range. If not, throws an appropriate * runtime exception. This method does *not* check if the index is * negative: It is always used immediately prior to an array access, * which throws an ArrayIndexOutOfBoundsException if index is negative. */ private void RangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size); } /** * Save the state of the <tt>ArrayList</tt> instance to a stream (that * is, serialize it). * * @serialData The length of the array backing the <tt>ArrayList</tt> * instance is emitted (int), followed by all of its elements * (each an <tt>Object</tt>) in the proper order. */ private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff int expectedModCount = modCount; s.defaultWriteObject(); // Write out array length s.writeInt(elementData.length); // Write out all elements in the proper order. for (int i=0; i<size; i++) s.writeObject(elementData[i]); if (modCount != expectedModCount) { throw new ConcurrentModificationException(); } } /** * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is, * deserialize it). */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // Read in size, and any hidden stuff s.defaultReadObject(); // Read in array length and allocate array int arrayLength = s.readInt(); Object[] a = elementData = new Object[arrayLength]; // Read in all elements in the proper order. for (int i=0; i<size; i++) a[i] = s.readObject(); } }
就这么点代码,是个人都能看出来arraylist就是封装了数组在里面,你说封装个数组,还比数组快,可能么。
这也就罢了,您换个方式研究咱没意见,最后的结论竟然是为了性能请用数组。
要是这么喜欢性能,您用java干嘛阿。
PS.而且凡是读过书,读过代码,哪怕写过1k行代码的最菜的人,也知道大多数时候,维护一个定长数组需要付出多大的功夫,连cpp里面都漫天vector了。还有人发现了一块新大陆,你让别人能不吐么?
长得丑无所谓,但是出来吓人还是有所谓的。对于不懂的事情,别做总结性发言。
8 楼
DoubleEO
2009-01-09
李逍遥 写道
楼主虽然是研究了一个已经约定俗成的做法
但毕竟是花了心思的
觉得无价值的可以什么都不说
觉得自己牛的可以别来这个版
但没必要冷嘲热讽吧
难道你们一生下来就什么都会啊
但毕竟是花了心思的
觉得无价值的可以什么都不说
觉得自己牛的可以别来这个版
但没必要冷嘲热讽吧
难道你们一生下来就什么都会啊
说得好啊,其实你说出了最平凡的道理,但是能做到的人很少,咱们国家的程序员都是这样的,像古代的文人--自古相轻,你搞出了无论是不是好的东西,都会觉得你是个SB,一直是这样
7 楼
李逍遥
2009-01-09
楼主虽然是研究了一个已经约定俗成的做法
但毕竟是花了心思的
觉得无价值的可以什么都不说
觉得自己牛的可以别来这个版
但没必要冷嘲热讽吧
难道你们一生下来就什么都会啊
但毕竟是花了心思的
觉得无价值的可以什么都不说
觉得自己牛的可以别来这个版
但没必要冷嘲热讽吧
难道你们一生下来就什么都会啊
6 楼
DoubleEO
2009-01-09
hurricane1026 写道
DoubleEO 写道
抛出异常的爱 写道
如果为了快程序里都是[]这东西.....
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
吐呗,可劲吐,只是一种思考,以前从来没想过这些性能问题,而且又没说永远不许用集合对象,
只有通过细致的性能测评和对系统的详尽分析,才能做出正确的选择!!
如果你考虑性能问题就从这些地方入手,还是把编程当做业余爱好吧。
外国一个编程的高手,Peter hagger--大名鼎鼎的practicial java的作者,也考虑了这个问题,我就是看他的文章,思考的。总之,谢谢你的建议。
5 楼
hurricane1026
2009-01-09
DoubleEO 写道
抛出异常的爱 写道
如果为了快程序里都是[]这东西.....
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
吐呗,可劲吐,只是一种思考,以前从来没想过这些性能问题,而且又没说永远不许用集合对象,
只有通过细致的性能测评和对系统的详尽分析,才能做出正确的选择!!
如果你考虑性能问题就从这些地方入手,还是把编程当做业余爱好吧。
4 楼
DoubleEO
2009-01-09
hurricane1026 写道
抛出异常的爱 写道
如果为了快程序里都是[]这东西.....
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
吐啊吐啊就习惯了。这个版面真让人不敢来啊。
呵呵,你是不是楼上的小弟啊~
3 楼
DoubleEO
2009-01-09
抛出异常的爱 写道
如果为了快程序里都是[]这东西.....
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
吐呗,可劲吐,只是一种思考,以前从来没想过这些性能问题,而且又没说永远不许用集合对象,
只有通过细致的性能测评和对系统的详尽分析,才能做出正确的选择!!
2 楼
hurricane1026
2009-01-09
抛出异常的爱 写道
如果为了快程序里都是[]这东西.....
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
吐啊吐啊就习惯了。这个版面真让人不敢来啊。
1 楼
抛出异常的爱
2009-01-09
如果为了快程序里都是[]这东西.....
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
让我出去吐吐回来再看.
能排序?能快速打印?能快速增加?
发表评论
-
【转】Java:使用synchronized和Lock对象获取对象锁
2010-02-28 23:17 975在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。 1 ... -
java基础配置
2009-09-23 13:49 785总有朋友问,每次都打一遍,太麻烦了 在我的电脑 右键 -- ... -
关于ThreadLocal
2009-05-31 22:19 1169一、概述 ThreadLocal是什么呢?其实ThreadLo ... -
构造函数中调用其他的方法会产生的问题
2009-01-14 21:47 835看代码 class Base{ priv ... -
不可变对象,深层次克隆等总结
2009-01-13 15:18 1845前面有篇自己总结的文章,是用final方法标注引用的,引 ... -
集合对象的迭代效率
2009-01-09 16:45 905集合的迭代,在多数情况下,咱们想都不想,就会用下面这种 ... -
局部变量效率更高
2009-01-09 14:09 1012程序中的变量有3种,局部变量,实例变量,类变量,他们在 ... -
几种拼接字符串的效率问题
2009-01-09 09:26 1769每次拼接字符串的时候用习惯了String,从来没想过用其他的c ... -
参数到底怎样传递?只有传值!!
2009-01-05 11:47 778只有传值!! import java. ... -
对接口的概念一直不理解,请畅所欲言,谈谈自己的理解
2008-11-08 18:31 949接口,java中很重要的概念。 在大学的时候(当然了,我大学没 ... -
方法实参传递的疑惑!!
2008-06-15 13:59 1012public class PassArray { ...
相关推荐
在实际编程中,熟练掌握二分查找、二维数组以及数组的复制技术,能够提高代码的效率和质量,帮助我们解决更复杂的问题。对于初学者来说,理解这些基本概念并进行实践是提升编程技能的关键步骤。通过不断练习和应用,...
### MATLAB数组扩展大小的三种方法及其比较 ...综上所述,在MATLAB中处理动态数组时,应优先考虑预先定义数组并逐个赋值的方法,其次可以考虑使用`end`索引来扩展数组。这两种方法都可以有效地提高程序的运行效率。
- 如果有合适的工作队列和硬件支持,可以使用 MATLAB 的并行计算工具箱(Parallel Computing Toolbox)来并行处理字符串数组,进一步提升效率。 9. **优化内存管理**: - 尽可能减少临时变量的使用,及时释放不再...
总结来说,Java中数组复制有多种方法,效率和适用场景各有不同。在处理大规模数据时,System.arraycopy()通常是最佳选择。而进行深拷贝时,对于包含复杂对象结构的组合类,需要利用序列化和反序列化来实现。
8. **性能优化**:考虑到多维数组通常用于处理大量数据,因此优化访问速度和内存使用至关重要。可以通过缓存策略、预计算索引等方式提升性能。 9. **代码结构**:良好的代码组织可以使项目更易于理解和维护。可以...
`repmat` 函数可以将一个或多个输入数组复制并排列成新的矩阵。在本例中,`repmat(struct('x',1), N, 1)` 创建了一个包含 N 个元素的结构体数组,每个元素都有一个名为 'x' 的字段,其值为 1。这种方法在 MATLAB ...
- 表达式求值:计算中缀表达式时,通常使用两个栈分别处理运算符和操作数。 - 括号匹配:验证字符串中括号的正确性,如代码高亮、语法分析等。 - URL编码解码:在URL编码中,字符的编码顺序与解码顺序相反,适合...
4存取数组元素6-5使用Length属性检查数组上下限6-6 数组与集合的比较6-7 声明时初始化数组6-7-1 使用简短的表示法6-7-2 初始化多维的数组6-8 执行时期指定数组的大小6-9 JaggedArray6-10 复制数组变量6-11 ...
4存取数组元素6-5使用Length属性检查数组上下限6-6 数组与集合的比较6-7 声明时初始化数组6-7-1 使用简短的表示法6-7-2 初始化多维的数组6-8 执行时期指定数组的大小6-9 JaggedArray6-10 复制数组变量6-11 ...
例如,可以通过传递指向数组的指针来避免复制整个数组,从而提高效率。 3. **使用指针返回多维数组**: - 函数可以返回指向多维数组的指针,这样可以在函数外部继续使用这些数组。 4. **创建和使用动态数组**: ...
2. 数组扩展与收缩:`zeros`、`ones`函数创建全零或全一数组,`repmat`函数复制数组,`reshape`函数改变数组形状。 3. 数组运算:MATLAB支持基本算术运算,如加减乘除,以及逻辑运算,如比较运算符生成的逻辑数组。 ...
该方法首先对整个数组进行一次翻转操作,接着分别对前k个元素和剩余部分进行翻转,以此达到旋转的效果。这种方法不使用额外空间,是一种空间效率较高的方法。 **Java代码示例**: ```java public void rotate(int[]...
1. **优点**:数组实现的栈空间连续,访问效率高,因为内存的随机访问特性使得在栈顶进行插入和删除操作的时间复杂度为O(1)。 2. **缺点**:固定大小,如果预先不知道栈的最大容量,可能会造成空间浪费;若栈的大小...
- **二分搜索**:对于有序数组,可以使用二分搜索来提高查找效率。 - **哈希表**:使用哈希表来加速查找过程。 ### 25. 水箱问题 **题目描述**:题目要求解决水箱的水量计算问题。 **知识点**: - **数学计算**:...
4. 示例代码:例4-1展示了如何使用一维数组存储10个整数,并找出其中的最大值和最小值。通过循环遍历数组,用当前元素与已知最大值或最小值进行比较更新,最后输出结果。 4.2 字符数组的初始化示例: ```cpp char ...
C++中的`std::vector`是一个非常重要...对于需要动态数组管理的场景,建议优先考虑使用`std::vector`,而非`CArray`或其他手动内存管理方式。通过熟练掌握`std::vector`的使用,可以提高代码的可读性、可维护性和性能。
### 易语言WIN32API知识点详解 #### 一、概述 ...对于开发者来说,了解并掌握这些命令的具体用法可以极大提高开发效率和程序质量。此外,在实际应用过程中还需结合具体场景灵活运用,以便达到最佳效果。
- **数组扩容**:当数组满时,创建新的更大数组并复制旧数组元素。 - **堆排序**:基于堆结构的排序算法,构建最大堆或最小堆。 理解并熟练运用这些数据结构和算法,不仅能提升Java编程的效率,还能帮助你在面试...