本帖最后由 刘文杰 于 2018-7-26 15:01 编辑
day01【Object类、各种类,常用API 】day02【Collection 迭代器 增强for 泛型】
Object类
Date 类
DateFormat类
Calendar类 (日历类)
System类
StringBuilder类
包装类
toString方法的好处是在碰到println方法的时候会被自动调用,不用显示的写出来。
一般我们都要输出JavaBean的属性名和属性值, Alt + Insert 选择 toString() 即可
public boolean equals(Object obj) :指示其他某个对象是否与此对象"相等"
重写equals()的作用:
不重写时, 自定义对象默认继承Object类的equals()方法, 通过 == 比较地址值
long
\ SimpleDateFormat
Date-------------------- String
/
Calendar
long getTime(): 获取Date对象中保存的时间毫秒值
void setTime(long time):修改Date对象的时间
java.text.DateFormat抽象类: 用于格式化和解析时间. 提供了方便的方法
// 常用成员方法 (抽象类不能创建对象, 但可以有非抽象的方法供子类使用)
String format(Date date): 格式化, 从Date对象转换为String对象
Date parse(String source):解析, 从String对象转换为Date对象
java.text.SimpleDateFormat类
// 构造方法
SimpleDateFormat(String pattern): 用给定的模式和默认语言环境的日期格式符号创建对象
// 常用模式: 可在SimpleDateFormat类中查看
y: 年
M: 月
d: 日
H: 时 (24小时制)
m: 分
s: 秒
E: 星期
D: 年中的天
K: 小时(12小时制)
S: 毫秒
示例: "yyyy-MM-dd E HH:mm:ss.SSS"
Calendar.getInstance() 会根据当前系统获取合适的子类对象, 我们获取到的是 GregorianCalendar
Calendar类的常用功能
java.util.Calendar抽象类: 代表日历, 提供了不同国家的历法, 封装了很多时间属性
// 静态成员变量
static int YEAR :年份
static int MONTH :月份. 注意月份数值是 0-11
static int DAY_OF_MONTH:日期
static int HOUR :小时(12小时制)
static int HOUR_OF_DAY :小时(24小时制)
static int MINITE :分钟
static int SECOND :秒
// 非静态成员方法
int get(int field): 获取指定日历字段的值 int year = cal.get(Calendar.YEAR)
void set(int field, int value): 修改指定日历字段为指定的值
void add(int field, int amount): 调整指定日历字段的值. 正数增加, 负数减少
Date getTime(): Calendar转Date
void setTime(Date d): Date转Calendar
// 示例
// 获取日期:
int day = calendar.get(Calendar.DAY_OF_MONTH);
// 修改年:
calendar.set(Calendar.YEAR, 2000);
// 修改月:
calendar.set(Calendar.MONTH, 0);
// 日期增加一天:
calendar.add(Calendar.DAY_OF_MONTHY,1);
// 日期减少一天:
calendar.add(Calendar.DAY_OF_MONTHY,-1);
日期转换总结:
long (数学计算)
\ SimpleDateFormat
Date -------------------- String(用户输入和显示)
/
Calendar (获取时间的某个部分)
long和Date对象互转
利用Date
Date(longmillis): long转Date
longgetTime(): Date转long
String和Date对象互转
利用SimpleDateFormat
Dateparse(String s): String转Date
Stringformat(Date): Date转String
Calendar对象和Date对象互转
利用Calendar
DategetTime(): Calendar转Date
voidsetTime(Date d): Date转Calendar
static long currentTimeMillis(): 返回当前系统时间的毫秒值
补充:
long start = System.currentTimeMillis();
// 循环
for (int i = 0; i < 100000; i++) {
System.out.println("我爱Java " + i);
}
// 循环结束后记录结束时间毫秒值
long end = System.currentTimeMillis();
// 静态方法
static void arrayCopy(Object src,int srcPos,Object dest,int destPos,int length):复制源数组中指定长度个元素到一个新数组中
StringBuilder类
字符串拼接问题
理解+拼接String有什么缺点
简述StringBuilder类与String类的区别。
答:String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响。
StringBuilder又称为可变字符序列,是JDK5.0中新增加的一个类,它是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。即它是一个容器,容器中可以装很多字符串,并且能够对其中的字符串进行各种操作。它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容,StringBuilder会自动维护数组的扩容。
new StringBuilder("原字符串").append("要拼接的字符串").toString();
额外创建了多余的StringBuilder对象
StringBuilder概述与构造
知识点:
StringBuilder类有什么作用
StringBuilder有哪些常用构造方法
java.lang.StringBuilder类: 可变字符序列, 可以高效拼接字符串. 底层使用数组保存
// 构造方法
StringBuilder(): 构造一个空的StringBuilder容器
String和StringBuilder互转: 利用StringBuilder
StringBuilder(String str): String转StringBuilder
String toString(): StringBuilder转String
包装类
包装类概述
包装类: 基本数据类型对应的引用数据类型 ArrayList<Integer> list = ...
list.add(10)
int a = list.get(0);
基本类型 | 对应的包装类(位于java.lang包中) | byte | Byte | short | Short | int | Integer | long | Long | float | Float | double | Double | char | Character | boolean | Boolean |
String转基本类型: 利用包装类的静态方法
static byte parseByte(String s): 将字符串参数转换为对应的byte基本类型
static short parseShort(String s): 将字符串参数转换为对应的short基本类型 Short
static int parseInt(String s): 将字符串参数转换为对应的int基本类型 Integer
static long parseLong(String s): 将字符串参数转换为对应的long基本类型
static float parseFloat(String s):将字符串参数转换为对应的float基本类型
static double parseDouble(String s): 将字符串参数转换为对应的double基本类型
static boolean parseBoolean(String s): 将字符串参数转换为对应的boolean基本类型
day02【Collection、泛型】
主要内容
Collection集合
迭代器
增强for
泛型
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
集合按照其存储结构可以分为两大类,分别是单列集合 java.util.Collection 和双列集合 java.util.Map
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List 和 java.util.Set 。其中, List 的特点是元素有序、元素可重复。 Set 的特点是元素无
序,而且不可重复。 List 接口的主要实现类有 java.util.ArrayList 和 java.util.LinkedList , Set 接口
的主要实现类有 java.util.HashSet 和 java.util.TreeSet 。
Collection接口: 单列集合顶层
|_ List接口: 元素存取有序, 可重复, 有索引
|_ Set接口: 元素存取无序, 不可重复, 无索引
整个集合类的继承体系。
Collection是所有单列集合的父接口,
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(): 把集合中的元素,存储到数组中。
Iterator<E>iterator(): 获取集合的迭代器对象
Iterator接口: 迭代器
tips: 有关Collection中的方法可不止上面这些,其他方法可以自行查看API学习。
第二章 Iterator迭代器
2.1 Iterator接口 一个遍历集合的接口
Collection接口与 Map 接口主要用于存储元素,而 Iterator主要用于迭代访问(即遍历) Collection 中的元素,因此Iterator 对象也被称为迭代器。
public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。
。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
Iterator接口的常用方法如下:
public E next():返回迭代的下一个元素。
public boolean hasNext():如果仍有元素可以迭代,则返回 true。
tips:在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生
java.util.NoSuchElementException没有集合元素的错误。
2.2 迭代器的实现原理
hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出, 否则说明已到达了集合末尾,停止遍历元素。
迭代器的原理:
迭代器有一个指针(其实就是个变量保存索引值), 最初指向集合的 -1 索引
hasNext() 方法可以判断下一个索引是否有元素
next() 方法移动指针到下一个索引, 并返回元素
}
Iterator 中 删除元素用的是 他的对象点上remove;(不可以用Collection的对象点)
2
它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作
for(int a : arr){//a代表数组中的每个元素
System.out.println(a);
}
System.out.println(s); (快捷键 :coll.for)
}
}
增强for, 普通for, 迭代器的区别:
增强for:
优点: 获取元素很方便, 格式简单
缺点: 没有普通for中的索引, 没有迭代器对象可以进行元素的增删
应用场景: 适用于遍历获取数组和集合元素的场景
普通for:
优点: 有索引可以使用, 某些方式可以在遍历过程中增删元素
缺点: 格式繁琐
应用场景: 需要用到索引的场景
迭代器:
优点: 可以使用迭代器对象的方法操作元素
缺点: 格式繁琐
应用场景: 需要在迭代过程中增删元素的场景
tips: 新for循环必须有被遍历的目标。目标只能是Collection或者是数组。新式for仅仅作第三章 泛型
创建集合对象时, 需要确定泛型具体的类型
Collection虽然可以存储各种对象,但实际上通常Collection只存储同一类型对象。
tips:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
3.2 使用泛型的好处
1. 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
2. 避免了类型强转的麻烦。
tips:泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。
3.3 泛型的定义与使用
泛型在定义的时候不具体,使用的时候才变得具体。在使用的时候确定泛型的具体数据类型。
list.add("abc");
list.add("itcast");
// list.add(5); //当集合明确类型后,存放类型不一致就会编译报错
修饰符 class 类名<代表泛型的变量> { }
public class MyGenericClass<MVP> {
//没有MVP类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型
静态方法也可以 加 泛型;调用静态方法用的是 类名点上 静态方法名,一般不用类new出来的对象点方法名
含有泛型的接口
定义格式:interface接口名<代表泛型的变量> { }
实现含有泛型的接口,定义实现类的时候确定泛型的类型
接口使用什么泛型.实现类就实用什么泛型类型.跟着接口走!
就相当于是一个泛型的类,创建对象的时候确定泛型的类型
定义类时确定泛型的类型
定义格式:
修饰符 class 类名<代表泛型的变量> { }
例如,API中的ArrayList集合:
泛型在定义的时候不具体,使用的时候才变得具体。在使用的时候确定泛型的具体数据类型。
在创建对象的时候确定泛型
例如,ArrayList<String> list = new ArrayList<String>();
泛型定义总结:
定义在类上的泛型:
有效范围: 整个类中都有效
何时确定具体类型: 创建该类对象时确定泛型的具体类型
定义在方法上的泛型:
有效范围: 方法中(包括返回值类型和参数类型)有效
何时确定具体类型: 调用方法传参时确定泛型的具体类型
定义在接口上的泛型:
有效范围: 接口中
何时确定具体类型:
1. 子接口或实现类定义时确定泛型的具体类型
2. 创建实现类对象时确定泛型的具体类型
3.4 泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
泛型通配符:
不知道使用什么类型来接收时, 此时可以使用 <?> 来表示未知通配符
示例:List<?> list 接收泛型是任意类型的List对象
注意: 只能接收数据, 不能调用方法存储元素
List<?> list 这种集合不能调用 add() 添加元素, 只能调用 get() 获取元素
List<?> list 其实是一个变量, 所以可以将一个集合赋值给它
如:List<?> list = new ArrayList<String>();
使用方式:
不能创建对象使用
只能作为方法参数使用. (减少方法重载)
通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
通配符高级使用----受限泛型
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
|