[Java进阶] Collection集合相关

编程入门 行业动态 更新时间:2024-10-08 14:38:26

[Java<a href=https://www.elefans.com/category/jswz/34/1769503.html style=进阶] Collection集合相关"/>

[Java进阶] Collection集合相关

目录

Collection接口

常用方法

List接口

常用方法

LinkedList特有的方法

Set接口

HashSet

存入数据和取出数据顺序不同

如何保证元素唯一

LinkedHashSet

TreeSet


集合是表示java中存储数据的容器, 是很多满足存储数据容器的总称, 不单只一个类

Collection接口

Collection是所有单列集合的父接口, 也就是说Collection中有所有实现类都有的方法

常用方法

增:

1.add(Object o): 向集合中添加元素, 返回添加结果

Collection本身的add不是按顺序的 , ArrayList重写了add方法, 让新加的元素添加到最后的元素后

ArrayList<String> a = new ArrayList<>();
Boolean result =a.add("佟湘玉");
//手动添加的null会被加入到元素中去作为有效元素
a.add(null);

2.addAll(Collection c): 向集合添加另一个集合, 返回添加结果

Collection<String> c = new ArrayList<>();
c.add("阎婆惜");
c.add("扈三娘");ArrayList<String> a = new ArrayList<>();
a.add("孙二娘");//将a集合的所有内容, 添加到c集合已有的元素后
c.addAll(a);

删:

3.remove(Object o): 从集合中删除指定元素, 返回删除结果

Boolean result1 =  c.remove("阎婆惜");

4.clear(): 情况集合中所有元素, 无返回值

c.clear();

查:

5.size(): 判断当前集合的长度, 返回int结果

int length = c.size();
System.out.println("c当前的元素个数是:"+length);

6.isEmpty(): 判断当前集合是否为空集合, 并返回一个boolean结果

boolean result2 = c.isEmpty();
System.out.println("c当前是空集合吗:"+result2);

7.contains(Object o): 判断当前集合是否包含元素o , 返回boolean结果

boolean result3 = c.contains("阎婆惜");
System.out.println("集合中包含阎婆惜吗:"+result3);

8.toArray(T[] t) : 赋值当前集合中的元素到新数组中, 涉及泛型擦除, 因此要手写参数的数组的类型

//根据集合不也能确定数组的类型吗?------因为集合在运行的时候 将泛型抹掉了
String[] s = new String[10];
c.toArray(s);
//使用增强for循环遍历数组s中的内容
for (String s1 : s) {System.out.print(s1+" ");
}

9.toString(): 直接打印当前对象, 相当于调用当前对象的toString方法

  Collection实现类重写了Object的toString方法, 因此也可以通过直接打印集合, 查看集合的内容

List接口

List在Collection接口的基础上添加了索引的概念并针对索引进行操作

常用方法

增:

1.add(int index, E e): 向指定索引处添加元素, 没有返回值

List<String> list = new ArrayList<>();
list.add("白展堂");
list.add("郭芙蓉");
list.add("莫小贝");
list.add("李大嘴");list.add(2,"吕秀才");
System.out.println("添加元素后:"+list);

删:

2.remove(int index): 删除指定索引处的元素,并返回删除的元素内容

String s = list.remove(3);
System.out.println("删除的元素是:"+s);
System.out.println("删除元素后:"+list);

改:

3.set(int index ,E e): 修改索引值内容,并返回被修改的值

String re = list.set(3,"佟湘玉");
System.out.println("被修改的元素是:"+re);
System.out.println("修改元素后:"+list);

查:

4.get(int index): 获取索引值内容

String s2=list.get(list.size()-1);
System.out.println("查到末尾元素是:"+s2);

LinkedList特有的方法

基于双向链表, 因此LinkedList中又有许多针对头尾操作的方法

Set接口

set由于没有新增额外的方法, 对比list缺少了对索引的操作, 也没有索引的概念

因此不能通过for循环遍历集合中元素, 使用迭代器或者增强for循环, 对集合中元素进行遍历

HashSet

基于哈希表(数组+链表)进行存储, 特点是数据的存入取出顺序可能不同,增删快, 查询快, 元素唯一

存入数据和取出数据顺序不同

HashSet底层是基于Hash表进行存储的, 存储的逻辑是根据hashcode对16取余进行存放, 因此存入的顺序和存储的顺序不是一定一致的.

如何保证元素唯一

未重写hashcode:

1.当未重写hashcode, 默认使用Object中的逻辑, 根据地址值算出哈希值

2.哈希值对16取余, 存在对应的数组格子中, 当数组格子中已有元素, 对比哈希值,如果哈希值不同, 直接存储, 哈希值相同则认为元素重复, 不会存储

重写了equals和hashcode:

1.重写equals和hashcode逻辑

2.哈希值对16取余, 存在对应的数组格子中, 当数组格子中已有元素, 对比哈希值, 哈希值相同的情况下, 使用equals再次判断, 如果相同, 则认为元素重复, 如果不同, 则尾插法链接.

LinkedHashSet

既可以保证元素唯一, 又可以保证存入和取出的元素顺序一致

LinkedHashSet中既维护了哈希表(数组+链表), 又维护了一个额外的链表按照顺序存储, 因此当取出元素的时候, 是将链表中的元素取出, 但LinkedHashSet对于内存并不友好.

TreeSet

底层是基于红黑树进行存储的

TreeSet如何保证元素唯一

在创建一个TreeSet时, 会需要传入一个比较器实现类的参数, TreeSet是通过比较器,保证元素唯一的.

如果添加的元素和已有元素比较的结果是0,则不添加.

Collections工具类

工具类特点: 构造私有, 静态方法

1.addAll(Collection<? extend T> c,T... elements): 添加多个元素到参数集合中.

ArrayList<String> strList = new ArrayList<>();
Collections.addAll(strList,"张三","王五","赵六");
System.out.println(strList);

2.shuffle(List<?> list) : 打乱传入的集合顺序.

Collections.shuffle(strList);

3.sort(List<T> list,Comparator<? super T> c) : 根据自定义比较规则对list集合进行排序

        ArrayList<Student> stu = new ArrayList<>();Collections.addAll(stu,new Student("张三",23,99),new Student("李四",34,84));System.out.println(stu);Collections.sort(stu, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//o1-o2升序   o2-o1 降序return o1.getScore()-o2.getScore();}});

更多推荐

[Java进阶] Collection集合相关

本文发布于:2024-02-06 14:59:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1749717.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进阶   Java   Collection

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!