1.SimpleDateFormatTest
1.1概念
日期格式化:用于Date对象和指定格式字符串之间的转换
java.test.SimpleDateFormatTest
把对象转换为指定格式的字符串
解析:把指定格式的字符串,获取一个对象(Date)
1.2字符串
日期和字符串相互转换,必须指定字符串的格式: 如xxxx-xx-xx
需使用SimpleDateFormat当中定义好的一些字母来表示时间参数
年 y
月 M
日 d
星期 E
时 H
分 m
秒 s
1.3方法
//==========================构造方法==============================================
1.SimpleDateFormat(String pattern) 使用给定模式 SimpleDateFormat并使用默认的 FORMAT语言环境的默认日期格式符号。
//===========================格式化方法===========================================
1.String format(Date date): 把参数date对象转化为指定格式的字符串
//===========================解析方法============================================
1.Date parse(String source) throws ParseExcepton: 把字符串参数转化为Daet对象, 必须和指定格式相同
练习
public class SimpleDateFormatTest {
public static void main(String[] args) throws ParseException {
Date date = new Date();
//格式:xxxx-xx-xx xx:xx:xx
//创建模式:使用预定以的字符表示
String strDate = "yyyy-MM-dd HH:mm:ss";
//创建SimpleDateFormat对象关联模式
SimpleDateFormat sim = new SimpleDateFormat(strDate);
//使用格式化方法
String str = sim.format(date);//2021-09-02 10:49:59
System.out.println(str);
String strDate2 = "2020-09-02 10:49:59";
Date date2 = sim.parse(strDate2);//Wed Sep 02 10:49:59 CST 2020
System.out.println(date2);
}
}
注意
1.创建SimpleDateFormat: 必须关联一个字符串模式; 其中用预定义的字母来表示时间参数
2.调用SimpleDateFormat的parse必须在方法上声明添加throws ParseException
2.Calendar
2.1概念
日历类:用于弥补java.util.Date类而创建的用于实现国际化的描述的时间类
java.util.Date时完全按照美国人对时间描述而创建的类: 与地球上其他民族描述的时间不一样
设计:为例满足国际化,把相关时间的参数整合到一起
2.2方法
public class CalendarTest {
public static void main(String[] args) {
//Calendar类时抽象的,通过静态方法getInstance()获取子类对象
Calendar c1 = Calendar.getInstance();//多态
//java.util.GregorianCalendar[time=1630552380622,areFieldsSet=true,areAllFieldsSet=true,lenient=true,
// zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,
// transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=8,
// WEEK_OF_YEAR=36,WEEK_OF_MONTH=1,DAY_OF_MONTH=2,DAY_OF_YEAR=245,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,
// AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=13,SECOND=0,MILLISECOND=622,ZONE_OFFSET=28800000,DST_OFFSET=0]
System.out.println(c1);
//方法:
//1.Calendar.getInstance()
// 1.abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。
// boolean after(Object when) 返回 Calendar是否 Calendar指定时间之后的时间 Object 。
// boolean before(Object when) 返回此 Calendar是否 Calendar指定的时间之前指定的时间 Object 。
//3.设置和获取时间参数,通过静态变量来表示时间参数
// int get(int field) 返回给定日历字段的值
// void set(int field, int value) 将给定的日历字段设置为给定的值
print(c1);
c1.set(Calendar.YEAR, 2001);
print(c1);
//设置年月日
//void set(int year, int month, int date) 设置日历字段中的值 YEAR , MONTH和 DAY_OF_MONTH 。
//void set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段中的值 YEAR , MONTH , DAY_OF_MONTH , HOUR_OF_DAY和 MINUTE 。
c1.set(2000, 11-1,11,10,9,8);
print(c1);
//5.设置指定添加值
//abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段
c1.add(Calendar.YEAR, 2);
print(c1);
//6.Date getTime() 返回一个 Date表示此物体 Calendar的时间值(毫秒从偏移 Epoch “)。
//void setTime(Date date) 使用给定的 Date设置此日历的时间。
//7.日历和毫秒值的转换
// void setTimeInMillis(long millis) 从给定的长值设置此日历的当前时间。
// abstract int getMinimum(int field) 返回此 Calendar实例的给定日历字段的 Calendar 。
}
public static void print(Calendar c) {
//获取时间参数
int year = c.get(Calendar.YEAR);
int mon = c.get(Calendar.MONTH) + 1;
int day = c.get(Calendar.DAY_OF_MONTH);
String str = year + "年" + mon + "月" + day + "日";
System.out.println(str);
}
}
abstract class MyDate{
void myDate() {
}
static MyDate getDate() {
return new MyCalendar();
}
}
class MyCalendar extends MyDate{
}
3.集合
3.1概念
和数组相同, 都是容器:
装任意个数个引用数据类型数据的容器
- 集合和数组的区别
数组 : 装指定个数个相同类型的数据的容器
集合 : 装任意个数个引用数据类型数据的容器
相同之处: 都是容器, 用于装多个数据
不同之处: (1)数组创建后长度不能变
集合元素是可变的
(2)数组中的元素类型必须一致
集合当中的元素类型可以不同
(3)数据的元素类型可以是任意的 : 基本数据类型 / 引用数据类型
集合的元素类型只能是引用数据类型
(4)数组中的元素不赋值, 有默认值
集合的元素没有默认值
- 集合框架
由多个接口和实现类组成
集合框架结构:
Collection: 接口 单列集合的顶层接口
List: 子接口 有序列表
ArrayList: 实现类: 底层是长度可变的数组的实现. 查询和更改效率高, 增和删效率低
Vector: 实现类: 方法和底层和ArrayList相同(线程安全的,相比于ArrayList效率低)
LinkedList: 实现类: 底层是双向链表, 查询和更改慢, 插入和删除高
Set接口: 子接口 : 不重复列表
HashSet: 实现类: 无序,不重复列表
TreeSet: 实现类: 有序,不重复列表
Map: 接口 双列集合的顶层接口--.每次增删改查,需要有键值对(键不能重复)
HashMap: 实现类: 键和值都可以为null(线程不安全的)
HashTable: 实现类: 键和值都不能为null(线程安全的)
3.2Collection
注意:Collection是单列集合的顶层接口: 其方法是所有子接口的共同方法
public class CollectionTest {
public static void main(String[] args) {
// //添加
// boolean add(E e) 确保此集合包含指定的元素(可选操作)。
// boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合(可选操作)。
Collection coll = new ArrayList();
coll.add(123);
coll.add("312");
coll.add(new Date());
Collection coll1 = new ArrayList();
coll1.add(123);
coll1.add("312");
//判断
// boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 。
// boolean containsAll(Collection<?> c) 如果此集合包含指定 集合中的所有元素,则返回true。
// boolean isEmpty() 如果此集合不包含元素,则返回 true 。
System.out.println(coll.containsAll(coll1));
// //删除
// boolean remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
// boolean removeAll(Collection<?> c) 删除指定集合中包含的所有此集合的元素(可选操作)。
// void clear() 从此集合中删除所有元素(可选操作)。
// coll.remove(123);//集合中有多个相同元素,只删除第一个
// coll.removeAll(coll1);//删除
// //获取
// int size() 返回此集合中的元素数。
// Iterator<E> iterator() 返回此集合中的元素的迭代器。
// 方法:hasNext() / next()
//一次性的, 第二次遍历需要重新创建
//Object[] toArray() 返回一个包含此集合中所有元素的数组。
//集合重点: 1.集合特点 2.遍历方式
//1.遍历方式
for(Object obj : coll) {
System.out.println(obj);
}
System.out.println("==================");
//2.遍历方式:转化为数组来进行遍历
Object[] arr = coll.toArray();
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("====================");
//3.遍历方式:使用迭代器
Iterator iterator = coll.iterator();
while(iterator.hasNext()) {
Object obj = iterator.next();//获取元素
System.out.println(obj);
}
}
}
3.3 ArrayList
- 概念
底层是可变长度数组的实现:
单列集合, 元素有下标, 查询和修改效率高
- 特有方法
public class ArrayListTest {
public static void main(String[] args) {
//ArrayList特有方法(比Collection多的)
//void add(int index, E element) 在此列表中的指定位置插入指定的元素。
//E get(int index) 返回此列表中指定位置的元素。
//int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
//int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
//E remove(int index) 删除该列表中指定位置的元素。
//E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
ArrayList list = new ArrayList();
list.add(123);
list.add(321);
list.add("123");
list.add(new Date());
list.add(1);//在末尾添加元素
list.add(1,"333");//在指定位置添加
int indexOf = list.indexOf(123);
System.out.println(indexOf);
System.out.println(list.remove(0));
//遍历ArrayList的4种方法
//1.foreach循环
//2.通过toArray方法获取数组,遍历数组
//3.通过迭代器
//4.通过下标获取元素
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
3.4 HashSet
Set接口实现类: 不重复
HashSet: 不重复, 无序, 线程不安全, 可以有null值
- 方法
全继承于Collection的方法, 无特有方法
- HashSet元素不重复的原理
public class HashSetTest {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add(new Teacher("张三",'男',1000));
set.add(new Teacher("张三",'男',1010));
set.add(new Teacher("张四",'女',1000));
set.add(new Teacher("张四",'男',1050));
set.add(new Teacher("张五",'男',1100));
set.add(new Teacher("张六",'男',990));
set.add(new Teacher("张七",'男',1000));
set.add(new Teacher("张三",'女',1010));
//遍历
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Object obj = iterator.next();
System.out.println(obj);
}
}
}
class Teacher{
private String name;
private char sex;
private int salary;
public Teacher() {
}
public Teacher(String name, char sex, int salary) {
this.name = name;
this.sex = sex;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = salary % 5;
return result;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Teacher) {
Teacher teacher = (Teacher)obj;
int n = Math.abs((this.salary - teacher.salary));
if(this.name.equals(teacher.name) && this.sex == teacher.sex && n < 100 ) {
return true;
}else {
return false;
}
}
return false;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", sex=" + sex + ", salary=" + salary + "]";
}
}
- 原理分析
调用set.add(obj)时,怎么保证元素唯一
1.先调用obj的hashCode方法,获取其hashCode值
2.如果此hashCode值 与set中其他所有元素比较是唯一的 直接添加成功
3.如果此hashCode值 与set中其他所有元素中的n个元素 hashCode值相同
4.调用obj1的equals方法与这n个相同hashCode值的元素 分别做比较
5.只用当调用的n次equals方法都返回false 才允许添加 只要有一个返回true 则添加失败