一,BigDecimal
1,概述
-浮点数在做运算的时候,可以能损失精度,为了能够更加精确的计算浮点数,java提供了 BigDecimal
2,成员变量
static int ROUND_CEILING
圆形模式向正无穷大转弯。
static int ROUND_DOWN
舍入模式向零舍入。
static int ROUND_FLOOR
舍入模式向负无穷大转弯。
static int ROUND_HALF_DOWN
四舍五入模式向“最近邻居”转弯,除非这两个邻居都是等距离的,在这种情况下,这是倒圆的。
static int ROUND_HALF_EVEN
四舍五入模式向“最近邻居”转弯,除非两个邻居都是等距离的,在这种情况下,向着邻居方向转移。
static int ROUND_HALF_UP
四舍五入模式向“最近邻居”转弯,除非两个邻居都是等距的,在这种情况下是圆括弧的。
static int ROUND_UNNECESSARY
舍入模式来确定所请求的操作具有精确的结果,因此不需要舍入。
static int ROUND_UP
舍入模式从零开始。
3,构造方法
BigDecimal(String val)
将BigDecimal的字符串表示 BigDecimal转换为 BigDecimal 。
BigDecimal(BigInteger val)
将 BigInteger转换成 BigDecimal 。
BigDecimal(double val)
将 double转换为 BigDecimal ,这是 double的二进制浮点值的精确十进制表示。
BigDecimal(int val)
将 int成 BigDecimal 。
BigDecimal(long val)
将 long成 BigDecimal 。
4,成员方法
BigDecimal add(BigDecimal augend)
返回 BigDecimal ,其值是 (this + augend) ,其标为 max(this.scale(), augend.scale()) 。
BigDecimal subtract(BigDecimal subtrahend)
返回 BigDecimal ,其值是 (this - subtrahend) ,其标为 max(this.scale(), subtrahend.scale()) 。
BigDecimal multiply(BigDecimal multiplicand)
返回 BigDecimal ,其值是 (this × multiplicand),其标为 (this.scale() + multiplicand.scale()) 。
BigDecimal divide(BigDecimal divisor)
返回BigDecimal ,其值为(this / divisor) ,优先级为(this.scale() - divisor.scale()) ; 如果不能表示确切的商(因为它具有非终止的十进制扩展),则抛出一个ArithmeticException 。
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
返回一个 BigDecimal ,其值为 (this / divisor) ,其比例为指定。
package com.momo.demo;
import java.math.BigDecimal;
/*
- 浮点数在做运算的时候,可以能损失精度,
- 因为浮点数据存储的时候和整数不一样,浮点数都有有效位数
- 为了能够更加精确的计算浮点数,java提供了 BigDecimal
- /
public class Demo1 {public static void main(String[] args) {System.out.println(0.09+0.01);System.out.println(1.0-0.32);System.out.println(1.015100);
System.out.println(1.301/100);
System.out.println("-----------------");
/* BigDecimal bd1 = new BigDecimal("0.09");
BigDecimal bd2 = new BigDecimal("0.01");
BigDecimal bd3 = bd1.add(bd2);
System.out.println(bd3);*/
/* BigDecimal bd1 = new BigDecimal("1.0"); BigDecimal bd2 = new BigDecimal("0.32"); BigDecimal bd3 = bd1.subtract(bd2); System.out.println(bd3);*/ BigDecimal bd1 = new BigDecimal("10"); BigDecimal bd2 = new BigDecimal("3"); BigDecimal bd3 = bd1.divide(bd2,9,BigDecimal.ROUND_CEILING); System.out.println(bd3);
}
}
二,Date
1,概述
-java.util包下的
-表示特定的时间,精确到毫秒值
-Date中很多功能被Calendar和DateFormat两个类给替代了
2,构造方法
Date()
分配一个 Date对象,并初始化它,以便它代表它被分配的时间,测量到最近的毫秒。
Date(long date)
分配一个 Date对象,并将其初始化为表示自称为“时代”的标准基准时间以后的指定毫秒数,即1970年1月1日00:00:00 GMT。
package com.momo.demo;
import java.util.Date;
public class Demo2 {
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);
System.out.println(d.toLocaleString());
Date dd = new Date(65465464555L); System.out.println(dd); }
}
3,成员方法
boolean after(Date when)
测试此日期是否在指定日期之后。
boolean before(Date when)
测试此日期是否在指定日期之前。
static Date from(Instant instant)
从 Instant对象获取一个 Date的实例。
long getTime()
返回自1970年1月1日以来,由此 Date对象表示的00:00:00 GMT的毫秒 数 。
void setTime(long time)
设置此 Date对象以表示1970年1月1日00:00:00 GMT后的 time毫秒的时间点。
package com.momo.demo;
import java.time.Instant;
import java.util.Date;
public class Demo2 {
public static void main(String[] args) {
Date d = new Date();
//d.setTime(64565465465416L);
System.out.println(d);
System.out.println(d.toLocaleString());
Date dd = new Date(65465464555L); System.out.println(dd); System.out.println(d.after(dd)); System.out.println(d.getTime()); // Instant in = d.toInstant(); }
}
三,DateFormat
1,DateFormat是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间
-本身是一个抽象类,无法实例化,但是可以依赖具体子类实现实例化,或者直接创建具体子类对象
来使用
-SimpleDateFormat是一个具体的子类
格式化和解析日期的时候允许我们自定义格式
日期和时间模式:
日期和时间格式由日期和时间模式字符串指定。
在日期和时间模式字符串中,从'A'到'Z'和从'a'
到'z'的非引号的字母被解释为表示日期或时间字符串的组件的模式字母。
y 年
M 月
d 日
H 时
m 分
s 秒
2,构造方法
SimpleDateFormat()
构造一个 SimpleDateFormat使用默认模式
SimpleDateFormat(String pattern)
使用给定模式
3,成员方法
String format(Date date)
将日期格式化成日期-->时间字符串。
Date parse(String source)
从给定字符串的开始解析文本以生成日期。
package com.momo.demo;
import com.momo.utils.DateUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo3 {
public static void main(String[] args) throws ParseException {
/SimpleDateFormat sdf = new SimpleDateFormat();System.out.println(sdf);/
/* SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); System.out.println(sdf);*/ //格式化 //SimpleDateFormat sdf = new SimpleDateFormat();//2023/7/26 上午10:43 // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); /* SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = new Date(); String s = sdf.format(d); System.out.println(s);*/ Date d = new Date(); // System.out.println(DateUtil.DateToString(d, "yyyy-MM-dd HH:mm:ss")); System.out.println(DateUtil.DateToString(d)); //解析 注意:格式要匹配,否则会出现解析异常 ParseException String s = "2023-07-26 10:45:12"; /* // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(s); System.out.println(d);*/ // System.out.println(DateUtil.StringToDate(s, "yyyy-MM-dd")); }
}
package com.momo.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
private DateUtil(){}
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public static Date StringToDate(String s) throws ParseException {
Date d = sdf.parse(s);
return d;
}
public static String DateToString(Date d){ String s = sdf.format(d); return s; }
/* public static Date StringToDate(String s,String regex) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(regex);
Date d = sdf.parse(s);
return d;
}
public static String DateToString(Date d,String regex){ SimpleDateFormat sdf = new SimpleDateFormat(regex); String s = sdf.format(d); return s; }*/
}
4,练习
-键盘输入你的生日,计算从出生到现在已经过了多少天了?
假设你能活到80岁,计算一下还剩多少天?
四,Calendar
1,概述
-Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fields如YEAR ,
MONTH , DAY_OF_MONTH , HOUR ,等等,以及用于操纵该日历字段
- Calendar提供了一种类方法getInstance ,用于获取此类型的一般有用的对象。
-有具体实现类.
2,成员方法
static Calendar getInstance()
使用默认时区和区域设置获取日历。
int get(int field)
返回给定日历字段的值。
void set(int field, int value)
将给定的日历字段设置为给定的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second)
设置字段中的值 YEAR , MONTH , DAY_OF_MONTH , HOUR_OF_DAY , MINUTE和 SECOND 。
void add(int field, int amount)
根据日历的规则,将指定的时间量添加或减去给定的日历字段。
Date getTime()
返回一个 Date表示此物体 Calendar的时间值(毫秒从偏移 Epoch “)。
long getTimeInMillis()
以毫秒为单位返回此日历的时间值。
void setTime(Date date)
使用给定的 Date设置此日历的时间。
void setTimeInMillis(long millis)
从给定的长值设置此日历的当前时间。
package com.momo.demo;
import java.sql.SQLOutput;
import java.util.Calendar;
import java.util.Date;
public class Demo4 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
//System.out.println(c);
// c.setTimeInMillis(564654654);
// c.setTime(new Date(6546544654L));
//c.set(2000,3,10,11,20,11);
/* c.set(Calendar.YEAR,3000); c.set(Calendar.MONTH,2);*/ //c.add(Calendar.MONTH,2); // c.add(Calendar.MONTH,-2); //三年前的今天时什么时候 // c.add(Calendar.YEAR,-3); //10年后的20天前时什么时候 c.add(Calendar.YEAR,10); c.add(Calendar.DATE,-20); System.out.println(c.get(Calendar.YEAR)); System.out.println(c.get(Calendar.MONTH)+1);//0-11 实际值要+1 System.out.println(c.get(Calendar.DATE)); System.out.println(c.get(Calendar.HOUR)); System.out.println(c.get(Calendar.MINUTE)); System.out.println(c.get(Calendar.SECOND)); /* Date d = c.getTime(); System.out.println(d);*/ //System.out.println(c.getTimeInMillis()); }
}
3,练习
-设计一个程序,键盘输入任意一年,输出这一年的2月份有多少天?
package com.momo.demo;
import com.momo.entity.Student;
/*
- 有3个学生对象,要求把学生对象存到数组中,遍历数组,输出学生信息
- 后来又来了一个学生,要存入数组,怎么办?
- 要重新创建数组,长度是之前长度+1,把之前的学生按照顺序存入新数组,然后再把新学生存入数组, 每次都要这样做
- 数组长度一旦确定就固定了,不能改变。
- 如果有一个学生离开了,怎么办?
- 要重新创建数组,长度是之前长度-1,把剩余的学生按照顺序存入新数组, 每次都要这样做
- 为了避免浪费空间,和空指针异常
- 说明:数组不能满足长度不断变化的需求。
- */
public class Demo5 {
public static void main(String[] args) {
// Student[] stus = new Student[3];
Student s1 = new Student("乔峰",35); Student s2 = new Student("虚竹",28); Student s3 = new Student("段誉",20); Student s4 = new Student("阿朱",26);
/* stus[0] = s1;
stus[1] = s2;
stus[2] = s3;*/
//stus[3] = s4; Student[] stus2 = new Student[4]; stus2[0] = s1; stus2[1] = s2; stus2[2] = s3; // stus2[3] = s4; for (int i = 0; i < stus2.length; i++) { Student s = stus2[i]; // System.out.println(s); System.out.println(s.getName()); }
}
}
五,集合
1,概述
-可以存储多个元素的容器,而且长度可变
-为什么会出现集合类?
面向对象语言对事物的体现都是以对象的形式体现的,为了
方便对多个对象进行操作,java就提供了集合。
-我们在存储多个元素的时候,我们可能也会有不同的存储需求(随便存,相同的只能存一个,
存入的元素要求从小到大排序,...)
针对不同的需求,java就提供了不同的集合类,所以就出现了多个集合类。
这多个集合类的数据结构不同(数据的组织方式,数据的存储方式)这个不重要。
重要的是他们都能存储元素(添加,删除,判断,..) 也就是说这多个集合类存储共性内容
java就把他们的共性内容不断的向上提取,最终就形成了java集合的继承体系结构。
在这个继承体系结构中的大哥是Collection
-数组和集合都属于容器,但是他们有不同之处:
数组:可以存储基本类型,也可以存储引用类型,但是长度固定,
集合:只能存储引用类型,但是长度可变。
2,集合特点
-只能存储引用类型,长度可变,一个集合可以存储不同类型的对象(一般也只存一种类型)
六,Collection
1,概述
-是集合体系结构中的根,顶层接口,存储的对象也成为元素
它的子体系中有允许重复的,有不允许重复的,有无序的,有有序的。
-有2大子接口 List 和 Set
2,成员方法
-添加
boolean add(Object e)
确保此集合包含指定的元素(可选操作)。
boolean addAll(Collection c)
将指定集合中的所有元素添加到此集合(可选操作)。
package com.momo.demo;
import com.momo.entity.Student;
import java.util.ArrayList;
import java.util.Collection;
/*
- Collection的添加功能
- */
public class Demo6 {
public static void main(String[] args) {
//接口多态
Collection c = new ArrayList();
System.out.println(c);
c.add("momo");
c.add("帅哥");
c.add(true);
c.add(12.3);
c.add(123);
// c.add(Integer.valueOf(123));//自动装箱
c.add(new Student("aaa",18));
System.out.println(c);
Collection c2 = new ArrayList(); c2.add("momo"); c2.add(123); System.out.println(c2.addAll(c)); System.out.println(c2);
}
}
-删除
void clear()
从此集合中删除所有元素(可选操作)。
boolean remove(Object o)
从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
boolean removeAll(Collection c)
删除指定集合中包含的所有此集合的元素(可选操作)。
package com.momo.demo;
import java.util.ArrayList;
import java.util.Collection;
/*
- Collection 删除功能
- */
public class Demo7 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("momo");
c.add("帅哥");
c.add(true);
c.add(12.3);
c.add(123);
System.out.println(c);
/* //移除123 System.out.println(c.remove(123)); System.out.println(c); //移除321 System.out.println(c.remove(321)); System.out.println(c);*/ /* c.clear(); System.out.println(c);*/ //boolean removeAll(Collection<?> c) 只要移除一个就叫移除返回值就是true,如果没有一个被移除,返回false Collection c2 = new ArrayList(); c2.add("momo"); c2.add("帅哥"); c2.add(true); c2.add(22); System.out.println(c2); System.out.println(c.removeAll(c2)); System.out.println(c); System.out.println(c2);
}
}
-判断
boolean contains(Object o)
如果此集合包含指定的元素,则返回 true 。
boolean containsAll(Collection c)
如果此集合包含指定 集合中的所有元素,则返回true。
boolean equals(Object o)
将指定的对象与此集合进行比较以获得相等性。
boolean isEmpty()
如果此集合不包含元素,则返回 true 。
package com.momo.demo;
import java.util.ArrayList;
import java.util.Collection;
/*
- Collection 判断功能
- */
public class Demo8 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("momo");
c.add("帅哥");
c.add(true);
c.add(12.3);
c.add(123);
System.out.println(c);
/* Collection c2 = new ArrayList();
c2.add("momo");
c2.add("帅哥");
c2.add(true);
// c2.add(12.3);
c2.add(123);
System.out.println(c2);
System.out.println(c.equals(c2));*/ /* System.out.println(c.contains(123)); System.out.println(c.contains(321));*/ /* System.out.println(c.isEmpty()); c.clear(); System.out.println(c.isEmpty());*/ // c = null; 只有具体对象才能调用方法 // System.out.println(c.isEmpty());NullPointerException //boolean containsAll(Collection<?> c) 包含所有才叫包含 Collection c2 = new ArrayList(); c2.add("momo"); c2.add("帅哥"); c2.add(true); c2.add(666); System.out.println(c2); System.out.println(c.containsAll(c2)); }
}
-获取功能
Iterator iterator()
返回此集合中的元素的迭代器。
int size()
返回此集合中的元素数。
package com.momo.demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
- Collection 获取功能
- */
public class Demo9 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("momo");
c.add("帅哥");
c.add(true);
c.add(12.3);
c.add(123);
System.out.println(c);
System.out.println(c.size()); /* * Iterator<E> iterator() 返回此集合中的元素的迭代器。 集合特有的遍历方式 本身是接口,方法肯定返回该接口具体实现类对象 * boolean hasNext() 如果迭代具有更多元素,则返回 true 。 E next() 返回迭代中的下一个元素。 * */ Iterator it = c.iterator(); /* System.out.println(it.hasNext()); System.out.println(it.next()); System.out.println(it.hasNext()); System.out.println(it.next()); System.out.println(it.hasNext()); System.out.println(it.next()); System.out.println(it.hasNext()); System.out.println(it.next()); System.out.println(it.hasNext()); System.out.println(it.next()); System.out.println(it.hasNext());
// System.out.println(it.next());NoSuchElementException 没有这样的元素异常*/
while (it.hasNext()){ System.out.println(it.next()); }
}
}
-交集
boolean retainAll(Collection c) 交集:2个集合中都有的元素
仅保留此集合中包含在指定集合中的元素(可选操作)。
package com.momo.demo;
import java.util.ArrayList;
import java.util.Collection;
/*
- Collection 交集功能
- */
public class Demo10 {
public static void main(String[] args) {
//boolean retainAll(Collection c) 获取2个集合中相同的内容,把相同的内容保存到调用方法的集合中
//返回值返回的是调用方法的集合有没有发生过变化
Collection c = new ArrayList();
c.add("momo");
c.add("帅哥");
c.add(true);
c.add(123);
System.out.println(c);
Collection c2 = new ArrayList(); /* c2.add("momo"); c2.add("帅哥");*/ c2.add(666);
/* c2.add("momo");
c2.add("帅哥");
c2.add(true);*/
// c2.add(123);
// c2.add("momo"); /* c2.add("帅哥"); c2.add(true); c2.add(123);*/ System.out.println(c2); System.out.println(c.retainAll(c2)); System.out.println(c); System.out.println(c2); }
}
-转换
Object[] toArray()
返回一个包含此集合中所有元素的数组。
package com.momo.demo;
import java.util.ArrayList;
import java.util.Collection;
/*
- Collection 转换功能
- */
public class Demo11 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("momo");
c.add("帅哥");
c.add(true);
c.add(123);
System.out.println(c);
Object[] objs = c.toArray(); for (int i = 0; i < objs.length; i++) { System.out.println(objs[i]); }
}
}
3,Collection集合的遍历:依次获取集合种的每一个元素
(存储字符串遍历, 存储自定义对象并遍历)
-2种遍历方式
转数组
迭代器
package com.momo.demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
- Collection集合的遍历
- */
public class Demo12 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("aaa");
c.add("bbb");
c.add("ccc");
c.add("ddd");
System.out.println(c);
/* Object[] objs = c.toArray(); for (int i = 0; i < objs.length; i++) { // System.out.println(objs[i]); Object o = objs[i]; // System.out.println(o); //输出每个元素的长度 *//* * 找不到符号 符号: 方法 length() Object种没有length方法 * 向下转型 * *//* //System.out.println(o.length()); String s = (String)o; System.out.println(s); System.out.println(s.length()); }*/ Iterator it = c.iterator(); while (it.hasNext()){ Object o = it.next(); String s = (String)o; System.out.println(s); System.out.println(s.length()); }
}
}
-练习:存储自定义对象并遍历(2种方式)