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接口的实现类
-
无序 (没有索引,添加的顺序和内部真实存储的顺序) 不可重复
-
遍历方式:
-
- 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));
}
}
```