【java集合】Collection,List,Set

Collection接口

	无序  允许重复

public interface Collection extends Iterable
Iterator

add新增 remove删除 contains判断集合中是否有指定元素 clear清空集合

size元素个数

iterator获取迭代器,通过迭代器遍历集合中的所有元素

toArray转换为等长的数组

如何判断删除的元素相等
equals

定义equals方法可以依赖于IDE工具自动生成

	@Override
  public boolean equals(Object obj) {
  	// 用户自定义的比较规则
  	if (this == obj)
  		return true;
  	if (obj == null)  //当前对象不可能为null,否则空指针异常
  		return false;
  	if (getClass() != obj.getClass())  // 类型判断。一个类只能加载一次
  		return false;
  	A1 other = (A1) obj;
  	//调用Objects工具类中的方法进行相等判断
  	 public static boolean equals(Object a, Object b) {
       return (a == b) || (a != null && a.equals(b));
      }
  	return Objects.equals(id, other.id) && Objects.equals(name, other.name);
  }

==和equals

  • ==比较的是对象的引用值
  • equals用户自定义比较规则。如果没有自定义equals方法,则从
    Object类中继承得到equals方法
    public boolean equals(Object obj) {
    return (this == obj);
    }

List接口

	有序 允许重复

public interface List extends Collection

继承自Collection接口的方法

  • boolean add(E e);向集合末尾追加元素e对象

  • boolean remove(Object obj)删除第一个和obj相等的元素,
    如果没有和obj相等元素,则报异常IndexOutOfBoundsException

List接口中的特殊方法

  • void add(int index, E element); 向指定索引位置index上添加元素element,
    原始数据自动后移

  • E get(int index); 获取指定索引号对应的元素,index应该在[0,size-1]

  • E set(int index, E element); 用于给指定索引位置上进行赋值,这个位
    置上必须有对应的数据(已经赋过值),这里实际上是修改操作,否则
    IndexOutOfBoundsException

  • E remove(int index);删除指定位置的元素,可以返回原始位置上存储的元素

  • int indexOf(Object o); 查找从左向右第一个o元素的下标索引,如果元素
    不存在返回-1

  • int lastIndexOf(Object o);从右向左查找

    对象相等判定使用的是equals方法
    
  • sort方法按照自定义比较器对集合中的所有元素进行排序,默认自然序

default void sort(Comparator<? super E> c) {
     Object[] a = this.toArray();  //将List集合对象转换为数组
      Arrays.sort(a, (Comparator) c);  //调用Arrays工具类中的排序方法对数组进行排序
      ListIterator<E> i = this.listIterator();  //获取List集合对象中特殊的Iterator迭代器对象
      for (Object e : a) {  //foreach结构遍历数组中的所有元素
          i.next();
          i.set((E) e); //修改集合List中迭代器指定的当前位置上的元素
      }
  }
list.sort(new Comparator<A2>() {
		public int compare(A2 o1, A2 o2) {
			// 自定义比较规则,按照id从小到大,如果id相等则按照name从大到小
			int res = o1.getId().compareTo(o2.getId());
			if (res == 0)
				res = (o1.getName().compareTo(o2.getName())) * -1;
			return res;
		}
	});
	
调用方法时要求传入参数为自定义比较器

对应的实现类
ArrayList底层实现为数组,线程不安全
Vector底层实现为数组,线程安全 synchronized
LinkedList底层实现为链表,线程不安全

Set集合

无序,不允许重复

public interface Set extends Collection

没有新方法

  • boolean add(E e);向集合中追加元素e对象,如果出现重复则后添加数
    据直接丢弃

如果进行对象相等比较:

  • 首先调用当前对象所属类中的hashCode方法获取当前对象的hashCode值
  • 按照hashCode值进行比较,
    • 如果hashCode值不相等,则不会调用equals方法,直接得出结论两
      个对象不相等
    • 如果hashCode值相等,才调用equals方法进行进一步判断
  • 如果equals为真则判断两个对象相等

潜规则:
java要求当两个对象的equals为true时,要求两个对象的hashCode值相等。
hashCode值相等并不一定equals为true

实现类:

  • HashSet底层实现为HashMap哈希表
  • LinkedHashSet底层实现为LinkedHashMap,在哈希表的基础上添加一个链表,记录添加元素的顺序
  • TreeSet底层实现为TreeMap红黑树

总结List的三种实现类

ArrayListLinkedListVector
实现方式数组,按照索引下标访问速度快O(1),但是当删除添加元素时会导致元素的移动,速度慢O(n)双向链表,按照索引下标访问速度慢O(n),但是删除添加元素速度快O(1)数组,按照索引下标访问速度快O(1),但是当删除添加元素时会导致元素的移动,速度慢O(n)
是否同步不同步,线程不安全,但是并发高,访问效率高不同步,线程不安全,但是并发高,访问效率高 o同步,所以线程安全,但是并发低,访问效率低
如何选择经常需要快速访问,较少在中间增加删除元素时使用;如果多线程访问,则需要自行编程解决线程安全问题经常需要在内部增删元素,但是很少需要通过索引快速访问时使用;如果多线程访问,则需要自行编程解决线程安全问题一般不使用,如果在多线程访问时可以考虑使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值