黑马程序员技术交流社区
标题: 【石家庄校区】Object类、常用API和Collection [打印本页]
作者: 昵称12138 时间: 2018-7-26 10:00
标题: 【石家庄校区】Object类、常用API和Collection
本帖最后由 昵称12138 于 2018-7-26 10:09 编辑
Object类、常用API和Collection
java.lang.object类是Java语言的根类,即所有类的父类,任何类都直接或者间接的继承Object
构造方法:
Object();
方法:
- public String toString(): 返回该对象的字符串表示形式
Object类中定义的该方法:return getClass().getName() + "@" +Integer.toHexString(hashCode());
即类的全路径 @ 哈希码值()
一般我们会重写自定义类的toString()方法,Idea中为我们提供了自动生成的toString方法
- public boolean equals(Object obj): 返回参数对象是否与此对象”相等“
Object类中定义的该方法:return (this == obj);即比较对象和参数对象的地址值
一般我们会重写自定义类的equals()方法,Idea中为我们提供了自动生成的toString方法
[Java] 纯文本查看 复制代码
if (this == o) return true;//先比较地址,地址相同内容肯定相同
if (o == null || getClass() != o.getClass()) return false;//再判断对象是否为null,或者对象是否为同类
Person person = (Person) o;//向下转型,将Object对象转成Person对象
return age == person.age && Objects.equals(name, person.name);//引用对象String需要使用equals比较
3. Objects Object类的工具类
在比较两个对象时(比较的对象和被比较的对象),如果比较的对象为空,Object中的equals()方法会抛出空指针异常,而Objects中的equals方法优化了这个问题
public static boolean equals (Object a, Object b)
源码为:
return (a == b) || (a != null && a.equals(b));
java.util.Date类,表示特定的瞬间,精确到毫秒,可以通过方法来设定自己所表示的时间,可以表示任意的时间
构造方法:
public Date():创建的是一个表示当前系统时间的Date对象,默认为当前系统时间
public Date(long date):根据“参数时间”创建Date对象,参数是一个毫秒值,是距1970-1-1 00:00:00 GMT(格林尼治)的时间
方法:
getTime();返回当前Date对象时间距基准时间的毫秒差值
注意:
直接打印Date对象得到的是标准格式的当前系统时间
Thu Jul 12 15:55:51CST 2018
星期 月份 日期 时间 时区 年份
[Java] 纯文本查看 复制代码
Date date = new Date();
System.out.println(date);//Thu Jul 12 15:55:51 CST 2018
System.out.println("===============");
Date date2 = new Date(0);
System.out.println(date2);//Thu Jan 01 08:00:00 CST 1970
System.out.println("===============");
Date date3 = new Date(1000 * 60 * 60);
System.out.println(date3);//Thu Jan 01 09:00:00 CST 1970
System.out.println(date.getTime());//1531382151431
java.text.DateFormat类,是日期/时间格式化子类的抽象类,不能直接创建对象,可以完成日期和文本之间的转换
格式化:按照指定的格式,从Date对象转换为String对象
解析:按照指定的格式,从String对象转换为Date对象
子类:SimpleDateFormat
构造方法:
SimpleDateFormat(String pattern),参数为规则yyyy-MM-dd HH:mm:ss
方法:
public String format(Datedate):将日期对象格式化为指定类型的字符串
public Date parse(Stringstr):将字符串按照指定类型解析为日期对象
java.util.Calendar日历类,是抽象类,不能直接创建对象,可以通过静态方法创建子对象
静态常量
YEAR
MONTH
DAY_OF_MONTH/DATE
静态方法
getInstance():返回当前系统时间的日历对象
方法:
public int get(int field):返回当前日历参数字段的值
public void set(int field, int value):将当前日历该参数字段值更改为value
public void add(int field, int amount):为给定的日历字段添加或减去指定的时间量
public final DategetTime():返回一个表示此日历时间值(从历元至现在的毫秒偏移量)的 Date 对象
注意:
直接打印Calendar对象得到的是一组包含所有日历信息的数据
java.lang.System类为final类,不能有子类,同时System类中构造方法私有,也不能创建对象
System类中的方法都由static修饰,可以直接类名.方法名调用
方法:
- public long native currentTimeMillis();返回当前时间距历元时间的毫秒值
- static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
注意:
如果目标数组指定位置存在元素,将会被替换。
java.lang.StringBuilder,又称为可变字符序列,它是一个类似于String的字符串缓冲区,提供了在自己空间中操作字符串的方法
构造方法
public StringBuilder(),构造一个空的StringBuilder容器
public StringBuilder(Stirngstr),构造一个StringBuilder容器,并将字符串添加进去
方法
public String append(...) 添加任意类型数据的字符串形式,并返回当前对象自身
java.util.Collection中定义的是所有单列集合中共性的方法,所有的单列集合都可以使用共性的方法,没有带索引的方法
集合和数组的区别
1. 数组的长度固定,集合长度可变
2. 数组中的元素必须是同一种,可以是基本类型,也可以是引用类型集合可以存储不同类型的对象(一般我们都存储同一类型),只能存储引用类型常用的方法
public boolean add(E e) :把给定的对象添加到当前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e) :把给定的对象在当前集合中删除。
public boolean contains(E e) :判断当前集合中是否包含给定的对象。
public boolean isEmpty(): 判断当前集合是否为空。
public int size() : 返回集合中元素的个数。
public Object[] toArray() :把集合中的元素,存储到数组中。
迭代:在Collection中可以作为获取元素的一种方式
java.util.Iterator<E>迭代器接口,
Collection中获取迭代器的方法
Iterator<E> iterator()
方法:
E next() 获取元素,获取之后指向下一个元素
boolean hasNext() 判断是否还有元素遍历
使用步骤:
- 使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
- 使用Iterator接口中的方法hasnext()判断还有没有下一个元素
- 使用Iterator接口中的方法next()取出集合的下一个元素
迭代器的实现原理
迭代器使用指针来跟踪元素,开始时指针在-1的位置,next()方法依次向后移动指针
注意:
- 迭代完成后,如果想重新遍历,需要再次创建迭代器对象
- 迭代器获取元素时不能使用集合的方法进行修改,否则会发生异常ConcurrentModificationException,并发修改异常
原因:迭代器是依赖于集合的,可以看作是集合的副本,迭代器在操作的时候,如果发现和集合不一样,则抛出异常
foreach:增强for循环,所有实现了Iterable接口的类都可以使用foreach,所有的单列集合都可以使用foreach
格式:
for(元素的类型 变量名 : 集合或者数组对象名) {
sout(变量名);
}
注意:在增强for循环中不能修改集合,否则会出现并发修改异常,因为增强for循环底层也是迭代器
增强for,普通for,迭代器比较:
优点:获取元素很方便,格式简单
缺点:没有索引,没有迭代器对象可以进行元素的增删
应用场景: 适用于遍历获取数组和集合元素的场景
2. 普通for:
优点:有索引可以使用,可以在遍历过程中增删元素
缺点:格式繁琐
应用场景: 需要用到索引的场景
3. 迭代器:
优点:可以使用迭代器对象的方法操作元素
缺点:格式繁琐
应用场景: 需要在迭代过程中增删元素的场景
使用集合存储自定义对象时,如果不使用泛型,默认为Object类型
由于集合可以存储任意类型的对象,当我们存储了不同类型的对象,就有可能在向下转型的时候出现类型转换异常
ClassCastException:学生对象不能转换成字符串
java为了解决这个问题,给我们提供了一种机制,叫做泛型,限制了集合中存储元素的类型,在编译期间就可以检查错误
泛型:是一种广泛的类型,把明确数据类型的工作提前到了编译时期,借鉴了数组的特点
泛型好处:避免类型转换异常的问题,简化代码的书写
把运行期异常,提升到了编译期
泛型的定义和使用
泛型可以使用在不同的类、方法、接口当中,将数据类型作为参数进行传递,赋值给代表泛型的变量
定义格式:修饰符 class 类名<代表泛型的变量>{}
泛型在定义的时候不具体,使用的时候才具体
在创建对象的时候确定泛型
ArrayList<String> list = newArrayList<>();
注意:泛型是没有继承概念的,不能接收除了指定类型的其它类型
含有泛型的类
泛型类的定义格式
修饰符 class类名<泛型>{}
代表未来的类型
一旦确定了泛型的类型,那么MVP就变成了具体的类型
含有泛型的方法
定义格式
修饰符 <泛型类型> 返回值类型 方法名(参数列表){}
含有泛型的接口
定义格式
修饰符 Interface 接口名称 <泛型> {}
注意:如果实现类也没有确定具体类型,那么实现类的类名也要加上泛型
泛型通配符
当使用泛型类或者接口时,接收参数时,泛型类型不确定,可以通过通配符<?>表示,
但是一旦使用了通配符,只能使用Object类中的共性方法,集合中元素自身方法无法使用
受限泛型
? extends Number 设定了泛型的上限,只能接收Number及其子类
能接收的类型 Number Integer
? super Number 设定了泛型的下限,只能接收Number及其父类
能接收的类型 Number Object
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |