Java核心集合框架Collection及拓展


集合容器主要⽤于保存对象,主要分类有三种List 、Set、Map

List 有序、重复集合
   List接口主要有ArrayList、Vector、LinkedLis
Set无序、不可重复
    Set接口主要有HasSet、LinedHash、TreeSet
Map 键值对存储
    Map接口主要有HashMap、TreeSet
Collection接口有两个主要的子类分别是List和Set,但Map不是Collection的子类因为其本身就是一个顶层接口
在这里插入图片描述

在这里插入图片描述

框架List基础介绍

  List数据结构

	List是一个线性列表接口能够控制每个元素插入位置,能够通过索引,接口存储一组不唯一,有序(插入对象)的对象。

  常见实现类
   ArrayList基于数组实现,是⼀个动态的数组队列,但它和Java中的数组⼜不⼀样,它的容量可以
⾃动增⻓
   LinkedList基于的数据结构是链表,⼀个双向链表,链表数据结构的特点是每个元素分配的空间不
必连续

//创建对象,LinkedList和ArrayList api⼀样
List<String> list=new ArrayList<>();
//往容器⾥⾯添加对象
list.add("jack");
//根据索引获取元素
list.get(index);
//更新⼀个元素
list.set(index, “⼩滴课堂”);
//返回⼤⼩ 
list.size();
//根据索引删除⼀个元素
list.remove(index);
//根据对象删除元素
list.remove("jack");

框架Map基础介绍

  什么是Map数据结构
底层就是⼀个数组结构,数组中的每⼀项⼜是⼀个链表,即数组和链表的结合体
Table是数组,数组的元素是Entry
Entry元素是⼀个key-value键值对,它持有⼀个指向下⼀个 Entry元素的引⽤,table数组的
每个Entry元素同时也作为当前Entry链表的⾸节点,也指向了该链表的下⼀个Entry元素
在这里插入图片描述
    常⻅的实现类
  HashMap
⼀个散列桶(数组和链表),它存储的内容是键值对(key-value)映射
是基于hashing的原理,使⽤put(key, value)存储对象到HashMap中,使⽤get(key)从
HashMap中获取对象。当put()⽅法传递键和值时,会先对键调⽤hashCode()⽅法,计
算并返回的hashCode是⽤于找到Map数组的bucket位置来储存Entry对象的,是⾮线程
安全的,所以HashMap操作速度很快
  TreeMap
在数据的存储过程中,能够⾃动对数据进⾏排序,实现了SotredMap接⼝,它是有序的
集合
TreeMap使⽤的存储结构是平衡⼆叉树,也称为红⿊树
默认排序规则:按照key的字典顺序来排序(升序),也可以⾃定义排序规则,要实现
Comparator接⼝

Map<String,String> map = new HashMap<>();
//往map⾥⾯放key - value;
map.put("⼩明","⼴东⼴州");
map.put("⼩东","⼴东深圳");
//根据key获取value
map.get("⼩东");
//判断是否包含某个key
map.containsKey("⼩明");
//返回map的元素数量
map.size();
//清空容器
map.clear();
//获取所有value集合
map.values();
//返回所有key的集合
map.keySet()
//返回⼀个Set集合,集合的类型为Map.Entry , 是Map声明的⼀个内部接⼝,接⼝为泛型,定
义为Entry<K,V>//它表示Map中的⼀个实体(⼀个key-value对),主要有getKey(),getValue⽅法
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//判断map是否为空
map.isEmpty();

框架Set基础介绍

       什么是Set数据结构
Set相对于List是简单的⼀种集合,具有和 Collection 完全⼀样的接⼝,只是实现上不同,Set
不保存重复的元素,存储⼀组唯⼀,⽆序的对象。
Set中的元素是不能重复的, 实现细节可以参考Map,因为这些Set的实现都是对应的Map的⼀种封装。⽐如HashSet是对HashMap的封装,TreeSet对应TreeMap
Set底层是⼀个HashMap,由于HashMap的put()⽅法是⼀个键值对,当新放⼊HashMap的
Entry中key 与集合中原有Entry的key相同(hashCode()返回值相等,通过equals⽐较也返回
true),新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何改变。允许包含值为null的元素,但最多只能有⼀个null元素常⻅的实现类
    HashSet
HashSet类按照哈希算法来存取集合中的对象,存取速度⽐较快
对应的Map是HashMap,是基于Hash的快速元素插⼊,元素⽆顺序。
    TreeSet
TreeSet类实现了SortedSet接⼝,能够对集合中的对象进⾏排序

//创建对象,HashSet和TreeSet api⼀样
Set<Integer> set = new HashSet<>();
//往容器⾥⾯添加对象
set.add("jack");
//清空元素
set.clear();
//返回⼤⼩ 
set.size();
//根据对象删除元素
set.remove("jack");
//是否为空
set.isEmpty();

迭代器(Iterator)

     循环遍历集合
          普通for循环
          增强for循环
     
     三个核心方法
   boolean hashNext()
⽤于判断iterator内是否有下个元素,如果有则返回true,没有则false
   Obejct next()
返回iterator的下⼀个元素,同时指针也会向后移动1位
   void remove()
删除指针的上⼀个元素(容易出问题,删除元素不建议使⽤容器⾃⼰的⽅法)

在这里插入图片描述

public static void testSet(){
 Set<String> set = new HashSet<>();
 set.add("jack");
 set.add("tom");
 set.add("marry");
 set.add("tony");
 set.add("jack");
 Iterator<String> iterator = set.iterator();
 while (iterator.hasNext()){
 String str = iterator.next();
 System.out.println(str);
 }
 }
 public static void testList(){
 List<String> list = new ArrayList<>();
 list.add("jack");
 list.add("tom");
 list.add("mary");

 list.add("tim");
 list.add("tony");
 list.add("eric");
 list.add("jack");
 Iterator<String> iterator = list.iterator();
 while (iterator.hasNext()){
 String str = iterator.next();
 System.out.println(str);
 }
 }

Collections工具类

常用方法

按⾃然排序的升序排序

List<String> list =new ArrayList<>()
list.add("aaaa");
 list.add("zzz");
 list.add("gggg");
 Collections.sort(list)
 System.out.println(list)

sort(List list, Comparator c) ⾃定义排序规则,由Comparator控制排序逻辑

List<String> list =new ArrayList<>();
list.add("aaaa");
 list.add("zzz");
 list.add("gggg");
 Collections.sort(list,Comparator.naturalOrder())//升序
  Collections.sort(list,Comparator.reverseOrder())//降序

获取最大值和最小值

获取最⼤元素 max(Collection coll) 默认⽐较,不适合对象⽐较
获取最⼤元素 max(Collection coll, Comparator comparator)

List<Student> list = new ArrayList<>();
 list.add(new Student("jack", 26));
 list.add(new Student("tom", 29));
 list.add(new Student("mary", 32));
 list.add(new Student("tony", 19));
 list.add(new Student("smith", 41));

Collections.max(list,new Comparator<String>){
 @Override
 public int compare(Student o1,Student o2){
	return o1.getAge()-o2.getAge();
}
}



class Student {
 public Student(String name, int age) {
 this.name = name;
 this.age = age;
 }
 private int age;
 private String name;
 public void setAge(int age) {
 this.age = age;
 }
 public int getAge() {
 return age;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getName() {
 return name;
 }
 @Override
 public String toString() {
 return "Student{" +
 "age=" + age +
 ", name='" + name + '\'' +
 '}';
 }

Comparable

是⼀个接⼝,定制排序规则
对实现它的每个类的对象进⾏整体排序,⾥⾯ compareTo ⽅法是实现排序的具体⽅

public class TestCom {
 public static void main(String [] args) {
 Set<Student> studentSet = new TreeSet<>();
 studentSet.add(new Student("jack",32));
 studentSet.add(new Student("tom",22));
 studentSet.add(new Student("mary",35));
 studentSet.add(new Student("tim",11));
 studentSet.add(new Student("tony",49));
 studentSet.add(new Student("dd",30));
 System.out.println(studentSet);
 }
}
 class Student implements Comparable{
 private int age;
 private String name;
 public void setAge(int age) {
 this.age = age;
 }
 public int getAge() {
 return age;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getName() {
 return name;
 }
 public Student(String name,int age){
 this.name = name;
 this.age = age;
 }
 @Override
 public String toString() {
 return "Student{" +
 "age=" + age +
 ", name='" + name + '\'' +
 '}';
 }
@Override
public int compareTo(Object o) {
 if(o instanceof Student){ //判断是不是属于这个接口
 Student student = (Student)o; 
 return this.age - student.age;
 }
 //返回的数是0代表两个对象相同
 return 0;
 }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值