java enum compare_90.java基础6高级阶段2(日期/枚举类/Compare方法/list)

79.java8之前的时间日历

package com.atguigu.java;

import org.junit.Test;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

/**

* jdk 8之前的日期时间的API测试

* 1. System类中currentTimeMillis();

* 2. java.util.Date和子类java.sql.Date

* 3. SimpleDateFormat

* 4. Calendar

* @author shkstart

* @create 2019 上午 11:35

*/

public class DateTimeTest {

/*

SimpleDateFormat的使用:SimpleDateFormat对日期Date类的格式化和解析

1.两个操作:

1.1 格式化:日期 --->字符串

1.2 解析:格式化的逆过程,字符串 ---> 日期

2.SimpleDateFormat的实例化

*/

@Test

public void testSimpleDateFormat() throws ParseException {

//实例化SimpleDateFormat:使用默认的构造器

SimpleDateFormat sdf = new SimpleDateFormat();

//格式化:日期 --->字符串

Date date = new Date();

System.out.println(date);

String format = sdf.format(date);

System.out.println(format);

//解析:格式化的逆过程,字符串 ---> 日期

String str = "19-12-18 上午11:43";

Date date1 = sdf.parse(str);

System.out.println(date1);

//*************按照指定的方式格式化和解析:调用带参的构造器*****************

// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

//格式化

String format1 = sdf1.format(date);

System.out.println(format1);//2019-02-18 11:48:27

//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),

//否则,抛异常

Date date2 = sdf1.parse("2020-02-18 11:48:27");

System.out.println(date2);

}

/*

练习一:字符串"2020-09-08"转换为java.sql.Date

练习二:"三天打渔两天晒网" 1990-01-01 xxxx-xx-xx 打渔?晒网?

举例:2020-09-08 ? 总天数

总天数 % 5 == 1,2,3 : 打渔

总天数 % 5 == 4,0 : 晒网

总天数的计算?

方式一:( date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1

方式二:1990-01-01 --> 2019-12-31 + 2020-01-01 -->2020-09-08

*/

@Test

public void testExer() throws ParseException {

String birth = "2020-09-08";

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");

Date date = sdf1.parse(birth);

// System.out.println(date);

java.sql.Date birthDate = new java.sql.Date(date.getTime());

System.out.println(birthDate);

}

/*

Calendar日历类(抽象类)的使用

*/

@Test

public void testCalendar() {

//1.实例化

//方式一:创建其子类(GregorianCalendar)的对象

//方式二:调用其静态方法getInstance()

Calendar calendar = Calendar.getInstance();

// System.out.println(calendar.getClass());

//2.常用方法

//get()

int days = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(days);

System.out.println(calendar.get(Calendar.DAY_OF_YEAR));

//set()

//calendar可变性

calendar.set(Calendar.DAY_OF_MONTH, 22);

days = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(days);

//add()

calendar.add(Calendar.DAY_OF_MONTH, -3);

days = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(days);

//getTime():日历类---> Date

Date date = calendar.getTime();

System.out.println(date);

//setTime():Date ---> 日历类

Date date1 = new Date();

calendar.setTime(date1);

days = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(days);

}

}

80.java8之后的时间日历类

package com.atguigu.java;

import org.junit.Test;

import java.time.*;

import java.time.format.DateTimeFormatter;

import java.time.format.FormatStyle;

import java.time.temporal.TemporalAccessor;

import java.util.Date;

/**

* jdk 8中日期时间API的测试

* @author shkstart

* @create 2019 下午 2:44

*/

public class JDK8DateTimeTest {

@Test

public void testDate(){

//偏移量

Date date1 = new Date(2020 - 1900,9 - 1,8);

System.out.println(date1);//Tue Sep 08 00:00:00 GMT+08:00 2020

}

/*

LocalDate、LocalTime、LocalDateTime 的使用

说明:

1.LocalDateTime相较于LocalDate、LocalTime,使用频率要高

2.类似于Calendar

*/

@Test

public void test1(){

//now():获取当前的日期、时间、日期+时间

LocalDate localDate = LocalDate.now();

LocalTime localTime = LocalTime.now();

LocalDateTime localDateTime = LocalDateTime.now();

System.out.println(localDate);

System.out.println(localTime);

System.out.println(localDateTime);

//of():设置指定的年、月、日、时、分、秒。没有偏移量

LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43);

System.out.println(localDateTime1);

//getXxx():获取相关的属性

System.out.println(localDateTime.getDayOfMonth());

System.out.println(localDateTime.getDayOfWeek());

System.out.println(localDateTime.getMonth());

System.out.println(localDateTime.getMonthValue());

System.out.println(localDateTime.getMinute());

//体现不可变性

//withXxx():设置相关的属性

LocalDate localDate1 = localDate.withDayOfMonth(22);

System.out.println(localDate);

System.out.println(localDate1);

LocalDateTime localDateTime2 = localDateTime.withHour(4);

System.out.println(localDateTime);

System.out.println(localDateTime2);

//不可变性

LocalDateTime localDateTime3 = localDateTime.plusMonths(3);

System.out.println(localDateTime);

System.out.println(localDateTime3);

LocalDateTime localDateTime4 = localDateTime.minusDays(6);

System.out.println(localDateTime);

System.out.println(localDateTime4);

}

/*

Instant的使用

类似于 java.util.Date类

*/

@Test

public void test2(){

//now():获取本初子午线对应的标准时间

Instant instant = Instant.now();

System.out.println(instant);//2019-02-18T07:29:41.719Z

//添加时间的偏移量

OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));

System.out.println(offsetDateTime);//2019-02-18T15:32:50.611+08:00

//toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数 ---> Date类的getTime()

long milli = instant.toEpochMilli();

System.out.println(milli);

//ofEpochMilli():通过给定的毫秒数,获取Instant实例 -->Date(long millis)

Instant instant1 = Instant.ofEpochMilli(1550475314878L);

System.out.println(instant1);

}

/*

DateTimeFormatter:格式化或解析日期、时间

类似于SimpleDateFormat

*/

@Test

public void test3(){

// 方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME

DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

//格式化:日期-->字符串

LocalDateTime localDateTime = LocalDateTime.now();

String str1 = formatter.format(localDateTime);

System.out.println(localDateTime);

System.out.println(str1);//2019-02-18T15:42:18.797

//解析:字符串 -->日期

TemporalAccessor parse = formatter.parse("2019-02-18T15:42:18.797");

System.out.println(parse);

// 方式二:

// 本地化相关的格式。如:ofLocalizedDateTime()

// FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime

DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);

//格式化

String str2 = formatter1.format(localDateTime);

System.out.println(str2);//2019年2月18日 下午03时47分16秒

// 本地化相关的格式。如:ofLocalizedDate()

// FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate

DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);

//格式化

String str3 = formatter2.format(LocalDate.now());

System.out.println(str3);//2019-2-18

// 重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");

//格式化

String str4 = formatter3.format(LocalDateTime.now());

System.out.println(str4);//2019-02-18 03:52:09

//解析

TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");

System.out.println(accessor);

}

}

81.java自定义比较Compare:

package com.atguigu.java;

/**

* 商品类

* @author shkstart

* @create 2019 下午 4:52

*/

public class Goods implements Comparable{

private String name;

private double price;

public Goods() {

}

public Goods(String name, double price) {

this.name = name;

this.price = price;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

@Override

public String toString() {

return "Goods{" +

"name='" + name + '\'' +

", price=" + price +

'}';

}

//指明商品比较大小的方式:按照价格从低到高排序,再按照产品名称从高到低排序

@Override

public int compareTo(Object o) {

// System.out.println("**************");

if(o instanceof Goods){

Goods goods = (Goods)o;

//方式一:

if(this.price > goods.price){

return 1;

}else if(this.price < goods.price){

return -1;

}else{

// return 0;

return -this.name.compareTo(goods.name);

}

//方式二:

// return Double.compare(this.price,goods.price);

}

// return 0;

throw new RuntimeException("传入的数据类型不一致!");

}

}

----------------------------------------------------------------------------------

package com.atguigu.java;

import org.junit.Test;

import java.util.Arrays;

import java.util.Comparator;

/**

* 一、说明:Java中的对象,正常情况下,只能进行比较:== 或 != 。不能使用 > 或 < 的

* 但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。

* 如何实现?使用两个接口中的任何一个:Comparable 或 Comparator

* 二、Comparable接口与Comparator的使用的对比:

* Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。

* Comparator接口属于临时性的比较。

*thor shkstart

* @create 2019 下午 4:41

*/

public class CompareTest {

/*

Comparable接口的使用举例: 自然排序

1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。

2.像String、包装类重写compareTo()方法以后,进行了从小到大的排列

3. 重写compareTo(obj)的规则:

如果当前对象this大于形参对象obj,则返回正整数,

如果当前对象this小于形参对象obj,则返回负整数,

如果当前对象this等于形参对象obj,则返回零。

4. 对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。

在compareTo(obj)方法中指明如何排序

*/

@Test

public void test1(){

String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};

//

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));

}

@Test

public void test2(){

Goods[] arr = new Goods[5];

arr[0] = new Goods("lenovoMouse",34);

arr[1] = new Goods("dellMouse",43);

arr[2] = new Goods("xiaomiMouse",12);

arr[3] = new Goods("huaweiMouse",65);

arr[4] = new Goods("microsoftMouse",43);

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));

}

/*

Comparator接口的使用:定制排序

1.背景:

当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,

或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,

那么可以考虑使用 Comparator 的对象来排序

2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:

如果方法返回正整数,则表示o1大于o2;

如果返回0,表示相等;

返回负整数,表示o1小于o2。

*/

@Test

public void test3(){

String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};

Arrays.sort(arr,new Comparator(){

//按照字符串从大到小的顺序排列

@Override

public int compare(Object o1, Object o2) {

if(o1 instanceof String && o2 instanceof String){

String s1 = (String) o1;

String s2 = (String) o2;

return -s1.compareTo(s2);

}

// return 0;

throw new RuntimeException("输入的数据类型不一致");

}

});

System.out.println(Arrays.toString(arr));

}

@Test

public void test4(){

Goods[] arr = new Goods[6];

arr[0] = new Goods("lenovoMouse",34);

arr[1] = new Goods("dellMouse",43);

arr[2] = new Goods("xiaomiMouse",12);

arr[3] = new Goods("huaweiMouse",65);

arr[4] = new Goods("huaweiMouse",224);

arr[5] = new Goods("microsoftMouse",43);

Arrays.sort(arr, new Comparator() {

//指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序

@Override

public int compare(Object o1, Object o2) {

if(o1 instanceof Goods && o2 instanceof Goods){

Goods g1 = (Goods)o1;

Goods g2 = (Goods)o2;

if(g1.getName().equals(g2.getName())){

return -Double.compare(g1.getPrice(),g2.getPrice());

}else{

return g1.getName().compareTo(g2.getName());

}

}

throw new RuntimeException("输入的数据类型不一致");

}

});

System.out.println(Arrays.toString(arr));

}

}

82.java 系统类System:

package com.atguigu.java;

import org.junit.Test;

import java.util.Arrays;

import java.util.Comparator;

/**

* 一、说明:Java中的对象,正常情况下,只能进行比较:== 或 != 。不能使用 > 或 < 的

* 但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。

* 如何实现?使用两个接口中的任何一个:Comparable 或 Comparator

* 二、Comparable接口与Comparator的使用的对比:

* Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。

* Comparator接口属于临时性的比较。

*thor shkstart

* @create 2019 下午 4:41

*/

public class CompareTest {

/*

Comparable接口的使用举例: 自然排序

1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。

2.像String、包装类重写compareTo()方法以后,进行了从小到大的排列

3. 重写compareTo(obj)的规则:

如果当前对象this大于形参对象obj,则返回正整数,

如果当前对象this小于形参对象obj,则返回负整数,

如果当前对象this等于形参对象obj,则返回零。

4. 对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。

在compareTo(obj)方法中指明如何排序

*/

@Test

public void test1(){

String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};

//

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));

}

@Test

public void test2(){

Goods[] arr = new Goods[5];

arr[0] = new Goods("lenovoMouse",34);

arr[1] = new Goods("dellMouse",43);

arr[2] = new Goods("xiaomiMouse",12);

arr[3] = new Goods("huaweiMouse",65);

arr[4] = new Goods("microsoftMouse",43);

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));

}

/*

Comparator接口的使用:定制排序

1.背景:

当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,

或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,

那么可以考虑使用 Comparator 的对象来排序

2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:

如果方法返回正整数,则表示o1大于o2;

如果返回0,表示相等;

返回负整数,表示o1小于o2。

*/

@Test

public void test3(){

String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};

Arrays.sort(arr,new Comparator(){

//按照字符串从大到小的顺序排列

@Override

public int compare(Object o1, Object o2) {

if(o1 instanceof String && o2 instanceof String){

String s1 = (String) o1;

String s2 = (String) o2;

return -s1.compareTo(s2);

}

// return 0;

throw new RuntimeException("输入的数据类型不一致");

}

});

System.out.println(Arrays.toString(arr));

}

@Test

public void test4(){

Goods[] arr = new Goods[6];

arr[0] = new Goods("lenovoMouse",34);

arr[1] = new Goods("dellMouse",43);

arr[2] = new Goods("xiaomiMouse",12);

arr[3] = new Goods("huaweiMouse",65);

arr[4] = new Goods("huaweiMouse",224);

arr[5] = new Goods("microsoftMouse",43);

Arrays.sort(arr, new Comparator() {

//指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序

@Override

public int compare(Object o1, Object o2) {

if(o1 instanceof Goods && o2 instanceof Goods){

Goods g1 = (Goods)o1;

Goods g2 = (Goods)o2;

if(g1.getName().equals(g2.getName())){

return -Double.compare(g1.getPrice(),g2.getPrice());

}else{

return g1.getName().compareTo(g2.getName());

}

}

throw new RuntimeException("输入的数据类型不一致");

}

});

System.out.println(Arrays.toString(arr));

}

}

83.java枚举类:

-------------------------------------java5.0之前---------------------------------------------

package com.atguigu.java;

/**

* 一、枚举类的使用

* 1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类

* 2.当需要定义一组常量时,强烈建议使用枚举类

* 3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。

* 二、如何定义枚举类

* 方式一:jdk5.0之前,自定义枚举类

* 方式二:jdk5.0,可以使用enum关键字定义枚举类

* 三、Enum类中的常用方法:

* values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

* valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。

* toString():返回当前枚举类对象常量的名称

* 四、使用enum关键字定义的枚举类实现接口的情况

* 情况一:实现接口,在enum类中实现抽象方法

* 情况二:让枚举类的对象分别实现接口中的抽象方法

* @author shkstart

* @create 2019 上午 10:17

*/

public class SeasonTest {

public static void main(String[] args) {

Season spring = Season.SPRING;

System.out.println(spring);

}

}

//自定义枚举类

class Season{

//1.声明Season对象的属性:private final修饰

private final String seasonName;

private final String seasonDesc;

//2.私有化类的构造器,并给对象属性赋值

private Season(String seasonName,String seasonDesc){

this.seasonName = seasonName;

this.seasonDesc = seasonDesc;

}

//3.提供当前枚举类的多个对象:public static final的

public static final Season SPRING = new Season("春天","春暖花开");

public static final Season SUMMER = new Season("夏天","夏日炎炎");

public static final Season AUTUMN = new Season("秋天","秋高气爽");

public static final Season WINTER = new Season("冬天","冰天雪地");

//4.其他诉求1:获取枚举类对象的属性

public String getSeasonName() {

return seasonName;

}

public String getSeasonDesc() {

return seasonDesc;

}

//4.其他诉求1:提供toString()

@Override

public String toString() {

return "Season{" +

"seasonName='" + seasonName + '\'' +

", seasonDesc='" + seasonDesc + '\'' +

'}';

}

}

-------------------------------------java5.0之后---------------------------------------------

package com.atguigu.java;

/**

* 使用enum关键字定义枚举类

* 说明:定义的枚举类默认继承于java.lang.Enum类

* @author shkstart

* @create 2019 上午 10:35

*/

public class SeasonTest1 {

public static void main(String[] args) {

Season1 summer = Season1.SUMMER;

//toString():返回枚举类对象的名称

System.out.println(summer.toString());

// System.out.println(Season1.class.getSuperclass());

System.out.println("****************");

//values():返回所有的枚举类对象构成的数组

Season1[] values = Season1.values();

for(int i = 0;i < values.length;i++){

System.out.println(values[i]);

values[i].show();

}

System.out.println("****************");

Thread.State[] values1 = Thread.State.values();

for (int i = 0; i < values1.length; i++) {

System.out.println(values1[i]);

}

//valueOf(String objName):返回枚举类中对象名是objName的对象。

Season1 winter = Season1.valueOf("WINTER");

//如果没有objName的枚举类对象,则抛异常:IllegalArgumentException

// Season1 winter = Season1.valueOf("WINTER1");

System.out.println(winter);

winter.show();

}

}

interface Info{

void show();

}

//使用enum关键字枚举类

enum Season1 implements Info{

//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束

SPRING("春天","春暖花开"){

@Override

public void show() {

System.out.println("春天在哪里?");

}

},

SUMMER("夏天","夏日炎炎"){

@Override

public void show() {

System.out.println("宁夏");

}

},

AUTUMN("秋天","秋高气爽"){

@Override

public void show() {

System.out.println("秋天不回来");

}

},

WINTER("冬天","冰天雪地"){

@Override

public void show() {

System.out.println("大约在冬季");

}

};

//2.声明Season对象的属性:private final修饰

private final String seasonName;

private final String seasonDesc;

//2.私有化类的构造器,并给对象属性赋值

private Season1(String seasonName,String seasonDesc){

this.seasonName = seasonName;

this.seasonDesc = seasonDesc;

}

//4.其他诉求1:获取枚举类对象的属性

public String getSeasonName() {

return seasonName;

}

public String getSeasonDesc() {

return seasonDesc;

}

// //4.其他诉求1:提供toString()

//

// @Override

// public String toString() {

// return "Season1{" +

// "seasonName='" + seasonName + '\'' +

// ", seasonDesc='" + seasonDesc + '\'' +

// '}';

// }

// @Override //如果在这里定义所有的对象共用一show方法

// public void show() {

// System.out.println("这是一个季节");

// }

}

84.java注解:

package com.atguigu.java1;

import org.junit.Test;

import java.lang.annotation.Annotation;

import java.util.ArrayList;

import java.util.Date;

/**

* 注解的使用

* 1. 理解Annotation:

* ① jdk 5.0 新增的功能

* ② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation,

* 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。

* ③在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android

* 中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗

* 代码和XML配置等。

* 2. Annocation的使用示例

* 示例一:生成文档相关的注解

* 示例二:在编译时进行格式检查(JDK内置的三个基本注解)

@Override: 限定重写父类方法, 该注解只能用于方法

@Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择

@SuppressWarnings: 抑制编译器警告

* 示例三:跟踪代码依赖性,实现替代配置文件功能

* 3. 如何自定义注解:参照@SuppressWarnings定义

* ① 注解声明为:@interface

* ② 内部定义成员,通常使用value表示

* ③ 可以指定成员的默认值,使用default定义

* ④ 如果自定义注解没有成员,表明是一个标识作用。

如果注解有成员,在使用注解时,需要指明成员的值。

自定义注解必须配上注解的信息处理流程(使用反射)才有意义。

自定义注解通过都会指明两个元注解:Retention、Target

4. jdk 提供的4种元注解

元注解:对现有的注解进行解释说明的注解

Retention:指定所修饰的 Annotation 的生命周期:SOURCE\CLASS(默认行为)\RUNTIME

只有声明为RUNTIME生命周期的注解,才能通过反射获取。

Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素

*******出现的频率较低*******

Documented:表示所修饰的注解在被javadoc解析时,保留下来。

Inherited:被它修饰的 Annotation 将具有继承性。

5.通过反射获取注解信息 ---到反射内容时系统讲解

6. jdk 8 中注解的新特性:可重复注解、类型注解

6.1 可重复注解:① 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class

② MyAnnotation的Target和Retention等元注解与MyAnnotations相同。

6.2 类型注解:

ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)。

ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。

* @author shkstart

* @create 2019 上午 11:37

*/

public class AnnotationTest {

public static void main(String[] args) {

Person p = new Student();

p.walk();

Date date = new Date(2020, 10, 11);

System.out.println(date);

@SuppressWarnings("unused")

int num = 10;

// System.out.println(num);

@SuppressWarnings({ "unused", "rawtypes" })

ArrayList list = new ArrayList();

}

@Test

public void testGetAnnotation(){

Class clazz = Student.class;

Annotation[] annotations = clazz.getAnnotations();

for(int i = 0;i < annotations.length;i++){

System.out.println(annotations[i]);

}

}

}

//jdk 8之前的写法:

//@MyAnnotations({@MyAnnotation(value="hi"),@MyAnnotation(value="hi")})

@MyAnnotation(value="hi")

@MyAnnotation(value="abc")

class Person{

private String name;

private int age;

public Person() {

}

@MyAnnotation

public Person(String name, int age) {

this.name = name;

this.age = age;

}

@MyAnnotation

public void walk(){

System.out.println("人走路");

}

public void eat(){

System.out.println("人吃饭");

}

}

interface Info{

void show();

}

class Student extends Person implements Info{

@Override

public void walk() {

System.out.println("学生走路");

}

public void show() {

}

}

class Generic{

public void show() throws @MyAnnotation RuntimeException{

ArrayList list = new ArrayList<>();

int num = (@MyAnnotation int) 10L;

}

}

---------------------------------------------------------------------------------------

package com.atguigu.java1;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;

/**

*

* @author shkstart

* @create 2019 下午 2:41

*/

@Inherited

@Retention(RetentionPolicy.RUNTIME)

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

public @interface MyAnnotations {

MyAnnotation[] value();

}

-------------------------------------------------------------------------------------------

package com.atguigu.java1;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.*;

/**

* @author shkstart

* @create 2019 上午 11:56

*/

@Inherited

@Repeatable(MyAnnotations.class)

@Retention(RetentionPolicy.RUNTIME)

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})

public @interface MyAnnotation {

String value() default "hello";

}

85.java集合:

package com.atguigu.java2;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Date;

/**

* 一、集合框架的概述

* 1.集合、数组都是对多个数据进行存储操作的结构,简称Java容器。

* 说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)

* 2.1 数组在存储多个数据方面的特点:

* > 一旦初始化以后,其长度就确定了。

* > 数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了。

* 比如:String[] arr;int[] arr1;Object[] arr2;

* 2.2 数组在存储多个数据方面的缺点:

* > 一旦初始化以后,其长度就不可修改。

* > 数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。

* > 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用

* > 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。

* 二、集合框架

* |----Collection接口:单列集合,用来存储一个一个的对象

* |----List接口:存储有序的、可重复的数据。 -->“动态”数组

* |----ArrayList、LinkedList、Vector

* |----Set接口:存储无序的、不可重复的数据 -->高中讲的“集合”

* |----HashSet、LinkedHashSet、TreeSet

* |----Map接口:双列集合,用来存储一对(key - value)一对的数据 -->高中函数:y = f(x)

* |----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

* 三、Collection接口中的方法的使用

* @author shkstart

* @create 2019 下午 4:08

*/

public class CollectionTest {

@Test

public void test1(){

Collection coll = new ArrayList();

//add(Object e):将元素e添加到集合coll中

coll.add("AA");

coll.add("BB");

coll.add(123);//自动装箱

coll.add(new Date());

//size():获取添加的元素的个数

System.out.println(coll.size());//4

//addAll(Collection coll1):将coll1集合中的元素添加到当前的集合中

Collection coll1 = new ArrayList();

coll1.add(456);

coll1.add("CC");

coll.addAll(coll1);

System.out.println(coll.size());//6

System.out.println(coll);

//clear():清空集合元素

coll.clear();

//isEmpty():判断当前集合是否为空

System.out.println(coll.isEmpty());

}

}

----------------------------------------------------------------------------------------

package com.atguigu.java;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collection;

import java.util.List;

/**

* Collection接口中声明的方法的测试

* 结论:

* 向Collection接口的实现类的对象中添加数据obj时,要求obj所在类要重写equals().

* @author shkstart

* @create 2019 上午 10:04

*/

public class CollectionTest {

@Test

public void test1(){

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

// Person p = new Person("Jerry",20);

// coll.add(p);

coll.add(new Person("Jerry",20));

coll.add(new String("Tom"));

coll.add(false);

//1.contains(Object obj):判断当前集合中是否包含obj(但是在基本数据类型和String类型时调用的是他们自己的equales方法)

//我们在判断时会调用obj对象所在类的equals()。

boolean contains = coll.contains(123);

System.out.println(contains);

System.out.println(coll.contains(new String("Tom")));

// System.out.println(coll.contains(p));//true

System.out.println(coll.contains(new Person("Jerry",20)));//false -->true

//2.containsAll(Collection coll1):判断形参coll1中的所有元素是否都存在于当前集合中。

Collection coll1 = Arrays.asList(123,4567);

System.out.println(coll.containsAll(coll1));

}

@Test

public void test2(){

//3.remove(Object obj):从当前集合中移除obj元素。

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

coll.add(new Person("Jerry",20));

coll.add(new String("Tom"));

coll.add(false);

coll.remove(1234); //返回boolean类型的值

System.out.println(coll);

//删除时同样会调用equales方法

coll.remove(new Person("Jerry",20));

System.out.println(coll);

//4. removeAll(Collection coll1):差集:从当前集合中移除coll1中所有的元素。

Collection coll1 = Arrays.asList(123,456);

coll.removeAll(coll1);

System.out.println(coll);

}

@Test

public void test3(){

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

coll.add(new Person("Jerry",20));

coll.add(new String("Tom"));

coll.add(false);

//5.retainAll(Collection coll1):交集:获取当前集合和coll1集合的交集,并返回给当前集合

// Collection coll1 = Arrays.asList(123,456,789);

// coll.retainAll(coll1);

// System.out.println(coll);

//6.equals(Object obj):要想返回true,需要当前集合和形参集合的元素都相同。

Collection coll1 = new ArrayList();

coll1.add(456);

coll1.add(123);

coll1.add(new Person("Jerry",20));

coll1.add(new String("Tom"));

coll1.add(false);

System.out.println(coll.equals(coll1));

}

@Test

public void test4(){

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

coll.add(new Person("Jerry",20));

coll.add(new String("Tom"));

coll.add(false);

//7.hashCode():返回当前对象的哈希值

System.out.println(coll.hashCode());

//8.集合 --->数组:toArray()

Object[] arr = coll.toArray();

for(int i = 0;i < arr.length;i++){

System.out.println(arr[i]);

}

//拓展:数组 --->集合:调用Arrays类的静态方法asList()

List list = Arrays.asList(new String[]{"AA", "BB", "CC"});

System.out.println(list);

List arr1 = Arrays.asList(new int[]{123, 456});

System.out.println(arr1.size());//1

List arr2 = Arrays.asList(new Integer[]{123, 456});

System.out.println(arr2.size());//2

//9.iterator():返回Iterator接口的实例,用于遍历集合元素。放在IteratorTest.java中测试

}

}

-------------------------------------------------------------------------------------

package com.atguigu.java;

import java.util.Objects;

/**

* @author shkstart

* @create 2019 上午 10:06

*/

public class Person {

private String name;

private int age;

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Person{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

@Override

public boolean equals(Object o) {

System.out.println("Person equals()....");

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

Person person = (Person) o;

return age == person.age &&

Objects.equals(name, person.name);

}

@Override

public int hashCode() {

return Objects.hash(name, age);

}

}

86.java 迭代器iterator:

package com.atguigu.java;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Iterator;

/**

* 集合元素的遍历操作,使用迭代器Iterator接口

* 1.内部的方法:hasNext() 和 next()

* 2.集合对象每次调用iterator()方法都得到一个全新的迭代器对象,

* 默认游标都在集合的第一个元素之前。

* 3.内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()

* @author shkstart

* @create 2019 上午 10:44

*/

public class IteratorTest {

@Test

public void test1(){

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

coll.add(new Person("Jerry",20));

coll.add(new String("Tom"));

coll.add(false);

Iterator iterator = coll.iterator();

//方式一:

// System.out.println(iterator.next());

// System.out.println(iterator.next());

// System.out.println(iterator.next());

// System.out.println(iterator.next());

// System.out.println(iterator.next());

// //报异常:NoSuchElementException

// System.out.println(iterator.next());

//方式二:不推荐

// for(int i = 0;i < coll.size();i++){

// System.out.println(iterator.next());

// }

//方式三:推荐

hasNext():判断是否还有下一个元素

while(iterator.hasNext()){

//next():①指针下移 ②将下移以后集合位置上的元素返回

System.out.println(iterator.next());

}

}

@Test

public void test2(){

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

coll.add(new Person("Jerry",20));

coll.add(new String("Tom"));

coll.add(false);

//错误方式一:

// Iterator iterator = coll.iterator();

// while((iterator.next()) != null){

// System.out.println(iterator.next());

// }

//错误方式二:

//集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。

while (coll.iterator().hasNext()){

System.out.println(coll.iterator().next());

}

}

//测试Iterator中的remove()

//如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,

// 再调用remove都会报IllegalStateException。

@Test

public void test3(){

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

coll.add(new Person("Jerry",20));

coll.add(new String("Tom"));

coll.add(false);

//删除集合中"Tom"

Iterator iterator = coll.iterator();

while (iterator.hasNext()){

// iterator.remove();

Object obj = iterator.next();

if("Tom".equals(obj)){

iterator.remove();

// iterator.remove();

}

}

//遍历集合

iterator = coll.iterator();

while (iterator.hasNext()){

System.out.println(iterator.next());

}

}

}

87.java 增强for循环

package com.atguigu.java;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Collection;

/**

* jdk 5.0 新增了foreach循环,用于遍历集合、数组

* @author shkstart

* @create 2019 上午 11:24

*/

public class ForTest {

@Test

public void test1(){

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

coll.add(new Person("Jerry",20));

coll.add(new String("Tom"));

coll.add(false);

//for(集合元素的类型 局部变量 : 集合对象)

//内部仍然调用了迭代器。

for(Object obj : coll){

System.out.println(obj);

}

}

@Test

public void test2(){

int[] arr = new int[]{1,2,3,4,5,6};

//for(数组元素的类型 局部变量 : 数组对象)

for(int i : arr){

System.out.println(i);

}

}

//练习题

@Test

public void test3(){

String[] arr = new String[]{"MM","MM","MM"};

// //方式一:普通for赋值

// for(int i = 0;i < arr.length;i++){

// arr[i] = "GG";

// }

//方式二:增强for循环

for(String s : arr){

s = "GG";

}

for(int i = 0;i < arr.length;i++){

System.out.println(arr[i]);

}

}

}

88.java list实现类

package com.atguigu.java;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Iterator;

import java.util.List;

/**

* 1. List接口框架

* |----Collection接口:单列集合,用来存储一个一个的对象

* |----List接口:存储有序的、可重复的数据。 -->“动态”数组,替换原有的数组

* |----ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储

* |----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储

* |----Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

* 2. ArrayList的源码分析:

* 2.1 jdk 7情况下

* ArrayList list = new ArrayList();//底层创建了长度是10的Object[]数组elementData

* list.add(123);//elementData[0] = new Integer(123);

* ...

* list.add(11);//如果此次的添加导致底层elementData数组容量不够,则扩容。

* 默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。

* 结论:建议开发中使用带参的构造器:ArrayList list = new ArrayList(int capacity)

* 2.2 jdk 8中ArrayList的变化:

* ArrayList list = new ArrayList();//底层Object[] elementData初始化为{}.并没有创建长度为10的数组

* list.add(123);//第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到elementData[0]

* ...

* 后续的添加和扩容操作与jdk 7 无异。

* 2.3 小结:jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象

* 的创建类似于单例的懒汉式,延迟了数组的创建,节省内存。

* 3. LinkedList的源码分析:

* LinkedList list = new LinkedList(); 内部声明了Node类型的first和last属性,默认值为null

* list.add(123);//将123封装到Node中,创建了Node对象。

* 其中,Node定义为:体现了LinkedList的双向链表的说法

* private static class Node {

E item;

Node next;

Node prev;

Node(Node prev, E element, Node next) {

this.item = element;

this.next = next;

this.prev = prev;

}

}

* 4. Vector的源码分析:jdk7和jdk8中通过Vector()构造器创建对象时,底层都创建了长度为10的数组。

* 在扩容方面,默认扩容为原来的数组长度的2倍。

* 面试题:ArrayList、LinkedList、Vector三者的异同?

* 同:三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据

* 不同:见上

* 5. List接口中的常用方法

* @author shkstart

* @create 2019 上午 11:39

*/

public class ListTest {

/*

void add(int index, Object ele):在index位置插入ele元素

boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来

Object get(int index):获取指定index位置的元素

int indexOf(Object obj):返回obj在集合中首次出现的位置

int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置

Object remove(int index):移除指定index位置的元素,并返回此元素

Object set(int index, Object ele):设置指定index位置的元素为ele

List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合

总结:常用方法

增:add(Object obj)

删:remove(int index) / remove(Object obj)

改:set(int index, Object ele)

查:get(int index)

插:add(int index, Object ele)

长度:size()

遍历:① Iterator迭代器方式

② 增强for循环

③ 普通的循环

*/

@Test

public void test3(){

ArrayList list = new ArrayList();

list.add(123);

list.add(456);

list.add("AA");

//方式一:Iterator迭代器方式

Iterator iterator = list.iterator();

while(iterator.hasNext()){

System.out.println(iterator.next());

}

System.out.println("***************");

//方式二:增强for循环

for(Object obj : list){

System.out.println(obj);

}

System.out.println("***************");

//方式三:普通for循环

for(int i = 0;i < list.size();i++){

System.out.println(list.get(i));

}

}

@Test

public void test2(){

ArrayList list = new ArrayList();

list.add(123);

list.add(456);

list.add("AA");

list.add(new Person("Tom",12));

list.add(456);

//int indexOf(Object obj):返回obj在集合中首次出现的位置。如果不存在,返回-1.

int index = list.indexOf(4567);

System.out.println(index);

//int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置。如果不存在,返回-1.

System.out.println(list.lastIndexOf(456));

//Object remove(int index):移除指定index位置的元素,并返回此元素

Object obj = list.remove(0);

System.out.println(obj);

System.out.println(list);

//Object set(int index, Object ele):设置指定index位置的元素为ele

list.set(1,"CC");

System.out.println(list);

//List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的左闭右开区间的子集合

List subList = list.subList(2, 4);

System.out.println(subList);

System.out.println(list);

}

@Test

public void test1(){

ArrayList list = new ArrayList();

list.add(123);

list.add(456);

list.add("AA");

list.add(new Person("Tom",12));

list.add(456);

System.out.println(list);

//void add(int index, Object ele):在index位置插入ele元素

list.add(1,"BB");

System.out.println(list);

//boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来

List list1 = Arrays.asList(1, 2, 3);

list.addAll(list1);

// list.add(list1);

System.out.println(list.size());//9

//Object get(int index):获取指定index位置的元素

System.out.println(list.get(0));

}

}

--------------------------------------练习------------------------------------

package com.atguigu.exer;

import org.junit.Test;

import java.util.ArrayList;

import java.util.List;

/**

* @author shkstart

* @create 2019 下午 3:33

*/

public class ListExer {

/*

区分List中remove(int index)和remove(Object obj)

*/

@Test

public void testListRemove() {

List list = new ArrayList();

list.add(1);

list.add(2);

list.add(3);

updateList(list);

System.out.println(list);//

}

private void updateList(List list) {

// list.remove(2);

list.remove(new Integer(2));

}

}

//java array到Arraylist的转换

@Test

public void test4(){

Function f1 = new Function() {

@Override

public String[] apply(Integer integer) {

return new String[integer];

}

};

Function f2 = i -> new String[i];

System.out.println(f2);

Function f3 = String[] :: new;

String[] list1 = f3.apply(5);

//1.先通过Arrays将Array转换为List的内部类ArrayList

List list2 = Arrays.asList(list1);

// list2.add("123"); //报错,由于Arrays.asList返回的是Arrays内部的ArrayList,所以不能进行java.util.Arrays的方法

//2.接着通过ArrayList的构造器,重新生成一个java.utils下面的ArrayList对象,之后就可以进行操作了

ArrayList list3 = new ArrayList<>(list2);

list3.add("123");

System.out.println(list3.toString());

}

89.java set实现类

---------------------------------------------hashset和linkhashset---------------------------------------

package com.atguigu.java1;

import org.junit.Test;

import java.util.HashSet;

import java.util.Iterator;

import java.util.LinkedHashSet;

import java.util.Set;

/**

* 1. Set接口的框架:

* |----Collection接口:单列集合,用来存储一个一个的对象

* |----Set接口:存储无序的、不可重复的数据 -->高中讲的“集合”

* |----HashSet:作为Set接口的主要实现类;线程不安全的;可以存储null值

* |----LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历

* 对于频繁的遍历操作,LinkedHashSet效率高于HashSet.

* |----TreeSet:可以按照添加对象的指定属性,进行排序。

* 1. Set接口中没有额外定义新的方法,使用的都是Collection中声明过的方法。

* 2. 要求:向Set(主要指:HashSet、LinkedHashSet)中添加的数据,其所在的类一定要重写hashCode()和equals()

* 要求:重写的hashCode()和equals()尽可能保持一致性:相等的对象必须具有相等的散列码

* 重写两个方法的小技巧:对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值。

* @author shkstart

* @create 2019 下午 3:40

*/

public class SetTest {

/*

一、Set:存储无序的、不可重复的数据

以HashSet为例说明:

1. 无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。

2. 不可重复性:保证添加的元素按照equals()判断时,不能返回true.即:相同的元素只能添加一个。

二、添加元素的过程:以HashSet为例:

我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,

此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断

数组此位置上是否已经有元素:

如果此位置上没有其他元素,则元素a添加成功。 --->情况1

如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:

如果hash值不相同,则元素a添加成功。--->情况2

如果hash值相同,进而需要调用元素a所在类的equals()方法:

equals()返回true,元素a添加失败

equals()返回false,则元素a添加成功。--->情况2

对于添加成功的情况2和情况3而言:元素a 与已经存在指定索引位置上数据以链表的方式存储。

jdk 7 :元素a放到数组中,指向原来的元素。

jdk 8 :原来的元素在数组中,指向元素a

总结:七上八下

HashSet底层:数组+链表的结构。

*/

@Test

public void test1(){

Set set = new HashSet();

set.add(456);

set.add(123);

set.add(123);

set.add("AA");

set.add("CC");

set.add(new User("Tom",12));

set.add(new User("Tom",12));

set.add(129);

Iterator iterator = set.iterator();

while(iterator.hasNext()){

System.out.println(iterator.next());

}

}

//LinkedHashSet的使用

//LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个

//数据和后一个数据。

//优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet

@Test

public void test2(){

Set set = new LinkedHashSet();

set.add(456);

set.add(123);

set.add(123);

set.add("AA");

set.add("CC");

set.add(new User("Tom",12));

set.add(new User("Tom",12));

set.add(129);

Iterator iterator = set.iterator();

while(iterator.hasNext()){

System.out.println(iterator.next());

}

}

}

-------------------------------------------treeset-----------------------------------------

package com.atguigu.java1;

import org.junit.Test;

import java.util.Comparator;

import java.util.Iterator;

import java.util.TreeSet;

/**

* @author shkstart

* @create 2019 下午 4:59

*/

public class TreeSetTest {

/*

1.向TreeSet中添加的数据,要求是相同类的对象。

2.两种排序方式:自然排序(实现Comparable接口) 和 定制排序(Comparator)

3.自然排序中,比较两个对象是否相同的标准为:compareTo()返回0.不再是equals().

4.定制排序中,比较两个对象是否相同的标准为:compare()返回0.不再是equals().

*/

@Test

public void test1(){

TreeSet set = new TreeSet();

//失败:不能添加不同类的对象

// set.add(123);

// set.add(456);

// set.add("AA");

// set.add(new User("Tom",12));

//举例一:

// set.add(34);

// set.add(-34);

// set.add(43);

// set.add(11);

// set.add(8);

//举例二:

set.add(new User("Tom",12));

set.add(new User("Jerry",32));

set.add(new User("Jim",2));

set.add(new User("Mike",65));

set.add(new User("Jack",33));

set.add(new User("Jack",56));

Iterator iterator = set.iterator();

while(iterator.hasNext()){

System.out.println(iterator.next());

}

}

@Test

public void test2(){

Comparator com = new Comparator() {

//按照年龄从小到大排列

@Override

public int compare(Object o1, Object o2) {

if(o1 instanceof User && o2 instanceof User){

User u1 = (User)o1;

User u2 = (User)o2;

return Integer.compare(u1.getAge(),u2.getAge());

}else{

throw new RuntimeException("输入的数据类型不匹配");

}

}

};

TreeSet set = new TreeSet(com);

set.add(new User("Tom",12));

set.add(new User("Jerry",32));

set.add(new User("Jim",2));

set.add(new User("Mike",65));

set.add(new User("Mary",33));

set.add(new User("Jack",33));

set.add(new User("Jack",56));

Iterator iterator = set.iterator();

while(iterator.hasNext()){

System.out.println(iterator.next());

}

}

}

-------------------------------------------------------------------------------------

package com.atguigu.java1;

/**

* @author shkstart

* @create 2019 下午 3:56

*/

public class User implements Comparable{

private String name;

private int age;

public User() {

}

public User(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "User{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

@Override

public boolean equals(Object o) {

System.out.println("User equals()....");

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

User user = (User) o;

if (age != user.age) return false;

return name != null ? name.equals(user.name) : user.name == null;

}

@Override

public int hashCode() { //return name.hashCode() + age;

int result = name != null ? name.hashCode() : 0;

result = 31 * result + age;

return result;

}

//按照姓名从大到小排列,年龄从小到大排列

@Override

public int compareTo(Object o) {

if(o instanceof User){

User user = (User)o;

// return -this.name.compareTo(user.name);

int compare = -this.name.compareTo(user.name);

if(compare != 0){

return compare;

}else{

return Integer.compare(this.age,user.age);

}

}else{

throw new RuntimeException("输入的类型不匹配");

}

}

}

90.java Treeset练习

#############################################练习一

package com.atguigu.exer1;

/**

* MyDate类包含:

private成员变量year,month,day;并为每一个属性定义 getter, setter 方法;

* @author shkstart

* @create 2019 上午 10:21

*/

public class MyDate implements Comparable{

private int year;

private int month;

private int day;

public MyDate(int year, int month, int day) {

this.year = year;

this.month = month;

this.day = day;

}

public MyDate() {

}

public int getYear() {

return year;

}

public void setYear(int year) {

this.year = year;

}

public int getMonth() {

return month;

}

public void setMonth(int month) {

this.month = month;

}

public int getDay() {

return day;

}

public void setDay(int day) {

this.day = day;

}

@Override

public String toString() {

return "MyDate{" +

"year=" + year +

", month=" + month +

", day=" + day +

'}';

}

@Override

public int compareTo(Object o) {

if(o instanceof MyDate){

MyDate m = (MyDate)o;

//比较年

int minusYear = this.getYear() - m.getYear();

if(minusYear != 0){

return minusYear;

}

//比较月

int minusMonth = this.getMonth() - m.getMonth();

if(minusMonth != 0){

return minusMonth;

}

//比较日

return this.getDay() - m.getDay();

}

throw new RuntimeException("传入的数据类型不一致!");

}

}

------------------------------------------------------------------------------------

package com.atguigu.exer1;

/**

* 定义一个Employee类。

该类包含:private成员变量name,age,birthday,其中 birthday 为 MyDate 类的对象;

并为每一个属性定义 getter, setter 方法;

并重写 toString 方法输出 name, age, birthday

* @author shkstart

* @create 2019 上午 10:22

*/

public class Employee implements Comparable{

private String name;

private int age;

private MyDate birthday;

public Employee(String name, int age, MyDate birthday) {

this.name = name;

this.age = age;

this.birthday = birthday;

}

public Employee() {

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public MyDate getBirthday() {

return birthday;

}

public void setBirthday(MyDate birthday) {

this.birthday = birthday;

}

@Override

public String toString() {

return "Employee{" +

"name='" + name + '\'' +

", age=" + age +

", birthday=" + birthday +

'}';

}

//按 name 排序

@Override

public int compareTo(Object o) {

if(o instanceof Employee){

Employee e = (Employee)o;

return this.name.compareTo(e.name);

}

// return 0;

throw new RuntimeException("传入的数据类型不一致!");

}

}

---------------------------------------------------------------------------------------------

package com.atguigu.exer1;

import org.junit.Test;

import java.util.Comparator;

import java.util.Iterator;

import java.util.TreeSet;

/**

* 创建该类的 5 个对象,并把这些对象放入 TreeSet 集合中(下一章:TreeSet 需使用泛型来定义)

分别按以下两种方式对集合中的元素进行排序,并遍历输出:

1). 使Employee 实现 Comparable 接口,并按 name 排序

2). 创建 TreeSet 时传入 Comparator对象,按生日日期的先后排序。

* @author shkstart

* @create 2019 上午 10:23

*/

public class EmployeeTest {

//问题二:按生日日期的先后排序。

@Test

public void test2(){

TreeSet set = new TreeSet(new Comparator() {

@Override

public int compare(Object o1, Object o2) {

if(o1 instanceof Employee && o2 instanceof Employee){

Employee e1 = (Employee)o1;

Employee e2 = (Employee)o2;

MyDate b1 = e1.getBirthday();

MyDate b2 = e2.getBirthday();

//方式一:

// //比较年

// int minusYear = b1.getYear() - b2.getYear();

// if(minusYear != 0){

// return minusYear;

// }

// //比较月

// int minusMonth = b1.getMonth() - b2.getMonth();

// if(minusMonth != 0){

// return minusMonth;

// }

// //比较日

// return b1.getDay() - b2.getDay();

//方式二:

return b1.compareTo(b2);

}

// return 0;

throw new RuntimeException("传入的数据类型不一致!");

}

});

Employee e1 = new Employee("liudehua",55,new MyDate(1965,5,4));

Employee e2 = new Employee("zhangxueyou",43,new MyDate(1987,5,4));

Employee e3 = new Employee("guofucheng",44,new MyDate(1987,5,9));

Employee e4 = new Employee("liming",51,new MyDate(1954,8,12));

Employee e5 = new Employee("liangzhaowei",21,new MyDate(1978,12,4));

set.add(e1);

set.add(e2);

set.add(e3);

set.add(e4);

set.add(e5);

Iterator iterator = set.iterator();

while (iterator.hasNext()){

System.out.println(iterator.next());

}

}

//问题一:使用自然排序

@Test

public void test1(){

TreeSet set = new TreeSet();

Employee e1 = new Employee("liudehua",55,new MyDate(1965,5,4));

Employee e2 = new Employee("zhangxueyou",43,new MyDate(1987,5,4));

Employee e3 = new Employee("guofucheng",44,new MyDate(1987,5,9));

Employee e4 = new Employee("liming",51,new MyDate(1954,8,12));

Employee e5 = new Employee("liangzhaowei",21,new MyDate(1978,12,4));

set.add(e1);

set.add(e2);

set.add(e3);

set.add(e4);

set.add(e5);

Iterator iterator = set.iterator();

while (iterator.hasNext()){

System.out.println(iterator.next());

}

}

}

#############################################练习二,List去重

public static List list1(List l1){

HashSet set1 = new HaseSet();

set1.addAll(l1);

return new ArrayList(set);

}

public static void main(String[] arg){

List list1 = new ArrayList();

list1.add(new Interger(1));

list1.add(new Interger(2));

list1.add(new Interger(3));

list1.add(new Interger(4));

list1.add(new Interger(4));

list list2 = list1(list1);L

for(Object o: list2){

System.out.println(o);

}

}

#############################################练习二,List去重

package com.atguigu.exer;

/**

* @author shkstart

* @create 2019 上午 10:50

*/

public class Person {

int id;

String name;

public Person(int id, String name) {

this.id = id;

this.name = name;

}

public Person() {

}

@Override

public String toString() {

return "Person{" +

"id=" + id +

", name='" + name + '\'' +

'}';

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

Person person = (Person) o;

if (id != person.id) return false;

return name != null ? name.equals(person.name) : person.name == null;

}

@Override

public int hashCode() {

int result = id;

result = 31 * result + (name != null ? name.hashCode() : 0);

return result;

}

}

------------------------------------------------------------------------

package com.atguigu.exer;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashSet;

import java.util.List;

/**

* @author shkstart

* @create 2019 上午 9:36

*/

public class CollectionTest {

@Test

public void test1(){

Collection coll = new ArrayList();

coll.add(123);

coll.add(456);

coll.add(343);

coll.add(343);

coll.forEach(System.out::println);

}

//练习:在List内去除重复数字值,要求尽量简单

public static List duplicateList(List list) {

HashSet set = new HashSet();

set.addAll(list);

return new ArrayList(set);

}

@Test

public void test2(){

List list = new ArrayList();

list.add(new Integer(1));

list.add(new Integer(2));

list.add(new Integer(2));

list.add(new Integer(4));

list.add(new Integer(4));

List list2 = duplicateList(list);

for (Object integer : list2) {

System.out.println(integer);

}

}

@Test

public void test3(){

HashSet set = new HashSet();

Person p1 = new Person(1001,"AA");

Person p2 = new Person(1002,"BB");

set.add(p1);

set.add(p2);

System.out.println(set); //[Person{id=1002, name='BB'}, Person{id=1001, name='AA'}]

p1.name = "CC";

set.remove(p1);

// 由于p1的name被设置为了cc,这个时候,删除元素是先进行hashCode方法,发现p1的hashCode位置上没有元素,所以就没有删除

System.out.println(set); //[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}]

set.add(new Person(1001,"CC"));

//可以添加成功的原因的p1的name是后面改的(它的位置是p1 name=AA的地址),所以上面这句hashCode之后发现位置没有元素,所以添加成功

System.out.println(set); // [Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}]

set.add(new Person(1001,"AA"));

//这里可以添加成功的原因是,hashCode之后,p1被name被给为CC的上面,新加的name进行比较(equals)之后发现不相等,所以可以添加

System.out.println(set); // [Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1001, name='AA'}]

}

}

```**------------恢复内容开始------------**

## 79.java8之前的时间日历

```java

package com.atguigu.java;

import org.junit.Test;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

/**

* jdk 8之前的日期时间的API测试

* 1. System类中currentTimeMillis();

* 2. java.util.Date和子类java.sql.Date

* 3. SimpleDateFormat

* 4. Calendar

* @author shkstart

* @create 2019 上午 11:35

*/

public class DateTimeTest {

/*

SimpleDateFormat的使用:SimpleDateFormat对日期Date类的格式化和解析

1.两个操作:

1.1 格式化:日期 --->字符串

1.2 解析:格式化的逆过程,字符串 ---> 日期

2.SimpleDateFormat的实例化

*/

@Test

public void testSimpleDateFormat() throws ParseException {

//实例化SimpleDateFormat:使用默认的构造器

SimpleDateFormat sdf = new SimpleDateFormat();

//格式化:日期 --->字符串

Date date = new Date();

System.out.println(date);

String format = sdf.format(date);

System.out.println(format);

//解析:格式化的逆过程,字符串 ---> 日期

String str = "19-12-18 上午11:43";

Date date1 = sdf.parse(str);

System.out.println(date1);

//*************按照指定的方式格式化和解析:调用带参的构造器*****************

// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

//格式化

String format1 = sdf1.format(date);

System.out.println(format1);//2019-02-18 11:48:27

//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),

//否则,抛异常

Date date2 = sdf1.parse("2020-02-18 11:48:27");

System.out.println(date2);

}

/*

练习一:字符串"2020-09-08"转换为java.sql.Date

练习二:"三天打渔两天晒网" 1990-01-01 xxxx-xx-xx 打渔?晒网?

举例:2020-09-08 ? 总天数

总天数 % 5 == 1,2,3 : 打渔

总天数 % 5 == 4,0 : 晒网

总天数的计算?

方式一:( date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1

方式二:1990-01-01 --> 2019-12-31 + 2020-01-01 -->2020-09-08

*/

@Test

public void testExer() throws ParseException {

String birth = "2020-09-08";

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");

Date date = sdf1.parse(birth);

// System.out.println(date);

java.sql.Date birthDate = new java.sql.Date(date.getTime());

System.out.println(birthDate);

}

/*

Calendar日历类(抽象类)的使用

*/

@Test

public void testCalendar() {

//1.实例化

//方式一:创建其子类(GregorianCalendar)的对象

//方式二:调用其静态方法getInstance()

Calendar calendar = Calendar.getInstance();

// System.out.println(calendar.getClass());

//2.常用方法

//get()

int days = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(days);

System.out.println(calendar.get(Calendar.DAY_OF_YEAR));

//set()

//calendar可变性

calendar.set(Calendar.DAY_OF_MONTH, 22);

days = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(days);

//add()

calendar.add(Calendar.DAY_OF_MONTH, -3);

days = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(days);

//getTime():日历类---> Date

Date date = calendar.getTime();

System.out.println(date);

//setTime():Date ---> 日历类

Date date1 = new Date();

calendar.setTime(date1);

days = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(days);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值