JavaDay15总结学习

一、笔记

1.泛型
对,类 ,接口后者方法的一个约束,泛型其实就是一个参数来替换所有的类型 (泛型中没有继承)。
场景: 当不知道集合存什么类型的数据的时候就使用泛型。
泛型里一般表示的之母:
在实例化集合泛型的语法:

在jdk1.7之后  ArrayList<Integer>  list  =  new ArrayList<>(); (注意点就是后面<>里的可以省略,前面不可以进行省略)
在jdk1.7之前 ArrayList<Integer>  list  =  new ArrayList<Integer>();必须这样写, 前后的泛型类型必须是一样

没有泛型的时候:

好处: 默认如果没有添加泛型,默认的是Object, 所有的数据类型都可以进行存 
坏处:不安全,会报错(java.lang.ClassCastException)  强制类型转换错误

有泛型的时候:

好处:  1.避免强制转型   2.把错误由运行出错提前到编译出错
坏处: 只能够存一种数据类型
注意点:如果使用迭代器来遍历集合,迭代器的泛型必须与集合的泛型是一样的

用泛型来约束类

public class ArrayList<E> 
                        语法: 访问修饰符  关键字(class) 类名<泛型>{
                         类里的具体的内容
                  }
注意点 :
1.在 写这个类的具体的信息的时候,没有给其具体的类型
2.也就是在new 的时候给其具体的类型
3.当给类加泛型之后,类里所有的都可以使用这个泛型<T>

给方法来定义泛型:(对方法来进行约束)

语法 :   访问修饰符<泛型> 返回值类型  方法的名称(参数(参数可以使用泛型的数据类型)){
                                方法体
                  }
例子: 给方法加泛型的语法
            public   <T>void   printWorld(T t){
                 System.out.println(t);
                 } 
注意点:在调用其方法的时候知道其泛型                
静态方法:也可以加泛型:      
注意点:静态方法不能使用类的泛型的,只能有方法的泛型 

接口的泛型:来约束接口

语法: 
访问修饰符   interfance  接口的名称<T>{
                          抽象方法 
                 }
例子:   
public interface Iter<T> {
         }              

如果接口有泛型,实现类有两种表现形式:

1.实现类确定具体的泛型了
2. 实现类不能够确定其泛型(也就是在 new 的时候确定其泛型)
第二种情况的语法:                                                                           public class IterUpdateImpl<T> implements IterUpdate<T> {}

泛型的通配符 :

?  任意的泛型
特点:
1.不能在实例化的时候给?泛型
2,一般是作为参数的类型
<? extends E>  这种表示 是 E 泛型的子类或者是它本身
<? super E>   这种表示是 E 泛型的父类或者它本身

2.set
常规的方法跟 Collection是一样的

1. 父类是Collection  
2. 不能包含重复的元素
3. 无序(不能使用普通的for循环) 

子类: HashSet

1. 基层存 是由哈希表结构进行存(查询速度快)
2. 不能包含重复的元素,可以包含"" 的数据  用于检查是否重复,执行了两个方法  第一个是HashCode方法     第二个是equals()方法
3.无序(不能使用普通的for循环) :存入的数据顺序与取出来的顺序不一样 

哈希表结构:如图:在这里插入图片描述
HashSet 常规的方法: add(E e) 添加
对set集合进行遍历 :

1.第一种使用没有泛型 转换成数组的方式
  Object[] o=  set.toArray();//返回的是Object类
        for (Object ob:o){
            System.out.println(ob);
        }
2.使用迭代器的方式
Iterator iter=set.iterator();
        while (iter.hasNext()){
            System.out.println(iter.next());
        }
3.使用增强for 循环的方式
 for (Object obj:set){
            System.out.println(obj);
        }
4.使用带泛型,转换成数组的方式
 HashSet<String> set = new HashSet<String>();
          set.add("苍老师");
          set.add("波多老师");
String [] str =  set.toArray(new String[]{});
         for(int i =0;i<str.length;i++){
             System.out.println(str[i]);
         }

注意点:因为没有索引,索引不能够使用普通for循环
set集合不能够值重复 :
原因:实际上是使用map来进行存,是以键值对来进行存 map的键是不能够重复的
==》实际上调用了两个方法, 一个是hashcode 方法 , 一个equals()
如图:
在这里插入图片描述
LinkedHashSet(有序): 父类是HashSet(无序)

存的方式是采用的数据+ 双重链表式  
第一种链表式用于来把相同hash值的元素进行串联 
第二种链表式来记录每一值的顺序 
有序的:存与取都是一致的

二、总结

第十五天的学习,今天学习了泛型与Collection的另一个子接口set,HashSet虽然无序,但是LinkedHashSet却是有序的,代码犹如人生,一物降一物,万事总有解决的办法的。加油干!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值