Object类
类 Object 是类层次结构的根类。
每个类都使用 Object 作为超类。
所有对象(包括数组)都实现这个类的方法。
Object 是所有类的父类.
Object类: toString方法任何类的对象都可调用 toString(), 得到一个对象的字符串表示形式, 默认使用Object类中定义的方式 如果不想使用默认方式, 子类可以重写toString()方法, 转换为自己想要的内容
.equals
1. 任何对象都能用 Object 类型进行接收 2. equals() 方法具有对称性, 也就是 a.equals(b) 和 b.equals(a) 效果一样 3. 如果比较双方一个常量一个变量, 推荐把常量字符串写在前面: "abc".equals(str). 可以避免空指针异常的可能
重写equals()的作用: 不重写时, 自定义对象默认继承Object类的equals()方法, 通过 == 比较地址值 但开发时, 一般要重写equals()方法, 让对象"根据属性值"来判断是否相等IDEA快捷键: Alt+Insert, 选 equals() and hashCode()
日期时间相关的类
long和Date对象互转
string和Date对象互转
calendar对象和Date对象互转
毫秒值的概念和作用时间原点是从 0时区 1970-01-01 00:00:00 开始
1(秒)=1000(毫秒)
十位数字精确到秒
十三位数字精确到毫秒
Date类: 构造方法, 成员方法
创建一个Date对象是表示当前的系统时间
Date date =new Date();
System.out.println(date);
Collecttion泛型 集合工具类
集合: 长度可变容器, 可以存储多个对象集合和数组的区别: 1. 数组长度不可变; 集合长度可变 2. 数组可以存基本类型或引用类型, 只能存同一种类型; 集合只能存储引用类型元素, 可以是多种类型元素
集合框架
Collection接口: 单列集合顶层 |_ List接口: 元素存取有序, 可重复, 有索引 |_ Set接口: 不可重复, 无索
Collection接口中定义了哪些方法, 分别有什么作用// 多态创建对象: 父类引用指向子类对象ArrayList list = new ArrayList();list.共有方法();list.特有方法();Collection<String> coll = new ArrayList<>();// 多态调用方法coll.共有方法();
boolean add(E e): 把给定的对象添加到当前集合中 void clear(): 清空集合中所有的元素 boolean remove(E e): 把给定的对象在当前集合中删除 boolean contains(E e): 判断当前集合中是否包含给定的对象 boolean isEmpty(): 判断当前集合是否为空(没有元素) int size(): 返回集合中元素的个数 Object[] toArray(): 把集合中的元素,存储到数组中 Iterator<E> iterator(): 获取集合的迭代器对象 (后面讲到) Iterator接口: 迭代器
迭代器
Iterator<E> iterator(): 获取集合的迭代器对象
迭代: 类似于遍历, 判断是否有下一个元素, 有则取出下一个, 直到没有
迭代器: 用于遍历集合的对象
增强for循环
增强for, 普通for, 迭代器的区别: 增强for: 优点: 获取元素很方便, 格式简单 缺点: 没有普通for中的索引, 没有迭代器对象可以进行元素的增删 应用场景: 适用于遍历获取数组和集合元素的场景 普通for: 优点: 有索引可以使用, 某些方式可以在遍历过程中增删元素 缺点: 格式繁琐 应用场景: 需要用到索引的场景 迭代器: 优点: 可以使用迭代器对象的方法操作元素 缺点: 格式繁琐 应用场景: 需要在迭代过程中增删元素的场景
泛型
泛型: Generic Type. JDK 5 增加. 是一种未知的数据类型 定义集合时, 某些方法不知道使用什么类型时, 就可以使用泛型 创建集合对象时, 需要确定泛型具体的类型 泛型可以看作是一个"变量", 用来接收数据类型
不使用泛型的问题: 集合实际储存的是Object 类型, 存入的元素无论是什么类型, 都会被提升为 Object, 取出来的也是 Object, 要想调用元素特有方法, 就要向下转型, 有可能发生类型转换异常 ClassCastException
泛型的好处
避免了类型转换的麻烦
将运行时的转换异常,转移到了编译时期(有利于程序yuan提前发现问题)
定义和使用含泛型的类
定义泛型 <泛型名> 泛型的"定义"和"使用" 泛型在"定义"时, "不能是"具体的类型, 只是一个变量名: public class ArrayList<E> {} 泛型在"使用"时, "必须是"具体的数据类型 ArrayList<Integer> // 带有泛型的类定义格式 修饰符 class 类名<代表泛型的名字> { // 泛型的变量一般用一个大写字母表示, 但也可以是多个字母 } 类中的泛型, "在创建对象时", 确定泛型的具体类型方法中的泛型定义位置: 修饰符 和 返回值类型 之间 // 带有泛型的方法定义格式 修饰符 <代表泛型的名字> 返回值类型 方法名(参数){ } 方法中定义泛型后, 返回值类型和参数类型都可以使用泛型方法泛型的使用: "在调用方法时"确定泛型的具体类型
定义与使用含有泛型的接口
定义泛型接口与定义泛型类一样 // 带有泛型的类定义格式 修饰符 interface 接口名<代表泛型的变量> { } public interface GenericInterface<I> { void method(I i); }实现类实现了泛型接口后可以有2种选择: 1. "定义实现类时", 确定泛型的具体类型 public class A implements GenericInterface<String> { @Override public void method(String i) {} // 所有使用泛型的地方都会确定具体类型 } 2. 定义实现类时仍然沿用泛型, 直到"创建该实现类对象时"才确定泛型的具体类型 public class A<I> implements GenericInterface<I> { @Override public void method(I i) {} // 泛型不需要确定具体类型, 当创建该类对象时再确定 } A<Integer> a = new A<>(); a.method(1); A<String> a2 = new A<>(); a2.method("dsfdsaf");
泛型定义总结: 定义在类上的泛型: 有效范围: 整个类中都有效 何时确定具体类型: 创建该类对象时确定泛型的具体类型 定义在方法上的泛型: 有效范围: 方法中(包括返回值类型和参数类型)有效 何时确定具体类型: 调用方法传参时确定泛型的具体类型 定义在接口上的泛型: 有效范围: 接口中 何时确定具体类型: 1. 子接口或实现类定义时确定泛型的具体类型 2. 创建实现类对象时确定泛型的具体类型
泛型通配符泛型通配符: 不知道使用什么类型来接收时, 此时可以使用 <?> 来表示未知通配符 示例: List<?> list 接收泛型是任意类型的List对象 public void addAll(List<?> list){ // ... } ArrayList<Integer> list1 = new ArrayList<>(); ArrayList<String> list2 = new ArrayList<>(); addAll(list1); addAll(list2); 注意: 只能接收数据, 不能调用方法存储元素 List<?> list 这种集合不能调用 add() 添加元素, 只能调用 get() 获取元素 List<?> list 其实是一个变量, 所以可以将一个集合赋值给它 如: List<?> list = new ArrayList<String>(); // 正确 但是不能直接new 泛型为?的集合对象: 如: List<?> list = new ArrayList<?>(); // 错误 使用方式: 不能创建对象使用 只能作为方法参数使用. (减少方法重载)泛型的上限: 格式: 类型名称<? extends 类名> 对象名称 示例: List<? extends Number> list 作用: 只能接收泛型为该类型及其子类的对象 (Number及其子类的泛型)泛型的下限: 格式: 类型名称<? super 类名> 对象名称 示例: List<? super Number> list 作用: 只能接收泛型为该类型及其父类型的对象 (Number及其父类的泛型)Ctrl+CCtrl+V
|
|