数组的基本功能:
1
、数组基础
<1> 用来存储一组类型相同的数据
<2> 在内存中,分配连续的空间,数组创建时要指定容量(大小)
<3> 数据类型[] 数组名 int[] arr = new int[10] int[] arr2 = {1,2,3,4}
<4> 索引---访问数组时通过索引进行操作
<5> 索引从0开始,最大为 arr.length -1
<6> 常见的错误: NullPointException ArrayIndexOutOfBoundsException
<7> 常见的数组: 字符串, 对象数组,哈希表
2
、演示数组的使用
3
、使用数组时,最重要的就是数组的
索引
,通过索引可以对数组进行改和查操作。
1.数组的组成:
这里使用了泛型,数组可以是任何类型
private int size;//当前元素个数
private int capacity;//容量
private T[]data;//数组保存数据
2.数组的构造方法:
public MyArray(int capacity) {
this.capacity = capacity;
this.size=0;
this.data=(T[])(new Object[this.capacity]);
}
3.获取数组中元素个数
//获取数组元素个数
public int getSize(){
return this.size;
}
4.数组的容积:
//获取数组容积
public int getCapacity(){
return this.capacity;
}
5.判断数组是否为空:
//判断数组是否为空
public boolean isEmity(){
return this.size==0;
}
6.数组容积的变化:
private void resize(int newcapacity){
T[]newdata=(T[])(new Object[newcapacity]);
for(int i=0;i<this.size;i++){
newdata[i]=this.data[i];
}
this.capacity=newcapacity;
this.data=newdata;
}
7.像数组里添加元素:并扩容:
public void add(T item,int index){
if(index<0||index>this.size){
throw new IllegalArgumentException("index is invalid");
}
//this.size表示待插入元素的位置
if(this.size==this.capacity){
resize(this.capacity*2);
}
for(int i=size-1;i>=index;i--){
this.data[i+1]=this.data[i];
}
this.data[index]=item;
this.size++;
}
8.修改指定位置的值:
//修改指定位置值
public void modify(int index,T value){
if(index<0||index>this.size){
throw new IllegalArgumentException("index is invalid");
}
this.data[index]=value;
}
9.获取索引位置元素:
//获取指定索引位置元素
public T getValue(int index){
if(index<0||index>this.size){
throw new IllegalArgumentException("index is invalid");
}
return this.data[index];
}
10.查询指定位置的值在数组中是否存在并返回索引
//查询指定位置的值在数组中是否存在,返回索引
public int containsValue(T val){
for(int i=0;i<this.size;i++){
if(val.equals(this.data[i])){
return i;
}
}
return -1;
}
11.删除索引位置数组元素:以及数组的缩容
缩容是/4来判断,/2来缩容
是为了防止数组的震荡:复杂度的震荡 ,当我们同时进行addLast和removeLast的操作
//根据索引删除数组元素
public void removeValue(int index){
if (index < 0 || index > this.size) {
throw new IllegalArgumentException("index is invalid");
}
for (int i = index + 1; i < this.size; i++) {
this.data[i - 1] = this.data[i];
}
if(this.size<this.capacity/4&&this.capacity/2>0){
resize((this.capacity)/2);
}
this.size--;
}
12.tostring方法重写:
@Override
public String toString() {
StringBuilder sb=new StringBuilder("[");
for(int i=0;i<this.size;i++){
sb.append(this.data[i]);
if(i!=this.size-1){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
13.主函数及部分方法应用:
public static void main(String[] args) {
MyArray<Integer> myArray=new MyArray<>(3);
Random random=new Random();
myArray.add(10,0);
System.out.println("容积:"+myArray.capacity+"元素个数:"+myArray.size);
for(int i=0;i<3;i++){
myArray.add(random.nextInt(20),myArray.size);
}
myArray.add(40,myArray.size);
System.out.println("容积:"+myArray.capacity+"元素个数:"+myArray.size);
System.out.println(myArray.toString()+myArray.capacity);
while(!myArray.isEmity()){
myArray.removeValue(0);
System.out.println("容积:"+myArray.capacity+"元素个数:"+myArray.size);
}
}
完整代码
package com.ffyc.learn;
import java.util.Arrays;
import java.util.Random;
public class MyArray<T> {
private int size;//当前元素个数
private int capacity;//容量
private T[]data;//数组保存数据
//构造方法
public MyArray(int capacity) {
this.capacity = capacity;
this.size=0;
this.data=(T[])(new Object[this.capacity]);
}
//获取数组元素个数
public int getSize(){
return this.size;
}
//获取数组容积
public int getCapacity(){
return this.capacity;
}
//判断数组是否为空
public boolean isEmity(){
return this.size==0;
}
private void resize(int newcapacity){
T[]newdata=(T[])(new Object[newcapacity]);
for(int i=0;i<this.size;i++){
newdata[i]=this.data[i];
}
this.capacity=newcapacity;
this.data=newdata;
}
//数组添加元素
public void add(T item,int index){
if(index<0||index>this.size){
throw new IllegalArgumentException("index is invalid");
}
//this.size表示待插入元素的位置
if(this.size==this.capacity){
resize(this.capacity*2);
}
for(int i=size-1;i>=index;i--){
this.data[i+1]=this.data[i];
}
this.data[index]=item;
this.size++;
}
//修改指定位置值
public void modify(int index,T value){
if(index<0||index>this.size){
throw new IllegalArgumentException("index is invalid");
}
this.data[index]=value;
}
//获取指定索引位置元素
public T getValue(int index){
if(index<0||index>this.size){
throw new IllegalArgumentException("index is invalid");
}
return this.data[index];
}
//查询指定位置的值在数组中是否存在,返回索引
public int containsValue(T val){
for(int i=0;i<this.size;i++){
if(val.equals(this.data[i])){
return i;
}
}
return -1;
}
//根据索引删除数组元素
public void removeValue(int index){
if (index < 0 || index > this.size) {
throw new IllegalArgumentException("index is invalid");
}
for (int i = index + 1; i < this.size; i++) {
this.data[i - 1] = this.data[i];
}
if(this.size<this.capacity/4&&this.capacity/2>0){
resize((this.capacity)/2);
}
this.size--;
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder("[");
for(int i=0;i<this.size;i++){
sb.append(this.data[i]);
if(i!=this.size-1){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
public static void main(String[] args) {
MyArray<Integer> myArray=new MyArray<>(3);
Random random=new Random();
myArray.add(10,0);
System.out.println("容积:"+myArray.capacity+"元素个数:"+myArray.size);
for(int i=0;i<3;i++){
myArray.add(random.nextInt(20),myArray.size);
}
myArray.add(40,myArray.size);
System.out.println("容积:"+myArray.capacity+"元素个数:"+myArray.size);
System.out.println(myArray.toString()+myArray.capacity);
while(!myArray.isEmity()){
myArray.removeValue(0);
System.out.println("容积:"+myArray.capacity+"元素个数:"+myArray.size);
}
}
}