JAVA中的容器|集合

175 阅读3分钟

1.容器

1.什么是容器

我们可以把容器和数组进行比较,这样可以方便我们理解容器.

数组的特点:

  • 存储多个数据
  • 数据类型相同
  • 长度不可变
  • 有序(根据索引)

容器的特点

  • 存储多个数据
  • 长度可以随着内容的多少进行修改
  • 可以存储任意类型的数据

2.自定义的容器类: 只能存储字符串类型的数据

我们需要实现以下功能

  • 添加功能
  • 删除数据
  • 修改数据
  • 查询数据
public class App01 {
   public static void main(String[] args) {
   	MyContainer container=new MyContainer();
   	container.add("钢铁侠");
   	System.out.println(container.size());
   	container.add("蜘蛛侠");
   	System.out.println(container.size());
   	container.add("猪猪侠");
   	System.out.println(container.size());
   	
   	System.out.println(container.get(0));
   	System.out.println(container.get(1));
   	System.out.println(container.get(2));
   	
   	System.out.println(container);
   	container.delete(1);
   	System.out.println(container);
   	
   	
   }
}

//自定义容器类
class MyContainer{
   //字符串数组,存储容器中的数据
   private String[] arr;
   //存储容器中数据的个数
   private int size;
   
   public MyContainer() {
   	arr = new String[0];
   }
   /*
    * 
    */
   public String get(int index) {
   	if(index<0 || index>=size){
   		return "数组索引越界!!!";
   	}
   	return arr[index];
   }
   
   /*
    * 存储数据:
    * 	返回值:不需要		参数:String
    */
   public void add(String value) {
   	//备份原数组的地址
   	String[] temp=arr;
   	arr=new String[size+1];
   	//原数组中数据拷贝到新数组对应位置
   	for(int i=0;i<=size-1;i++){
   		arr[i]=temp[i];
   	}
   	//把参数赋值给数组的最后位置
   	arr[size]=value;
   	//长度+1
   	size++;
   }
   
   //删除方法
   //返回值:没有 		参数:根据索引删除  
   public void delete(int index){
   	if(index<0 || index>=size){
   		throw new ArrayIndexOutOfBoundsException( "数组索引越界!!!");
   	}
   	String[] temp=arr;
   	arr=new String[size-1];
   	//根据索引循环,判断当前索引值是否与要删除的数据的索引相同
   	for(int i=0;i<=size-1;i++){
   		if(i>=index){
   			if(i==index){
   				continue;
   			}
   			arr[i-1]=temp[i];
   		}else{
   			arr[i]=temp[i];
   		}
   	}
   	size--;
   }
   
   
   public int size(){
   	return this.size;
   }
   @Override
   public String toString() {
   	return "MyContainer [arr=" + Arrays.toString(arr) + ", size=" + size + "]";
   }
}

容器类中可以存放不同类型的数据,但是必须都是为引用类型的数据,基本数据类型会自动装箱.

2.遍历

接下来我为大家介绍遍历容器中的数据的几种方法

例子

public class ListDemo02 {
	public static void main(String[] args) {
		List<String> list=new ArrayList();
		list.add("钢铁侠");
		list.add("美国队长");
		list.add("黑寡妇");
		list.add("灭霸");
		list.add("蜘蛛侠");
		list.add("雷神");
		System.out.println(list);
		
		//1.普通for
		/*for(int i=0;i<list.size();i++){
			if("灭霸".equals(list.get(i))){
				list.add("惊奇队长");
			}
		}*/
		
		//1.for each
		//ConcurrentModificationException //出现异常
		/*for(String s :list){
			if("灭霸".equals(s)){
				list.add("惊奇队长");
			}
		}*/
		
		//3.迭代器
		//ConcurrentModificationException 通过多个引用同时操作对象时,不允许同时操作,可能会发生这个异常
		/*for(Iterator<String> it=list.iterator();it.hasNext();){
			if("灭霸".equals(it.next())){
				list.add("惊奇队长");
			}
		}*/
		
		//4.列表迭代器
		//ListIterator<E> listIterator()  
		ListIterator it=list.listIterator();
		while(it.hasNext()){
			if("灭霸".equals(it.next())){
				it.add("惊奇队长");
			}
		}
		System.out.println(list);
	}
}

以上例子中用到迭代器与增强For时出现了异常,通过多个引用同时操作对象时,不允许同时操作.

1.增强For循环 for...each

for(Iterator<String> it=list.iterator();it.hasNext();){
			if("灭霸".equals(it.next())){
				list.add("惊奇队长");
			}
		}

2.迭代器

for(Iterator<String> it=list.iterator();it.hasNext();){
			if("灭霸".equals(it.next())){
				list.add("惊奇队长");
			}
		}

3.普通For

for(int i=0;i<list.size();i++){
	if("灭霸".equals(list.get(i))){
		list.add("惊奇队长");
	}
}

4.列表迭代器

ListIterator it=list.listIterator();
	while(it.hasNext()){
		if("灭霸".equals(it.next())){
		    it.add("惊奇队长");
	}
}