Java笔记第二弹

文章目录[隐藏]

  • 泛型
  • 泛型类
  • 相关应用:
  • 泛型方法:
  • 相关应用:
  • 泛型接口
  • 相关应用:
  • 类型通配符
  • 相关应用:
  • 可变参数
  • 相关应用:
  • 可变参数的使用:
  • Map集合

  • List常用集合子类的特点

    ArrayList底层数据结构是数组

    查询快,增删慢

    LinkedList底层数据结构是链表

    查询慢,增删快

    练习:
    //ArrayList实现
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            ArrayList<String> a=new ArrayList<String>();
            a.add("hello");
            a.add("world");
            a.add("java");
    
            Iterator<String> it=a.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
        }
    }
    
    //LinkedList实现
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            LinkedList<String> ll=new LinkedList<String>();
            ll.add("hello");
            ll.add("world");
            ll.add("java");
    
            for(String s:ll){
                System.out.println(s);
            }
        }
    }
    
    案例:ArrayList集合存储学生对象用三种方式遍历
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            ArrayList<DateUtils> array=new ArrayList<DateUtils>();
            DateUtils s1=new DateUtils("lili",19);
            DateUtils s2=new DateUtils("zhangliang",20);
            DateUtils s3=new DateUtils("wangwu",18);
    
            array.add(s1);
            array.add(s2);
            array.add(s3);
            //增强for循环
            for(DateUtils s:array){
    
                System.out.println(s.getName()+","+s.getAge());
            }
            //普通for循环
            for(int i=0;i<array.size();i++){
                System.out.println(i);
            }
            //迭代器
           while(it.hasNext()){
                DateUtils s=it.next();
                System.out.println(s.getName()+","+s.getAge());
            }
        }
    }
    
    LinkedList集合的特有功能
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            LinkedList<String> ll=new LinkedList<String>();
            //在第一位添加指定元素
            ll.addFirst("hello");
            //在末尾添加指定元素
            ll.addLast("world");
            //在第一位删除元素
            ll.removeFirst();
            //删除末尾元素
            ll.removeLast();
            //返回首位元素
            System.out.println(ll.getFirst());
            //返回末尾元素
            System.out.println(ll.getLast());
    

    Set集合

    注意:不包含重复元素,不能使用普通for循环遍历
    存储字符串并遍历练习
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Set<String> ss=new HashSet<String>();
    
            ss.add("hello");
            ss.add("world");
            ss.add("java");
            //不可重复
            ss.add("hello");
    
            //加强for循环遍历
            for(String s:ss){
                System.out.println(s);
            }
        }
    }
    
    哈希值
    public int hashCode();//返回哈希值
    //同一个对象多次调用返回的哈希值是一样的
    //默认情况下,不同对象,即便内容相同,返回的哈希值是不一样的
    //在重写了hashCode方法的情况下,可以使得哈希值相同
    System.out.println(s.hashCode());//得到某位对象的哈希值
    
    hashSet集合
    底层数据结构是哈希表
    没有顺序,不保证存入与取出一致
    不能用普通for循环遍历
    不包含重复元素
    存储字符串并遍历练习
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            HashSet<String> hh=new HashSet<String>();
            hh.add("hello");
            hh.add("world");
            hh.add("java");
            //增强for循环遍历
            for(String s:hh){
                System.out.println(s);
            }
        }
    }
    
    HashSet集合保证唯一性源码分析
    常见数据结构之哈希表(元素为链表的数组)
    相关练习:
    //Main.java
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            HashSet<Student> hh=new HashSet<Student>();
    
            Student s1=new Student("lili",19);
            Student s2=new Student("zhangliang",20);
            Student s3=new Student("wangwu",18);
    
            hh.add(s1);
            hh.add(s2);
            hh.add(s3);
    
            for(Student s:hh){
                System.out.println(s.getName()+","+s.getAge());
            }
        }
    }
    
    //Student.java
    public class Student {
        private String name;
        private int age;
        public Student(){}
        public Student(String name, int age){
        this.name=name;
        this.age=age;
        }
         public void setName(String name){
            this.name=name;
         }
    
         public String getName(){
            return name;
         }
    
         public void setAge(int age){
            this.age=age;
         }
    
         public int getAge(){
            return age;
         }
    
    LinkedHashList集合
    元素的存储顺序和取出顺序是一致的
    没有重复元素
    相关练习:存储字符串并遍历
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            LinkedHashSet<String> ll=new LinkedHashSet<String>();
    
            ll.add("hello");
            ll.add("world");
            ll.add("java");
    
            for(String s:ll){
                System.out.println(s);
            }
        }
    }
    
    TreeSet集合
    元素有序:由具体的构造方法决定相应的顺序
    不包含重复元素
    不能用普通for循环遍历
    相关练习:
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            TreeSet<Integer> tt=new TreeSet<Integer>();
            tt.add(10);
            tt.add(100);
            tt.add(1000);
    
            for(Integer mm:tt){
                System.out.println(mm);
            }
        }
    }
    
    自然排序Comparable的应用
    //Main.java
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            TreeSet<Student>  ss=new TreeSet<Student>();
            Student s1=new Student("lili",19);
            Student s2=new Student("zhangliang",20);
            Student s3=new Student("wangwu",18);
    
            ss.add(s1);
            ss.add(s2);
            ss.add(s3);
            for(Student s:ss){
                System.out.println(s.getName()+","+s.getAge());
            }
        }
    }
    
    //Student.java
    //按照存储顺序
    public class Student implements Comparable<Student>{
        private String name;
        private int age;
        public Student(){}
        public Student(String name, int age){
        this.name=name;
        this.age=age;
        }
         public void setName(String name){
            this.name=name;
         }
    
         public String getName(){
            return name;
         }
    
         public void setAge(int age){
            this.age=age;
         }
    
         public int getAge(){
            return age;
         }
    
        @Override
        public int compareTo(Student o) {
            return 1;
        }
    }
    //反向存储顺序
    public class Student implements Comparable<Student>{
        private String name;
        private int age;
        public Student(){}
        public Student(String name, int age){
        this.name=name;
        this.age=age;
        }
         public void setName(String name){
            this.name=name;
         }
    
         public String getName(){
            return name;
         }
    
         public void setAge(int age){
            this.age=age;
         }
    
         public int getAge(){
            return age;
         }
    
        @Override
        public int compareTo(Student o) {
            return -1;
        }
    }
    //按照年龄顺序
    public class Student implements Comparable<Student>{
        private String name;
        private int age;
        public Student(){}
        public Student(String name, int age){
        this.name=name;
        this.age=age;
        }
         public void setName(String name){
            this.name=name;
         }
    
         public String getName(){
            return name;
         }
    
         public void setAge(int age){
            this.age=age;
         }
    
         public int getAge(){
            return age;
         }
    
        @Override
        public int compareTo(Student o) {
            int num=this.age-o.age;
            return num;
        }
    }
    //反向年龄顺序
    public class Student implements Comparable<Student>{
        private String name;
        private int age;
        public Student(){}
        public Student(String name, int age){
        this.name=name;
        this.age=age;
        }
         public void setName(String name){
            this.name=name;
         }
    
         public String getName(){
            return name;
         }
    
         public void setAge(int age){
            this.age=age;
         }
    
         public int getAge(){
            return age;
         }
    
        @Override
        public int compareTo(Student o) {
            int num=o.age-this.age;
            return num;
        }
    }
    //年龄相同时,按照名字顺序排序
    public class Student implements Comparable<Student>{
        private String name;
        private int age;
        public Student(){}
        public Student(String name, int age){
        this.name=name;
        this.age=age;
        }
         public void setName(String name){
            this.name=name;
         }
    
         public String getName(){
            return name;
         }
    
         public void setAge(int age){
            this.age=age;
         }
    
         public int getAge(){
            return age;
         }
    
        @Override
        public int compareTo(Student o) {
            int num=this.age-o.age;
            int num1=num==0?this.name.compareTo(o.name):num;
            return num1;
        }
    }
    
    比较器排序Comparator的应用
    //Main.java
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            TreeSet<Student>  ss=new TreeSet<Student>(new Comparator<Student>(){
                @Override
                public int compare(Student s1,Student s2){
                    int num=s1.getAge()-s2.getAge();
                    int  num2=num==0?s1.getName().compareTo(s2.getName()):num;
                    return num2;
                }
            });
            Student s1=new Student("lili",19);
            Student s2=new Student("zhangliang",20);
            Student s3=new Student("wangwu",18);
    
            ss.add(s1);
            ss.add(s2);
            ss.add(s3);
            for(Student s:ss){
                System.out.println(s.getName()+","+s.getAge());
            }
        }
    }
    
    //Student.java
    public class Student implements Comparable<Student>{
        private String name;
        private int age;
        public Student(){}
        public Student(String name, int age){
        this.name=name;
        this.age=age;
        }
         public void setName(String name){
            this.name=name;
         }
    
         public String getName(){
            return name;
         }
    
         public void setAge(int age){
            this.age=age;
         }
    
         public int getAge(){
            return age;
         }
    
        @Override
        public int compareTo(Student o) {
            int num=this.age-o.age;
            int num1=num==0?this.name.compareTo(o.name):num;
            return num1;
        }
    }
    
    案例:成绩排序(比较器排序)
    //Main.java
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            TreeSet<Student>  ss=new TreeSet<Student>(new Comparator<Student>(){
                @Override
                public int compare(Student s1,Student s2){
                    //主要条件
                    int num=(s2.getYuwen()+s2.getMath())-(s1.getYuwen()+s1.getMath());
                    //次要条件
                    int num2=num==0?s1.getYuwen()-s2.getYuwen():num;
                    int num3=num2==0?s1.getName().compareTo(s2.getName()):num2;
                    return num3;
                }
            });
            Student s1=new Student("lili",100,98);
            Student s2=new Student("zhangliang",20,79);
            Student s3=new Student("wangwu",98,76);
    
            ss.add(s1);
            ss.add(s2);
            ss.add(s3);
            for(Student s:ss){
                System.out.println(s.getName()+","+s.getYuwen()+","+s.getMath());
            }
        }
    }
    
    //Student.java
    public class Student implements Comparable<Student>{
        private String name;
        private int age;
        private int yuwen;
        private int math;
        public Student(){}
        public Student(String name, int age){
        this.name=name;
        this.age=age;
        }
        public Student(String name,int yuwen,int math){
            this.name=name;
            this.yuwen=yuwen;
            this.math=math;
        }
         public void setName(String name){
            this.name=name;
         }
    
         public String getName(){
            return name;
         }
    
         public void setAge(int age){
            this.age=age;
         }
    
         public int getAge(){
            return age;
         }
    
         public void setYuwen(int yuwen){
            this.yuwen=yuwen;
         }
    
         public int getYuwen(){
            return yuwen;
         }
    
         public void setMath(int math){
            this.math=math;
         }
    
         public int getMath(){
            return math;
         }
    
    案例:不重复的随机数
    //HashSet--->不进行排序
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Set<Integer> tt=new TreeSet<Integer>();
            Random r=new Random();
            while(tt.size()<10){
                int number=r.nextInt(20)+1;
                tt.add(number);
            }
    
            for(Integer i:tt){
                System.out.println(i);
            }
        }
    }
    //TreeSet--->进行大小排序
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Set<Integer> tt=new HashSet<Integer>();
            Random r=new Random();
            while(tt.size()<10){
                int number=r.nextInt(20)+1;
                tt.add(number);
            }
    
            for(Integer i:tt){
                System.out.println(i);
            }
        }
    }
    

    泛型

    好处:1、将运行时期的问题提前到了编译时期;2、避免了强制转换

    基础练习:

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Collection c=new ArrayList();
            c.add("hello");
            c.add("world");
            c.add("java");
            c.add(100);
            Iterator it=c.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
        }
    }
    
    泛型类
    //定义格式
    修饰符 class 类名<类型>{}
    
    相关应用:
    //DateTest.java
    public class DateTest<T>{
    private T t;
    public T getT(){
        return t;
    }
    public void setT(T t){
        this.t=t;
    }
    }
    
    //Main.java
    public class Main {
        public static void main(String[] args) {
            DateTest<String> ll=new DateTest<String>();
            ll.setT("lili");
            System.out.println(ll.getT());
    
            DateTest<Integer>  i=new DateTest<Integer>();
            i.setT(100);
            System.out.println(i.getT());
        }
    }
    
    泛型方法:
    //格式
    修饰符<类型> 返回值类型方法名(类型 变量名){}
    
    相关应用:
    //Main.java
    public class Main {
        public static void main(String[] args) {
            DateTest s=new DateTest();
            s.show("hello");
            s.show(100);
        }
    }
    
    //DateTest.java
    public class DateTest{
        public <T>void show(T t){
            System.out.println(t);
        }
    }
    
    泛型接口
    //格式
    修饰符 interface 接口名<类型>{}
    
    相关应用:
    //Main.java
    public class Main {
        public static void main(String[] args) {
           Fanxing<String> ff=new DateTest<String>();
           ff.show("wangwu");
           Fanxing<Integer> ii=new DateTest<Integer>();
           ii.show(100);
           Fanxing<Boolean> bb=new DateTest<Boolean>();
           bb.show(true);
        }
    }
    
    //Fanxing.java
    public interface Fanxing<T> {
        void show(T t);
    }
    
    //DateTest.java
    public class DateTest<T> implements Fanxing<T>{
        public void show(T t){
            System.out.println(t);
        }
    }
    
    类型通配符
    为了表示各种泛型list的父类,可以使用类型通配符
    //类型通配符
    <?>
        //类型通配符的上限(谨代表某一类泛型list的父类)
        <?extends类型>
        //类型通配符的下限,代表某一类的子类
        <?super类型>
    
    相关应用:
     //类型通配符
           List<?> ll=new ArrayList<>();
           List<?> ll2=new ArrayList<Number>();
           List<?> ll3=new ArrayList<Integer>();
    
           //类型通配符的上限
            List<?extends Number> ll4=new ArrayList<Number>();
            List<?extends Number> ll5=new ArrayList<Integer>();
    
            //类型通配符的下限
            List<?super Number> ll6=new ArrayList<>();
            List<?super Number> ll7=new ArrayList<Number>();
    
    可变参数
    用作方法的形参出现,即方法参数可变
    //格式
    修饰符 返回值类型 方法名(数据类型...变量名){}
    
    相关应用:
    public class Main {
        public static void main(String[] args) {
            System.out.println(sum(10));
            System.out.println(sum(10,20));
            System.out.println(sum(10,20,30));
        }
    
        public static int sum(int ...a){
            int sum=0;
            for(int i:a){
                sum+=i;
            }
            return sum;
        }
    }
    

    注意:如果需要将某个普通参数与可变参数放到一起,则需要将可变参数放到普通参数的后面。

    可变参数的使用:
    public static <T>list<T> asList(T...a);//返回由指定数组支持的固定大小的列表
    List<String> list=Arrays.asList("hello","world","java");
    //该方法构造的列表,不能通过add和remove的操作,能进行set操作。
    
    public static <E>list<E> of(E...elements);//返回包含任意数量元素的不可变列表
    List<String> ll=List.of("hello","world","java");
    //该方法构造的列表,不能通过add和remove的操作,set操作也不行。
    
    public static <E>Set<E> of(E..elements);//返回一个包含任意数量元素的不可变集合
    Set<String> ll1=Set.of("hello","world","java");
    //该方法构造的列表,不能通过add和remove的操作,没有set操作;不能出现重复的元素
    

    Map集合

    interface Map<K,V>  //K:键的类型   V:值的类型
        //不可重复,一一对应,呈映射关系
    
    相关应用:
    //添加元素
     Map<String,String> mm=new HashMap<String,String>();
    
            mm.put("20214063","liuzijin");//添加元素
            mm.put("20214056","liuyichen");//添加元素
            mm.put("20214063","wangwu");//修改已有键的元素--->代替
            System.out.println(mm);
    
    Map集合基本功能:
    V put(K key,V value);//添加元素
    V remove(Object key);//根据键删除键值对元素
    void clear();//移除所有的键值对元素
    boolean containsKey(Object key);//判断集合是否包含指定的键
    boolean containsValue(Object value);//判断集合是否包含指定的值
    boolean isEmpty();//判断集合是否为空
    int size();//集合的长度,也就是集合中键值对的个数
    
    相关应用:
    Map<String,String>  map=new HashMap<String,String>();
    //添加元素
    map.put("1","wo");
    //移除元素
    map.remove("1");//System.out.println("1");---->会输出wo
    //清空元素
    map.clear();
    //判断集合是否包含指定的键
    System.out.println(map.containsKey("1"));
    //判断集合是否包含指定的值
    System.out.println(map.containsValue("1"));
    //判断集合是否为空
    System.out.println(map.isEmpty());
    //得到集合长度
    System.out.println(map.size());
    

    原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/275897.html

    (0)
    上一篇 2022年7月21日 20:38
    下一篇 2022年7月21日 20:39

    相关推荐

    发表回复

    登录后才能评论