临沂网站建设小程序,室内空间设计,短视频素材下载网站无水印,节省空间的装修设计一、Set集合
Set特点#xff1a;无序#xff08;添加数据的顺序和获取出的数据顺序不一致#xff09;#xff0c;不重复#xff0c;无索引
public class demo1 {public static void main(String[] args) {//1.创建一个集合//HashSet特点#xff1a;无序#xff0c;不重…一、Set集合
Set特点无序添加数据的顺序和获取出的数据顺序不一致不重复无索引
public class demo1 {public static void main(String[] args) {//1.创建一个集合//HashSet特点无序不重复无索引//LinkedSet:有序的根据谁先加入输出顺序就是谁先输出SetString s new LinkedHashSet();s.add(java);s.add(python);s.add(javascript);s.add(java);System.out.println(s);//创建一个TreeSet它是排序的(默认一定会排升序排列)不重复无索引SetDouble s2 new TreeSet();s2.add(7.0);s2.add(2.5);s2.add(3.7);System.out.println(s2);}
}
1.1HashSet
底层基于哈希表数组链表红黑树实现的
HashSet集合元素的去重操作需求创建一个储存学生对象的集合当学生对象成员变量值相同时我们认为是同一个对象要求只保留一个。 Override// s3.equals(s1) 方法的逻辑如下//重写后的equals方法保证了两个对象的内容一样结果equals返回的一定是truepublic boolean equals(Object o) {//如果自己和自己比直接return trueif (this o) return true;//如果o为空或者o不是学生类型返回falseif (o null || getClass() ! o.getClass()) return false;//比较两个对象的内容是否一样:Student student (Student) o;return age student.age gender student.gender Objects.equals(name, student.name);}Overridepublic int hashCode() {//重写后的方法保证了如果对象内容一样返回的哈希值也一样return Objects.hash(name, age, gender);}Overridepublic String toString() {return Student{ name this.name \ , age this.age , gender this.gender } \n;}
//掌握HashSet集合去重操作
public class demo2 {public static void main(String[] args) {Student s1 new Student(john,15,女);Student s2 new Student(Bob,24,男);Student s3 new Student(Bob,24,男);SetStudent s new HashSet();s.add(s1);s.add(s2);s.add(s3);System.out.println(s);/*[Student{nameBob, age24, gender男}, Student{namejohn, age15, gender女}, Student{nameBob, age24, gender男}] 发现并没有去重因为两个Bob的地址不一样Hash值算出来也不一样*///如果希望Set集合认为两个内容一样的对象是重复的必须重写对象的hashCode和equals方法//同样右键-generate直接帮我们生成}
1.2LinkedHashSet
有序先加的在前面后加的在后面不重复无索引
底层原理基于哈希表数组链表红黑树实现。但是它的每个元素都额外多了一个双链表的机制来记录他前后元素的位置从头指针读到尾指针
1.3TreeSet
特点不重复无索引可排序默认升序排序按照元素大小从小到大排
底层基于红黑树实现
注意
对于数值类型Integer Double默认按照数值本身大小升序排列
对于字符串类型默认按照首字符的编号升序排序
对于自定义类型如Student对象TreeSet无法直接排序需要自定义排序规则 方案一这个类去实现Comparable接口
public class Teacher implements ComparableTeacher {
public class Demo3_TreeSet {public static void main(String[] args) {Teacher t1 new Teacher(alice,15,女);Teacher t2 new Teacher(Bob , 28 , 男);Teacher t3 new Teacher(张三 , 22 , 男);TreeSetTeacher s new TreeSet();s.add(t1);s.add(t2);s.add(t3);System.out.println(s);//报错因为自定义对象无法直接排序,因为不知道大小比较的规则//两种解决方法1.让对象所属类去实现一个Comparable比较接口重写compare方法指定大小比较规则//2.public TreeSet自带比较器Comparator对象指定比较规则}
} //t2.compareTo(t1)//t2 this 方法中this代表主调//t2 o;//龟腚如果你认为左边大于右边返回一个正整数反之负整数Overridepublic int compareTo(Teacher o){//按照年龄升序if(this.age o.age) return 1;else if(this.age o.age) return -1;else return 0;}
重写后可以按找年龄大小排序了
方案二TreeSet自带Comparator我们调用它可以排序。优先使用comparator的规则 //方案2TreeSetTeacher s2 new TreeSet(new ComparatorTeacher() {Overridepublic int compare(Teacher o1, Teacher o2) {return o2.getAge() - o1.getAge(); // 降序排列//注意这里集合中方法重写是降序排列Teacher类定义的是升序排列//调用时优先采用集合的降序如果集合提供了Comparator的话}});
小结Arraylist和HashSet更常用
二、Map集合
2.1Map的特点
Map又叫键值对集合建不能重复值无所谓一个键对应一个值。 public class hashMap {public static void main(String[] args) {MapString,Integer m new HashMap(); // 这是一行经典代码m.put(trump, 34);m.put(john, 50);m.put(ronnie, 50);m.put(null, null);System.out.println(m);//特点无序不重复无索引。}
}
2.2 Map的常用方法
Map集合是所有Map集合的父类学完他的方法它的子类也继承了这些方法。 2.3Map的遍历方式
1.键找值
先获取Map集合的全部键在通过遍历键来找值
public Setk key set() 获取所有键的集合public V get(object key) 根据键获取其对应的键
public class MapTraversal {public static void main(String[] args) {MapString,Integer m new HashMap(); // 这是一行经典代码m.put(trump, 34);m.put(john, 50);m.put(ronnie, 51);m.put(null, null);//{nullnull, ronnie50, trump34, john50}//1.提取map集合的全部键用一个Set集合装SetString keys m.keySet();System.out.println(keys);//2.遍历set集合的每个键去找值for(String key : keys){System.out.println(key m.get(key));}}
2.键值对
把键值对看作一个整体进行遍历。难度较大
使用map提供的entrySet方法获取所有键值对
SetMap.EntryK,VentrySet()
entryset是一个实现类对象用来封装键值对作为一个整体。 //1.把map集合转化成set集合里面的元素是键值对类型map.entrysetK键的类型 V值得类型SetMap.EntryString,Integer entries m.entrySet();for(Map.EntryString , Integer entry : entries) {System.out.println(entry);}
3.lambda
JDK8之后的新技术非常的简单需要用到Map的方法
default void forEach(BiConsumer? super K , ? super V action)
结合lambda遍历map集合
这个方法需要提供一个匿名内部类对象可以直接简化成lambda表达式。
public class MapTraversal3_lambda {public static void main(String[] args) {MapString,Integer m new HashMap(); // 这是一行经典代码m.put(trump, 34);m.put(john, 50);m.put(ronnie, 51);m.put(david, 23);m.put(null, null);//{nullnull, ronnie50, trump34, john50}System.out.println(m);//直接调用map集合的forEach方法完成遍历
// m.forEach(new BiConsumerString, Integer() {
// Override
// public void accept(String key, Integer value) {
// System.out.println(key : value);
// }
// });//上述代码可以简化m.forEach((k,v)-System.out.println(k - v));
2.4Map集合的实现类——由键决定特点
1.HashMap(用的最多)
无序不重无索引
事实上原来的Set系列集合的底层就是基于Map实现的只是Set集合中的元素只要键数据不要值数据而已。 2.LinkedHashMap
有序不重无索引
事实上原来的LinkedHashSet底层就是LinkedHashMap。它们都是基于哈希表实现的只是每个键值对额外多加了一个双向链表。
3.TreeMap
按照大小默认升序排列不重复无索引。
TreeMap跟TreeSet底层一样都是基于红黑树实现。 三、Stream流
3.1认识stream流
stream流是JDK8的新增的api可以用于操作集合或数组的数据。
为什么要用Stream流
结合了大量的lambda风格的语法功能强大性能高效代码简洁可读性好。
public class test1 {public static void main(String[] args) {ListString ls new ArrayListString();ls.add(张无忌);ls.add(周芷若);ls.add(周传雄);ls.add(张学友);ls.add(张敬轩);System.out.println(ls); //需求把集合中所有以张开头且是三个字的元素存到一个新的集合//传统方法完成需求
// ListString new_ls new ArrayList();
// for(String s : ls){
// if(s.startsWith(张) s.length() 3){
// new_ls.add(s);
// }
// }
// System.out.println(new_ls);//使用Stream流调用stream方法把它想象成一个传送带集合中的元素被扔到这个传送带上了ListString ls2 ls.stream().filter(s -s.startsWith(张)).filter(s - s.length()3).collect(Collectors.toList());System.out.println(ls2);
stream的使用步骤
1.提供数据源集合、数组。。
2.获取数据流stream流代表一条流水线并能与数据源简例连接
3.调用流水线的各种方法
4.获取处理的结果遍历统计收集到一个新集合中返回。
3.2获取stream流 public class demo2 {public static void main(String[] args) {//1.获取集合的stream流调用集合的stream方法CollectionString list new ArrayListString();StreamString s1 list.stream();//2.Map集合如何获取MapString, Integer map new HashMapString, Integer();//获取键流,先调用map的keySet方法在调用.stream方法。龟腚动作StreamString stream map.keySet().stream();//获取值流:先调用map的values方法在调用.stream方法。龟腚动作StreamInteger stream1 map.values().stream();//也可以获取键值对流,先调用map的entrySet方法在调用.stream方法。龟腚动作StreamMap.EntryString, Integer stream2 map.entrySet().stream();//3.获取数组的stream流:两种方法Arrays.stream()或者Stream.of()String[] names {jhon , ronnie ,jack};StreamString stream3 Arrays.stream(names);StreamString stream4 Stream.of(names);//Stream.of()里面接的是可变参数事实上可以直接这么写StreamString stream5 Stream.of(david,jay);System.out.println(stream5.count());
3.3stream流的常用操作中间方法
中间方法指的是调用完成后会返回新的stream流可以继续使用支持链式编程。 //掌握stream流提供的常用中间方法对流上的数据进行处理返回新的流
public class demo3 {public static void main(String[] args) {ListString ls new ArrayListString();ls.add(张无忌);ls.add(周芷若);ls.add(周传雄);ls.add(张学友);ls.add(张敬轩);System.out.println(ls);//1.过滤方法ls.stream().filter(s -s.startsWith(张)).forEach(System.out::println);//2.排序方法,默认升序若想要降序使用它重载的方法ListDouble scores new ArrayListDouble();scores.add(1.0);scores.add(6.0);scores.add(3.14);scores.add(1.0);System.out.println(scores);//scores.stream().sorted().forEach(System.out::println);scores.stream().sorted((s1 , s2) -Double.compare(s2,s1)).forEach(System.out::println);//降序//去重System.out.println();scores.stream().distinct().forEach(System.out::println);//如果需要实现自定义对象的去重需要重写hasCode和equals方法System.out.println();//加工方法映射方法把流上原来的数据拿出来加工变成新数据又放上去scores.stream().map(s-加十分后: (s 10)).forEach(System.out::println);//合并流假设有s1 s2两个流使用stream.concat()方法合并之//StramObject s3 Stream.concat(s1,s2)}
}
3.4终结方法、收集结果
终结方法是指调用完之后不会返回新的stream流了无法继续使用。 //掌握stream流的终结操作
public class demo4_stream_final {public static void main(String[] args) {ListTeacher teachers new ArrayListTeacher();teachers.add(new Teacher(张三,50,男));teachers.add(new Teacher(John,30,男));teachers.add(new Teacher(Alice,35,女));teachers.stream().filter(t- t.getGender()男).forEach(System.out::println);System.out.println();System.out.println(teachers.stream().filter(t - t.getAge() 31).count());System.out.println();OptionalTeacher max teachers.stream().max((t1, t2) - Double.compare(t1.getAge(), t2.getAge()));Teacher teacher max.get();//获取年龄最大的老师对象System.out.println(teacher);}
收集stream流