在JDK1.7中,如果通过无参构造的话,初始数组容量为0,当真正对数组进行添加时,才真正分配容量。
每次按照1.5倍(位运算)的比率通过copeOf的方式扩容。
在JKD1.6中,如果通过无参构造的话,初始数组容量为10.每次通过copeOf的方式扩容后容量为原来的1.5倍加1.以上就是
1.存放int类型
代码
public class MyArrayList {
private static final int DEFAULT_CAPACITY=10;
private int capacity;
private int size;
private int[] elements;
public MyArrayList(int capacity){
this.size=0;
this.capacity=capacity;
elements=new int[capacity];
}
public MyArrayList(){
this(DEFAULT_CAPACITY);
}
public void add(int element){
add(size,element);
}
public void add(int index,int element) throws IndexOutOfBoundsException{
if(index<0&&size>=capacity){
throw new IndexOutOfBoundsException();
}
capacityCheck();
for(int i=size;i>index;i--){
if(i>0)
elements[i]=elements[i-1];
}
elements[index]=element;
size++;
}
public void capacityCheck() {
if(size<capacity-1){
return;
}
int newCapacity=(capacity>>1)+capacity;//1.5倍
this.capacity=newCapacity;
int[] newElements=new int[newCapacity];
for(int i=0;i<size;i++){
newElements[i]=elements[i];
}
elements=newElements;
}
public int remove(int index) throws IndexOutOfBoundsException{
if(index<0||index>=size){
throw new IndexOutOfBoundsException();
}
int old=elements[index];
for(int i=index;i<size;i++){
elements[i]=elements[i+1];
}
size--;
return old;
}
public int set(int index,int element) throws IndexOutOfBoundsException{
if(index<0&&size>=capacity){
throw new IndexOutOfBoundsException();
}
int old=elements[index];
elements[index]=element;
return old;
}
@Override
public String toString() {
StringBuffer sb=new StringBuffer("现在的数字数量=").append(size).append("[");
for(int i=0;i<size;i++){
if(i!=size-1){//不是最后一个
sb.append(elements[i]).append(";");
}
else{
sb.append(elements[i]);
}
}
sb.append("]");
return sb.toString();
}
}
测试
public class Main {
public static void main(String[] args) {
MyArrayList list=new MyArrayList();
list.add(1); list.add(2); list.add(3); list.add(4); list.add(5);
list.add(6); list.add(7); list.add(8); list.add(9); list.add(10);
list.add(11);
list.remove(4);
list.set(0,111);
System.out.println(list.toString());
}
}
2.存放泛型
代码
public class MyArrayList<E> {
private static final int DEFAULT_CAPACITY=10;
private int capacity;
private int size;
private E[] elements;
public MyArrayList(int capacity){
this.size=0;
this.capacity=capacity;
elements=(E[])new Object[capacity];
}
public MyArrayList(){
this(DEFAULT_CAPACITY);
}
public void add(E element){
add(size,element);
}
public void add(int index,E element) throws IndexOutOfBoundsException{
if(index<0&&size>=capacity){
throw new IndexOutOfBoundsException();
}
capacityCheck();
for(int i=size;i>index;i--){
if(i>0)
elements[i]=elements[i-1];
}
elements[index]=element;
size++;
}
public void capacityCheck() {
if(size<capacity-1){
return;
}
int newCapacity=(capacity>>1)+capacity;//1.5倍
this.capacity=newCapacity;
E[] newElements=(E[])new Object[newCapacity];
for(int i=0;i<size;i++){
newElements[i]=elements[i];
}
elements=newElements;
}
public E remove(int index) throws IndexOutOfBoundsException{
if(index<0||index>=size){
throw new IndexOutOfBoundsException();
}
E old=elements[index];
for(int i=index;i<size;i++){
elements[i]=elements[i+1];
}
size--;
return old;
}
public E set(int index,E element) throws IndexOutOfBoundsException{
if(index<0&&size>=capacity){
throw new IndexOutOfBoundsException();
}
E old=elements[index];
elements[index]=element;
return old;
}
@Override
public String toString() {
StringBuffer sb=new StringBuffer("现在的数字数量=").append(size).append("[");
for(int i=0;i<size;i++){
if(i!=size-1){//不是最后一个
sb.append(elements[i].toString()).append(";");
}
else{
sb.append(elements[i].toString());
}
}
sb.append("]");
return sb.toString();
}
}
测试
public class Main {
static class Person{
private int age;
Person(int age){
this.age=age;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
'}';
}
}
public static void main(String[] args) {
MyArrayList<Person> list=new MyArrayList<>();
list.add(new Person(1));
list.add(new Person(2));
list.add(new Person(3));
list.add(new Person(4));
list.add(new Person(5));
list.add(new Person(6));
list.add(new Person(7));
list.add(new Person(8));
list.remove(4);
list.set(0,new Person(111));
System.out.println(list.toString());
}
}