day07常用API、泛型、Collection集合

本文介绍了Java中Date、DateFormat、Calendar等时间处理类的使用,包括时间的创建、格式化和计算。同时,讲解了泛型的概念,如何在集合中应用泛型以及泛型的通配符。此外,还探讨了Collection接口及其子类ArrayList、LinkedList和Set的特点,展示了各种遍历集合的方式。
摘要由CSDN通过智能技术生成

1、常用API

①Date日期类

  • Date类代表了当前系统此时此刻的时间信息对象

  • //常用构造器
    public Date();
    public Date(long time);
    
    //方法
    public long getTime()
        //返回从1970-01-01 00:00:00走到此刻的总的时间毫秒值。
        //1000ms = 1s
    
  • Java记录时间的两种方式

    1. 可以直接用Date日期类对象记录:Date d = new Date();
    2. 可以直接用时间毫秒值:从1970-01-01 00:00:00 走到此刻的总时间毫秒值:long time = d.getTime();
  • 时间毫秒值可以用作时间的运算,比如用来统计代码的执行性能

    // 1.先获取启动之前的时间
    Date d1 = new Date();
    long startTime = d1.getTime();
    
    for(int i = 0  ; i < 10000 ; i++){
        System.out.println("输出:"+i);
    }
    
    // 2.获取执行完毕之后的时间
    Date d2 = new Date();
    long endTime = d2.getTime();
    
    System.out.println("耗时:"+( endTime - startTime )/ 1000.0 + "s");
    
  • 有参构造器public Date(long time);可以直接把时间毫秒值转换成日期对象,和getTime();作用相反

    // 需求:请问121s后的时间是多少!!
    // 得到当前系统的此刻日期信息对象
    Date d = new Date();
    System.out.println("开始:"+d);
    // 获取时间毫秒值
    long time = d.getTime();
    // 时间毫秒值往后走 121s
    time += 121 * 1000;
    // 把时间毫秒值转换成对应的日期对象
    Date d1 = new Date(time);
    System.out.println("结果:"+d1);
    

②DateFormat日期格式化类

  • 作用:可以把日期对象或时间毫秒值转换成字符串时间格式 Date,long → String

    ​ 也可以把字符串时间格式解析成日期对象 String → Date

  • 这个类是一个抽象的父类,无法直接调用,要使用它的子类SimpleDateFormat调用

  • SimpleDateFormat (简单日期格式化对象)

a.构造器:public SimpleDateFormat(String pattern):参数是定制时间的格式yyyy-MM-dd HH:mm:ss
b.方法
    -- public String format(Date d):把日期对象转换成格式化的字符串时间返回
    -- public String format(Object time):把时间毫秒值转换成格式化的字符串时间返回
    -- public Date parse(String time):把字符串的时间解析成日期对象
// 现在已知时间是“2021-02-24 09:00:01”
// 请问5天 12小时,119s后的时间是多少
String str = "2021-02-24 09:00:01";
//定制时间格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//把字符串时间解析成日期对象
Date date = sdf.parse(str);
//日期对象转换成时间毫秒值
long startTime = date.getTime();
//加上走的5d12h119s
startTime += (5*24*60*60 + 12*60*60 + 119)*1000;
//把时间毫秒值转换成字符串时间
String endTime = sdf.format(startTime);
System.out.println(endTime);    //2021-03-01 21:02:00

③Calendar日历类

  • 代表当前系统此刻时间对应的日历对象,是一个抽象类

  • 创建对象方式:

    public static Calendar getInstance()	//直接返回一个日期对象
    
  • Calendar的方法:
    	-- public int get(int field):根据参数取日期信息
        -- public Date getTime() : 拿日期的此刻日期对象
        -- public long getTimeInMillis() : 拿此刻时间毫秒值
        -- public void add(int field, int amount):让日历中的某个信息多走一个值
    
    //计算一个人活了多久
    //先定义一个人的字符串出生日期
    String birthday = "1999.05.09 12:13:14";
    //时间格式
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    //把字符串日期解析为日期对象
    Date date = sdf.parse(birthday);
    //转成时间毫秒值
    long time = date.getTime();
    //获取时间毫秒值得差值
    long time2 = new Date().getTime() - time;
    //计算天数
    int days = (int) (time2/(24*60*60*1000));
    int hours = (int) ((time2%(24*60*60*1000))/(60*60*1000));
    int mins = (int) (((time2%(24*60*60*1000))%(60*60*1000))/(60*1000));
    int seconds = (int) (((time2 % (24 * 60 * 60 * 1000))%(60*60*1000)%(60*1000)) / 1000.0);
    System.out.println(days+"天"+hours+"小时"+mins+"分"+seconds+"秒");
    

④System系统类

  • //方法
    	-- public static long currentTimeMillis():获取系统当前此刻的时间毫秒值
        -- public static void exit(int status):终止当前正在运行的 Java 虚拟机,0表示正常结束
     	-- public static void arraycopy(Object src ,int srcPos ,Object dest, int destPos,
                                        int length):数组拷贝,数组复制。
        //参数一:原数组;参数二:从原数组哪个位置开始复制;参数三:目标数组;参数四:复制到目标数组的哪个位置开	始。参数五:复制多少个
    
    //直接通过系统类得到系统的当前此刻时间毫秒值
    long time = System.currentTimeMillis();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println(sdf.format(time));
    

⑤BigDecimal大数据处理类

  • 可以解决浮点型数据运算精度失真

  • //静态方法
    public static BigDecimal valueOf(double val)//把double类型的数据转成BigDecimal对象运算
    
  • //实例方法
        public BigDecimal add(BigDecimal value); 加法
        public BigDecimal subtract(BigDecimal value); 减法
        public BigDecimal multiply(BigDecimal value); 乘法
        public BigDecimal divide(BigDecimal value); 除法
        public double doubleValue(): 把BigDecimal的数据转换成double类型的数据
    

⑥StringBuilder类

  • Java建议在做字符串拼接和运算的时候使用StringBuilder类/StringBuffer类

  • 方法:public StringBuilder append(String str)

    sb.append("Java是").append("最牛逼的语言!");
    

⑦包装类

  • 八大基本数据类型不属于对象,包装类就是把他们变成了一个类

  • 集合和泛型都只支持引用数据类型不支持基本数据类型,这时候就必须用到包装类

  • 基本数据类型              包装类
        byte                 Byte
        short                Short
        int                  Integer(特殊)
        long                 Long
        float                Float
        double               Double
        char                 Character(特殊)
        boolean              Boolean
    
  • 自动装箱:可以直接把基本数据类型的变量或者值赋值给对应的包装类对象

    int age = 23 ;
    Integer age1 = age; // 自动装箱
    
  • 自动拆箱:可以把包装类的对象赋值给基本数据类型的变量

    Integer it = 100 ;
    int it1 = it ;// 自动拆箱
    
  • 把字符串类型的数字转化成对应的基本数据类型的值

    Xxxx.parseXxxx(“字符串类型的数字”)

    Xxxx.valueOf(“字符串类型的数字”)

    String num3 = "23";
    //int num3Int = Integer.parseInt(num3);
    int num3Int = Integer.valueOf(num3);
    System.out.println(num3Int+1); // 24
    
    String num4 = "99.99";
    //double num4Double = Double.parseDouble(num4);
    double num4Double = Double.valueOf(num4);	//100.0
    

2、泛型

  • 格式:<数据类型>

  • 可以约束在编译阶段只能操作某种数据类型

  • 泛型和集合都不支持基本数据类型,只能使用引用数据类型

  • ArrayList<String> lists = new ArrayList<String>();
    ArrayList<String> lists = new ArrayList<>();	//jdk1.7后可以省略
    
  • 不使用泛型在编译阶段进行类型转换时很有可能出现转换异常,加入泛型后类型即可在编译阶段就确定

定义泛型类

  • 格式:

    修饰符 class 泛型类名称<泛型变量>{
        //泛型变量:一般使用 E , T , K , V
    }
    
  • 核心思想是把出现泛型变量的地方全部替换成传输的真实数据类

定义泛型方法

  • 格式

    修饰符 <泛型变量> 返回值类型 方法名称(泛型形参){
        //泛型变量:一般使用 E , T , K , V
    }
    

定义泛型接口

  • 格式

    修饰符 interface 接口名称<泛型变量>{
        
    }
    

泛型的通配符和上下限x

  • 通配符——?,使用泛型时可以代表一切类型

  • ? extends x —— ?必须继承x或者是x本身,泛型的上限

    ? super x —— ?必须是x的父类或者x本身,泛型的下限


3、Collection集合

概述

  • 集合与数组区别:

    1. 集合是一个容器,在程序运行过程中操作数据传输数据等
    2. 集合是个大小可变的容器,类型可以不确定,可以存储任意类型的元素;数组是长度固定的容器,定义的时候就要确定类型
  • Collection集合类是java中集合的祖宗类

  • Collection集合的体系结构:
                              Collection<E>(接口,根类)
                        	/                           		\
                    List<E>(接口)                      		Set<E>(接口)
              /               \            \                  		\
    ArrayList<E>(实现类) Vector(线程安全) LinkedList<E>(实现类)     HashSet<E>(实现类)
                                                                		\
                                                           				LinkedHashSet<E>(实现类)
    
  • List系列集合特点:添加的元素是有序,可重复,有索引的

    ArrayList和LinkedList:添加的元素是有序,可重复,有索引的

  • Set系列集合特点:添加的元素是无序,不可重复,无索引的

    HashSet:添加的元素是无序,不可重复,无索引的

    LinkedHashSet:添加的元素是有序,不可重复,无索引的

常用API

public boolean add(E e):  把给定的对象添加到当前集合中
public void clear() :清空集合中所有的元素
public boolean remove(E e): 把给定的对象在当前集合中删除
public boolean contains(Object obj): 判断当前集合中是否包含给定的对象
public boolean isEmpty(): 判断当前集合是否为空
public int size(): 返回集合中元素的个数
public Object[] toArray(): 把集合中的元素,存储到数组中

遍历

  • 三种遍历方式:迭代器、增强for循环、lambda表达式

  • 迭代器

    1. 获得当前集合迭代器对象:Iterator iterator()
    2. 询问是否有下一个元素:boolean hasNext()
    3. 移到下一个位置,取出下一个元素:E next()
    //定义一个while循环,通过hasNext()查询是否还有下一个元素,有就通过next()取出该元素直到循环结束
    public class CollectionDemo01{
        public static void main(String[] args){
            //先创建一个Collection集合
            Collection<String> arrs = new ArrayList<>();
            //添加一些元素
            arrs.add("java");
            arrs.add("python");
            arrs.add("php");
            arrs.add("c#");
            System.out.println(arrs);   //[java, python, php, c#]
    
            //得到当前集合的迭代器对象
            Iterator<String> it = arrs.iterator();
    
            //用while循环判断
            while(it.hasNext()){
                String next = it.next();
                System.out.print(next+"\t");    //java	python	php	c#	
            }
        }
    }
    
  • 增强for循环(foreach遍历)

    1. foreach可以遍历集合也可以遍历数组

    2. 格式:

      for(被遍历集合或者数组中元素的类型 变量: 被遍历集合或者数组){
      }
      
    public class CollectionDemo01{
        public static void main(String[] args){
            //先创建一个Collection集合
            Collection<String> arrs = new ArrayList<>();
            //添加一些元素
            arrs.add("java");
            arrs.add("python");
            arrs.add("php");
            arrs.add("c#");
            System.out.println(arrs);   //[java, python, php, c#]
            
            for (String ele:arrs
                 ) {
                System.out.println(ele);
            }	//java	python	php	c#	
        }
    }
    
    • lambda表达式,jdk1.8之后
    public class CollectionDemo01{
        public static void main(String[] args){
            //先创建一个Collection集合
            Collection<String> arrs = new ArrayList<>();
            //添加一些元素
            arrs.add("java");
            arrs.add("python");
            arrs.add("php");
            arrs.add("c#");
            System.out.println(arrs);   //[java, python, php, c#]
            
            arrs.forEach(s -> {
                System.out.print(s+"\t");
            });	//java	python	php	c#	
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值