【JavaEE】Day07-Set集合&泛型

###1.Set(接口)
##1.1 HashSet集合(是Set的实现类)
特点:
元素存取无序
元素不能重复
没有索引,
遍历方式:
只能通过迭代器和增强for循环遍历。
格式:
//创建集合对象
Set set = new HashSet();
方法:
从Collection中继承的方法
Hashset认为
只要是new出来的东西他都认为不是同一个东西
例:
stu.add(new Student(“哈哈”,14));
stu.add(new Student(“哈哈”,14));
这俩个都可以存到集合中
只有重写了hashCode才会认为是同一个东西,才只会存储一个到集合中

##1.2 LinkedHashSet集合
	特点:
		元素存取有序,取出的顺序和存储的顺序是一致的
		元素不能重复
		没有索引,
		
		
##1.3 TreeSet集合
 元素有序,可以按照一定的规则进行排序,具体排序方式取决于构造方法
- TreeSet():根据其元素的自然排序进行排序
- TreeSet(Comparator comparator) :根据指定的比较器进行排序
  • 没有带索引的方法,所以不能使用普通for循环遍历
  • 由于是Set集合,所以不包含重复元素的集合
    TreeSet和HashSet完全不同:
    他的底层是基于二叉树原理:小的去自己的左边,大的去自己的右边;在获取元素的时候是从最左边开始取,
    这个顺序导致TreeSet具有排序的功能。
    ***在开发过程中使用请使用ArrayList进行排序。
    原因:TreeSet如果比较的值得到的是0就会认为是重复的元素,就会自动删除;
    如果有多个字段的就需要每个字段进行一一比较,比较麻烦所以不会用TreeSet比较。

2. 自然排序 (了解)

	2.1 比较器排序Comparator的使用

3.泛型 (重点)

3.1 概述:

泛型定义格式

  • <类型>:指定一种类型的格式。这里的类型可以看成是形参
  • <类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参
  • 将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型

泛型的好处:
*把运行时期的问题提前到了编译期间
*避免了强制类型转换

	**注意:并不是所有情况都适合用泛型,
	如果已经确定参数的类型就不要用泛型,直接定义需要的类型格式就行

3.2 泛型类
定义格式:
修饰符 class 类名<类型> { }
好处:
*可以在类中任何地方使用这个泛型

缺点:
	*创建完对象,泛型就会确定不可改变	
  • 示例代码

    • 泛型类

      public class Generic<T> {
          private T t;
      
          public T getT() {
              return t;
          }
      
          public void setT(T t) {
              this.t = t;
          }
      }
      
      
  • 测试类

    public class GenericDemo {
        public static void main(String[] args) {
            Generic<String> g1 = new Generic<String>();
            g1.setT("林青霞");
            System.out.println(g1.getT());
    
            Generic<Integer> g2 = new Generic<Integer>();
            g2.setT(30);
            System.out.println(g2.getT());
    
            Generic<Boolean> g3 = new Generic<Boolean>();
            g3.setT(true);
            System.out.println(g3.getT());
        }
    }	
    
    

3.3 泛型方法
定义格式:
修饰符 <类型> 返回值类型 方法名(类型 变量名) { }

示例代码

  • 带有泛型方法的类

    public class Generic {
        public <T> void show(T t) {
            System.out.println(t);
        }
    }
    
  • 测试类

    public class GenericDemo {
        public static void main(String[] args) {
    		Generic g = new Generic();
            g.show("林青霞");
            g.show(30);
            g.show(true);
            g.show(12.34);
        }
    }		
    	
    

3.4 泛型接口:
定义格式:
修饰符 interface 接口名<类型> { }
示例代码

  • 泛型接口

    public interface Generic<T> {
        void show(T t);
    }
    
  • 泛型接口实现类

    public class GenericImpl<T> implements Generic<T> {
        @Override
        public void show(T t) {
            System.out.println(t);
        }
    }
    
  • 测试类

    public class GenericDemo {
        public static void main(String[] args) {
            Generic<String> g1 = new GenericImpl<String>();
            g1.show("林青霞");
    
            Generic<Integer> g2 = new GenericImpl<Integer>();
            g2.show(30);
        }
    }			 
    	
    

###4 泛型通配符(类型通配符)
4.1 作用:限定泛型的
格式:
*? 没有限定
*?extends 类 ----->你的泛型只能是这个类或者是他的子类
*?super 类 ------->你的泛型只能是这个类或者是他的父类

4.2 可变参数
	格式:
		数据类型...变量名
	本质:
		是一个数组
	可变参和数组的区别:
		可变参数介绍

​ 可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了

  • 可变参数定义格式

    修饰符 返回值类型 方法名(数据类型… 变量名) {  }
    
  • 可变参数的注意事项

    • 这里的变量其实是一个数组
    • 如果一个方法有多个参数,包含可变参数,可变参数要放在最后
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值