容器所提及的接口以及实现1

List和Set均继承了Collection的全部方法(均为接口)

package testingDate;
import java.util.*;
/*
 * 
 * 测试Collection接口中的方法
 * 
 * 
 * 
 * */
public class TestList {
	public static void main(String[] args) {
		Collection<String> c = new ArrayList();
		//实现了List接口,List继承Collection接口,打开声明可以看出需要对泛型进行定义
		//c.size();
		//返回元素数
		System.out.println(c.size());
		System.out.println(c.isEmpty());
		//isEmpty()判断是否为空
		c.add("栈");
		c.add("堆");
		//add方法添加元素,由于已经定义为字符串类型所以只能添加字符串进来
		System.out.println(c);
		System.out.println(c.size());
		Object[] objs = c.toArray();
		//将c转化为Object数组返回
		System.out.println(c.contains("堆"));
		//判断其中是否包含了“堆”
		c.remove("栈");
		//把对象移出容器,不是删除本身,不同于delete
		System.out.println(c);
		System.out.println(c.size());
		c.clear();
		//移除所有元素
		System.out.println(c);
		System.out.println(c.size());
		//这些常用方法在List和Set中均得到实现
		
	}
}

Collection接口
(对于两个集合的操作)
a.addAll(b容器)
将b中的所有元素加到a中
a.removeAll(b)
将b和a共同的元素在a中删除
a.retainAll(b)
只留下b和a的共同元素
a.containsAll(b)
返回a是否包含b全部元素的结果

List
有序,可重复的容器(底层实现就是数组)
重复指允许多个满足a.equals(b)的元素重复存在
常用实现有3个:ArrayList(数组,查询效率高,增删效率低,线程不够安全)、LinkedList(链表)和Vector(底层也是数组,线程安全)。

package testingDate; import java.util.; / * * 测试Collection接口中的方法

        • */ public class TestList { public static void main(String[] args) { test01(); } public static void test01() {
          List list = new ArrayList<>(); list.add(“A”);
          list.add(“B”); list.add(“C”); list.add(“D”);
          System.out.println(list); list.add(2,“方法区”);
          System.out.println(list); //相当于创建了新的2号元素,插入到原本二号位,长度加一
          list.set(3,“堆”); System.out.println(list); //替换,add是插入
          list.get(3);System.out.println(list.get(3)); //获得索引位置的元素
          list.get(3);System.out.println(list.indexOf(“堆”));
          //返回指定的元素第一次出现的索引位置,没找到的时候返回-1

          }

    }

ArrayList是可以存放任意数量对象长度不受限制的

采用数组扩容的思想,当检测到不能储存了,定义一个长度更大的数组 同时把前十个内容拷贝到新数组,每次检测到满再扩容

package testingDate;
/*
 * 尝试复刻一下ArrayList的内容
 * 
 * 
 * 
 * */
public class CopyArrayLIst <E>{
		private Object[] elementData;
		private int size;//长度
		private static final int DEFALT_CAPACITY = 10;
		//默认初始大小
		public CopyArrayLIst(){
		elementData = new Object[DEFALT_CAPACITY];
			
		}
		public CopyArrayLIst(int capacity){
			elementData = new Object[capacity];
		}
		public void add(E element) {
			elementData[size++]= element;
			//添加element的同时增长size
			
		}
		//为了打印时直观可以重写toString方法
		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append("[");
			for(int i=0;i<size;i++) {
				//只打印有内容部分
				sb.append(elementData[i]+",");
			}
			sb.setCharAt(sb.length()-1,']');
			//最后一个位置不需要逗号,将该字符改为后中括号
			return sb.toString();
			
			
		}
		
		
		
		public static void main(String[] args) {
			CopyArrayLIst s1 = new CopyArrayLIst(20);
			s1.add("aa");
			s1.add("bb");
			System.out.print(s1);
		}
		
		

}摘自b站教程
修改数组扩容版本:
package testingDate;
public class CopyArrayLIst <E>{
		private Object[] elementData;
		private int size;//长度
		private static final int DEFALT_CAPACITY = 10;
		//默认初始大小
		public CopyArrayLIst(){
		elementData = new Object[DEFALT_CAPACITY];
			
		}
		public CopyArrayLIst(int capacity){
			elementData = new Object[capacity];
		}
		public void add(E element) {
			
			/*什么时候扩容
			 * 怎么扩容
			 * 
			 * 
			 * 
			 * */
			//添加element的同时增长size
			if(size==elementData.length) {
				Object[] newArray = new Object[elementData.length+(elementData.length>>1)];
						//>>1右移一位相当于除以2
				
				System.arraycopy(elementData, 0, newArray,0, elementData.length);
						//K拷贝老数组内容到新数组,arraycopy方法在之前数组中学过
				elementData = newArray;
			
			}
			
			elementData[size++]= element;
			
			
			
			
		}
		//为了打印时直观可以重写toString方法
		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append("[");
			for(int i=0;i<size;i++) {
				//只打印有内容部分
				sb.append(elementData[i]+",");
			}
			sb.setCharAt(sb.length()-1,']');
			//最后一个位置不需要逗号,将该字符改为后中括号
			return sb.toString();
			
			
		}
		
		
		
		public static void main(String[] args) {
			CopyArrayLIst s1 = new CopyArrayLIst(20);
			s1.add("aa");
			s1.add("bb");
			for (int i=0;i<50;i++) {
				s1.add("mm"+i);
			}
			System.out.print(s1);
		}
		
		

}

编写的时候记得时刻提防索引越界情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值