Android的第十三天

来源:互联网 发布:excel软件百度云 编辑:程序博客网 时间:2024/06/06 02:07

Set集合,泛型及内部类

Set集合:

40245106


-----------------Collection
-------------------------List
-----------------------------ArrayList
-----------------------------LinkedList
-----------------------------Vector
。。。。
-------------------------Set
----------------------------HashSet
----------------------------TreeSet




List集合:特点:有序,可重复


Set集合:特点:无序,不可重复


无序:


Set集合没有扩展方法----------->里面的方法全是collection里面的方法




HashSet集合:是根据重写的HashCode方法和equals方法进行比较重复元素的


HashCode值得来历:
HashCode默认的是当前对象的内存地址


HashSet的存储原理:
1:当我们调用HashSet的add方法的时候,会首先调用当前对象的HashCode值
来进行比较,比较的结果有两种:
1:HashCode值不等的时候
他会把当前的hashcode值通过一系列的以为运算计算出当前对象应该存储的地点然后进行存储。

2:HashCode值相等的时候
然后再比较当前的对象的equals方法是否返回true
1:返回true说明当前对象确实存在,那么久不存储当前的数据
2:返回false的时候,那么久存储当前对象








TreeSet集合:是根据比较器来进行比较重复元素的,实现comparable接口或者comparetor接口,并实现其中的方法
1,能干什么?
能够对加入集合的数据进行排序




方法:ceiling(E e) 
          返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。
first() 
          返回此 set 中当前第一个(最低)元素。
floor(E e) 
          返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null。
isEmpty() 
          如果此 set 不包含任何元素,则返回 true。 
iterator() 
          返回在此 set 中的元素上按升序进行迭代的迭代器。 
  last() 
          返回此 set 中当前最后一个(最高)元素。 
remove(Object o) 
          将指定的元素从 set 中移除(如果该元素存在于此 set 中)。 
size() 
          返回 set 中的元素数(set 的容量)。 






如何定义比较器:
第一种方法:
第一步:让当前对象实现于Comparable接口,重写里面的CompareTo方法


第二步:自定义比较规则
比较谁就用谁来做减法
减法的结果有三个:如果是正数,说明前面的比后面的大,
如果是0,说明两个一样大
如果减法的结果是负数,说明后面的比前面的大




第二种方法:编写一个类实现于Comparator,重写里面的方法,定义一下里面的比较规则。也是相减








泛型:


在Java中所有的数据类型都有自己的描述类,在泛型中只能使用原始的类型,简单的说就是使用的是数据的描述类型
的名字来描述那个泛型的类型
例如:int的描述类------>Integer


ArrayList<Integer> list = new ArrayList<Integer>();是正确的
ArrayList<int> list = new ArrayList<int>(); 是错误的




泛型的写法:
ArrayList<Integer> list = new ArrayList();
ArrayList list = new ArrayList<Integer>();
上面两个是早期版本,下面的是最新版本。统一写成新版本
ArrayList<Integer> list = new ArrayList<Integer>();








泛型:动态的确定了数据类型,object类型在转换的时候需要强制类型转换,所以相对来说泛型对object比较方便的。但是子啊程序中理解起来比较困难

需求:编写一个方法能够接收任意类型的数据,并且可以将任意类型的数据返回到调用处?
泛型可以解决这个问题


1,集合中的泛型:------>就是对集合中数据类型的一种约束而已。见上面的三种定义写法。


2,方法中的泛型:
修饰符 <E>返回值类型 方法名(形参列表)
定义了一个泛型E,定义一般使用大写


public static <L> L getMessage (L l){
return l;
}


方法的解析:<L>:表示定义了一种数据类型,关于这种数据类型到底是什么?在方法调用的时候确定
    L:表示的是返回类型是L
   形参里面的L:表示的是接受的数据类型是L
注意:就是方法中的泛型的数据类型在什么时候确定
调用当前的方法的时候进行定义


注意:定义泛型的一般情况下使用T或者E,但是不代表其他的没法用


方法中泛型的生命周期就是整个方法声明体






3,类中的泛型

class 类名<T> {

}


类中的泛型就是整个类,其实类名是可以用中文的


类中的泛型的具体的数据类型就是在类对象创建的时候来确定泛型的基本的数据类型的




4,接口中的泛型


interface 接口名<T> {

}


接口中的数据类型的确定
1:可以在接口的实现类上面去进行确定
2:页可以在调用除进行确定接口中泛型的数据类型






泛型的转型:
1:向上转型
2:向下转型


需求:编写一个函数,这个函数能够接受的数据类型是Number的所有子类的一个集合
向上转型:
public void getData(Collection<? extends Number> e) {

}
编写一个函数,这个函数能够接受Byte的所有父类的一个集合
向下转型:
public void getData1(Collection<? super Byte> e) {


}












内部类:
在一个类的内部还有一个类


Outter是外部类,Inner是内部类


内部类的访问三种方式:
1:可以在外部类中提供一个方法来访问当前内部类中的数据
2:可以在外部类中提供一个方法来返回当前内部类的对象后通过对象来访问
3:可以通过 Outter.Inner inner = new Outter().new Inner();来获取当前的类的对象资格


注意:
如果当前的内部类含有静态的方法的话,那么当前的内部类必须是static来修饰----->静态内部类
如果内部类中的成员变量使用了static修饰的话,那么该变量必须是final类型的




静态内部类的访问:把Inner设置成static的
Outter.Inner inner = new Outter.Inner();






局部内部类:--------->在方法体里面含有的类称为局部内部类










匿名内部类:存在继承关系下,存在于实现关系下
匿名对象------->没有名的对象
匿名内部类----->


匿名内部类的使用是有前提的:匿名内部类只是适用于继承和实现的关系下


匿名内部类没有名字,使用匿名内部类创建对象的时候需要借助于他爹(接口/超类)


注意:  1.使用匿名内部类创建对象的话,那么离不开多态
2.如果在匿名对象的末尾需要通过对象,函数名访问多个函数的话,那么需要访问的前面的n
个函数需要返回this(也就是当前匿名内部类的对象),我们不知道匿名内部类的对象名,但是this知道
3.我们可以使用多态来指向当前的匿名内部类的对象,这样通过多态的形式来进行访问







作业:使用集合存储用户对象,来模拟那个登陆和注册,且用户名是不能重复的
用户登陆的结果需要打印到控制台
可以实现循环的登陆注册

0 0