Day 13

Day 13

一、LinkedList

LinkedList 是一种可以在任何位置进行高效地插入和删除操作的有序序列。

LinkedList:底层用双向链表实现的 List。特点:查询效率低,增删效率高,线程不安全。

ArrayList:底层用数组实现的 List。特点:查询效率高,增删效率低,线程不安全。

常用

//addFirst  将指定元素插入此列表的开头
list.addFirst("嘿嘿");
System.out.println(list);

//pollLast() 获取并移除此列表的第一个元素;如果此列表为空,则返回null
System.out.println(list.pollLast());
System.out.println(list);

//get(index) 获取
System.out.println(my.get(0));
System.out.println(my.get(1));

二、Set

  • Set接口的实现类

  • 无序 (没有索引,添加的顺序和内部真实存储的顺序) 不可重复

  • 遍历方式:

    1. foreach 2)iterator迭代器
  • HashSet

  • 底层->是由HashMap的key维护的

  • 实现结构: 哈希表(数组+链表+红黑树)

  • 特点:查询 效率快,增删效率高,但是无序

  • 去重: 要重写hashcode和equals方法

  • TreeSet

  • 底层:->是由TreeMap的key维护的

  • 实现结构:红黑树

  • 特点: 有序(默认升序)

三、哈希表

将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NiHorsDT-1594335315801)(…/…/…/AppData/Roaming/Typora/typora-user-images/image-20200710064142937.png)]

1.hashCode是为了提高在散列结构存储中查找的效率,在线性表中没有作用。
2.equals和hashCode需要同时覆盖。
3.若两个对象equals返回true,则hashCode有必要也返回相同的int数。
4.若两个对象equals返回false,则hashCode不一定返回不同的int数,但为不相等的对象生成不同hashCode值可以提高
哈希表的性能。
5.若两个对象hashCode返回相同int数,则equals不一定返回true。
6.若两个对象hashCode返回不同int数,则equals一定返回false。
7.同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题。

四、比较器

1.Comparable接口

所有可以“排序”的类都实现了java.lang.Comparable 接口,Comparable接口中只有一个方法
public int compareTo(Object obj);
该方法:
返回 0 表示 this == obj
返回正数表示 this > obj
返回负数表示 this < obj
实现了Comparable 接口的类通过实现 comparaTo 方法从而确定该类对象的排序方式。

2.Comparator 接口

Comparator比较器,可以根据需要定制特定的比较规则

Comparator比较器,可以根据需要定制特定的比较规则
还可以使用lambda表达式简化代码, 前提是JDK8开发环境,
5. stream
stream 是数据渠道,用于操作数据源(集合、数组)所生产的元素序列。
return 0;
}
}
}
List<Student> stus = new ArrayList<Student>(){
 {
    add(new Student("张三", 30));
    add(new Student("李四", 20));
    add(new Student("王五", 60));
 }
};
//对users按年龄进行排序
Collections.sort(stus, new Comparator<Student>() {
  @Override
  public int compare(Student s1, Student s2) {
    // 升序
    //return s1.getAge()-s2.getAge();
    return s1.getAge().compareTo(s2.getAge());
    // 降序
    // return s2.getAge()-s1.getAge();
    // return s2.getAge().compareTo(s1.getAge());
 }
});

​ 1.内部比较器|自然排序

  • 要当前比较的类型实现一个借口Comparable接口,重写compareTo方法,方法的内部制定比较规则

  • 硬编码习惯,不够灵活,每次修改源代码

    2.外部比较器|自定义排序

  • 使用任何一个实现类实现一个接口Comparator,重写compare方法,方法的内部制定比较规则

五、Map

Map<k,v> 接口

  • 存储键值对类型的数据,Map集合中每一个数据都是一个键值对 k-v组成

  • k-v 映射关系

  • map中的key-> 无序不可重复(唯一) --> Set集合

  • map中 的value-> 无序的,可重复 -->Collection集合

  • 特点:

  • 一个key只能对应一个value

  • 一个key想要对应多个value时候,可以把多个value存放入一个容器

  • 方法:

    遍历:

    1)keySet() 返回所有的key,根据key获取value

    2)values() 返回所有的value,遍历value

    3)entrySet() 把map中所有的键值对转为多个Map.Entry类型 的对象,Map.Entry类型就表示一个键值对 ,放入set集合中,可以遍历set,获取每一个Map.Entry

    调用方法,获取key和 value

    public class MapDemo01 {
       public static void main(String[] args) {
          Map<String,Integer> map = new HashMap();
          //put添加   如果key相同,value会覆盖
          map.put("张三",18 );
          map.put("王五",19 );
          map.put("李四",17 );
          map.put("李四",20 );
          // V get(Object key)  获取
          System.out.println(map.get("张三"));
          
          //V remove(Object key)  删除
          //System.out.println(map.remove("王五"));
          System.out.println(map);
          System.out.println(map.size());
          
          //遍历
          System.out.println("-----keySet----");
          Set<String> keySet = map.keySet();
          for(String str:keySet) {
             System.out.println(str+"---->"+map.get(str));
          }
          
          System.out.println("-----values----");
          Collection<Integer> col = map.values();
          for(Integer str:col) {
             System.out.println(str);
          }
          
          System.out.println("-----entrySet----");
          Set<Map.Entry<String,Integer>> set = map.entrySet();
          for(Map.Entry<String,Integer> entry:set) {
             System.out.println(entry.getKey()+"--->"+entry.getValue());
          }
          
          
          /*
           *  containsKey(Object key) 
                    如果此映射包含指定键的映射关系,则返回 true。 
             boolean containsValue(Object value) 
                    如果此映射将一个或多个键映射到指定值,则返回 true。 
           */
          System.out.println(map.containsKey("张三"));
          System.out.println(map.containsValue(18));
       }
    }
    

alue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
*/
System.out.println(map.containsKey(“张三”));
System.out.println(map.containsValue(18));
}
}
```

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值