Map集合概述
- 双列集合每一个元素包括两个值key和value,两者数据类型可以相同,也可以不用
- key不可以重复,value可以重复
- key和value一一对应
Map常用子类
- HashMap:无序集合,底层是哈希表。当存储自定义类型键值,需要重写toString和equals方法。
- LinkedHashMap:HashMap的子类,有序集合,存储和取出顺序相同。
Map常用方法
1 | public static void main(String[] args) { |
1 | public static void main(String[] args) { |
对已有类型排序
1 | public static void main(String[] args) { |
对自定义类型排序:对Comparable重写定义排序规则:this-参数(升序)
1 | public class Person implements Comparable{ |
1 | Collections.sort(list, new Comparator<Person>() { |
使用前提
当方法的参数列表数据类型已经确定,但是参数的个数不确定就可以使用可变参数
使用格式
修饰符 返回值 方法名称(数据类型…变量名){ }
原理
可变参数的底层是一个数组,根据传递参数个数不同创建不同长度的数组,来存储这些参数。参数个数可以从0开始
1 | public static void main(String[] args) { |
注意事项
一个方法的参数列表只能有一个可变参数,如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
1 | public class GenericClass <E> { |
1 | public class GenericClass{ |
1 | public interface GenericInterface<I> { |
1 | public static void main(String[] args) { |
泛型的上限:只接受该类型及其子类
类型名 <? extends 类 > 对象名称
泛型的下限:只接受该类型极其父类
类型名 <? super 类 > 对象名称
常用方法
public E next():返回迭代的下一个元素
public boolean hasNext():如果有元素可以迭代,返回true
1 | public static void main(String[] args) { |
格式
for(元素的数据类型 变量 :Collection集合or数组){ ……… }
1 | public static void main(String[] args) { |
获取当前系统时间到1970.1.1 08:00:00(中国)经历了多少毫秒
1 | System.out.println(System.currentTimeMillis()); |
将日期对象转换为毫秒
1 | date.getTime() |
Date date = new Date();//获取当前系统时间
System.out.println(date);
1
2
3
4
5
6
7
* 带参构造:传毫秒值
```java
Date date1 = new Date(0);
System.out.println(date1);
//Thu Jan 01 08:00:00 CST 1970
DateFormat
是一个抽象类,无法直接创建对象使用,可以使用其子类SimpleDateFormat
模式中常用格式规则:y(年)、M(月)、d(日)、H(时)、m(分)、s(秒)
eg. yyyy-MM-dd HH:mm:ss 或者 yyyy年MM月dd日 HH时mm分ss秒
格式化:按照指定的模式,将日期转换成文本String format (Date date)
1 | public static void main(String[] args) { |
Date parse(String source)
,若参数source不符合模式则会产生异常。1 | public static void main(String[] args) throws ParseException { |
Calendar类是一个抽象类,里面提供了很多操作日历字段的方法(YEAR,MONTH,DAY_OF_MONTH,HOUR,MINUTE,SECOND)
Calendar类无法直接创建对象使用,里面有一个静态方法叫**getInstance()**,该方法返回了Calendar类的子类对象。
static Calendar getInstance()
使用默认时区和语言环境获得一个日历
1 | Calendar calendar = Calendar.getInstance();//获取一个日历对象 |
1 | public static void main(String[] args) { |
基本格式
修饰符 class 外部类名称{
修饰符 class 外部类名称{
}
}
内部类可以随意访问外部类,外部类访问内部则需要内部类对象
使用方式
间接方式:在外部类的方法当中使用内部类;然后再main中调用外部类的方法
直接方式:
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
1 | public class Myclass {//外部类 |
1 | public class Outer { |
定义在方法内部,只有当前所属的方法才可以用
局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final值
原因:new出来的对象在堆内存中,局部变量随着方法存在栈内存中。方法运行结束之后,立刻出栈,局部变量就会立刻消失。但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。
1 | public class Outer { |
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下可以省略点该类的定义,而改为使用匿名内部类
定义格式
接口名称 对象名 = new 接口名称(){
//覆盖重写所有抽象方法
}
1 | public interface MyInterface { |
定义一个类的时候权限修饰符
public > protected > (default) > private
外部类:public / (default)
内部类:public / protected / (default) / private
局部内部类:什么都不写
final关键字代表最终、不可改变的
可以用来修饰类、方法、局部变量、成员变量
父类引用指向子类对象
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();
访问成员变量的方式
直接通过对象名称访问成员变量,优先等号左边,没有就向上找
间接通过成员方法访问:(子类不重写时)同理
1 | public class Fu { |
运行结果
1 | 子类方法 |
1 | public static void main(String[] args) { |
接口是一种公共的规范标准,是一种引用数据类型。
定义规则
public interface 接口名称 { }
接口内容可以包括:常量、抽象方法、默认方法、静态方法、私有方法等
接口中的抽象方法,修饰符必须是public abstract,也可选择性的忽略
接口没有静态代码块和构造方法
接口不能直接使用,必须有一个实现类来实现该接口。
实现类必须覆盖重写接口的所有的抽象方法,如果没有全部实现,那么这个实现类必须是抽象类
public class 实现类名称 implements 父类
1 | public interface MyinterfaceAbs { |
当接口中新添加一个抽象方法时,会影响其他实现类。接口当中的默认方法可以解决接口升级的问题,默认方法会被实现类继承,也可被覆盖重写
public default 返回值类型 方法名称(参数名称){ 方法体 }
1 | public default void methoddefault(){ |
当需要抽取一个公有方法,用来解决两个默认方法之间的重复代码的问题。但是这个代码不应该让实现类使用,应该是私有化的
普通私有方法:解决多个默认方法之间重复代码问题
private 返回值类型 方法名称(参数名称){ 方法体 }
静态私有方法:解决多个静态方法之间重复代码问题
private static 返回值类型 方法名称(参数名称){ 方法体 }
一个类的直接父类是唯一的,但是一个类可以同时实现过个接口
public interface 接口名称1,接口名称2…. { }
若多个接口中同时定义了相同的抽象方法,那么实现类中覆盖重写一次即可
若多个接口中同时定义了相同的默认方法,那么实现类中必须覆盖重写一次
一个类,如果直接父类当中的方法和所实现接口当中的默认方法产生了冲突,优先使用父类当中的方法
1 | public interface MyinterfaceA { |
前提:接口A 类B是接口A的实现类
A a = new B();
B b = new B();
区别
a对象只能调用接口A中的方法,不能调用B中特有的方法;B可以调用接口和实现类中的特有方法
1 | public interface SaleComputer { |