黑马程序员技术交流社区

标题: [石家庄校区]Object类 常用API Collection集合 泛型学习笔记 [打印本页]

作者: DLDCHENGHEI    时间: 2018-7-26 10:52
标题: [石家庄校区]Object类 常用API Collection集合 泛型学习笔记
本帖最后由 DLDCHENGHEI 于 2018-7-26 15:00 编辑

Object类 常用API Collection集合 泛型





Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例


化的时候,最终找的父类就是Object。public String toString():返回该对象的字符串表示。


toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。

由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因

此也需要重写它。

调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定

义两种方式。

默认地址比较:

如果没有覆盖重写equals方法,那么Object类中默认进行 == 运算符的对象地址比较,只要不是同一个对象,结果

必然为false。

对象内容比较:

如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方

法。  

     Date时间类:继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把

毫秒值转成日期对象。

public Date() :分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。

public Date(long date) :分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元

(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。


java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转

换,也就是可以在Date对象与String对象之间进行来回转换。

格式化:按照指定的格式,从Date对象转换为String对象。

模式(格式)来指定格式化或解析的标准。构造方法为:

public SimpleDateFormat(String pattern) :用给定的模式和默认语言环境的日期格式符号构造

SimpleDateFormat。

参数pattern是一个字符串,代表日期时间的自定义格式  

public String format(Date date) :将Date对象格式化为字符串。

public Date parse(String source) :将字符串解析为Date对象


使用日期时间相关的API,计算出一个人已经出生了多少天。  
1获取当前时间对应的毫秒值

2.获取自己出生日期对应的毫秒值

3.两个时间相减(当前时间– 出生日期)

代码实现:

public static void function() throws Exception {

System.out.println("请输入出生日期 格式 YYYY‐MM‐dd");

// 获取出生日期,键盘输入

String birthdayString = new Scanner(System.in).next();

// 将字符串日期,转成Date对象

// 创建SimpleDateFormat对象,写日期模式

SimpleDateFormat sdf = new SimpleDateFormat("yyyy‐MM‐dd");

// 调用方法parse,字符串转成日期对象

Date birthdayDate = sdf.parse(birthdayString);

// 获取今天的日期对象

Date todayDate = new Date();

// 将两个日期转成毫秒值,Date类的方法getTime

long birthdaySecond = birthdayDate.getTime();

long todaySecond = todayDate.getTime();

long secone = todaySecond‐birthdaySecond;

if (secone < 0){

System.out.println("还没出生呢");

} else {

System.out.println(secone/1000/60/60/24);

}

}  

时间类型的相互转换:
long
\SimpleDateFormat
Date-------------------- String
/
Calenda
Collection是所有单列集合的最顶层接口
Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可
用于操作所有的单列集合。方法如下:
public boolean add(E e) : 把给定的对象添加到当前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e) : 把给定的对象在当前集合中删除。
public boolean contains(E e) : 判断当前集合中是否包含给定的对象。
public boolean isEmpty() : 判断当前集合是否为空。
public int size() : 返回集合中元素的个数。
public Object[] toArray() : 把集合中的元素,存储到数组中  

Iterator接口:
迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个
元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业
术语称为迭代。
Iterator接口的常用方法:
public E next() :返回迭代的下一个元素。
public boolean hasNext() :如果仍有元素可以迭代,则返回 true。

在前面学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升

成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。

  我们在集合中会大量使用到泛型,这里来完整地学习泛型知识。
泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。


泛型通配符:

当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配

符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
  
通配符高级使用----受限泛型
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个
泛型的上限和下限。
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
比如:现已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类


综合案例实现斗地主的洗牌发牌代码:

public class Doudizhu1 {
    public static void main(String[] args) {
        //创建牌盒集合
        ArrayList<String> poker=new ArrayList<>();
        //创建数组分别存放花色 和数字
        String [] strs={"♥","♠","♦","♣"};
        String [] numbers={"A","2","3","4","5","6","7","8","9","10","J","Q","K",};
        //把花色和数字组合 并添加到poker集合中
        for (String str : strs) {
            for (String number : numbers) {
                String zuhe=str+number;
                poker.add(zuhe);
            }
        }
        //添加大王 小王
        poker.add("大王");
        poker.add("小王");
       /* System.out.println(poker);
        System.out.println(poker.size());*/
       //Conllections.shuffle打乱牌的顺序
        Collections.shuffle(poker);
        //创建三个玩家集合 和一个底牌集合
        ArrayList<String> player1=new ArrayList<>();
        ArrayList<String> player2=new ArrayList<>();
        ArrayList<String> player3=new ArrayList<>();
        ArrayList<String> dipai=new ArrayList<>();
        //遍历牌盒集合 知道索引
        for (int i = 0; i < poker.size(); i++) {
            String paimian = poker.get(i);
            if(i>=51){  //索引值大于等于51表示是剩余的3张底牌
                dipai.add(paimian);  //存入底牌集合中
            }else if(i%3==0){  
                player1.add(paimian);
            }else if(i%3==1){
                player2.add(paimian);
            }else if(i%3==2){
                player3.add(paimian);
            }
        }
        //显示三个玩家的牌 和底牌
        System.out.println("玩家一:"+player1);
        System.out.println("玩家二:"+player2);
        System.out.println("玩家三:"+player3);
        System.out.println("底牌:"+dipai);
    }
}












欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2