第一周学习了6天的课程,主要涉及到date日期、 Calendar日历类、Collection集合接口、 Map<k,v>集合、异常和线程6个大的内容。具体细节包括format日期格式化、arraycopy数组复制、currentTimeMillis获取系统当前毫秒值、StringBuilder集合缓冲、基本类型的包装类、单列集合List接口及其分支、双列集合Map接口及其实现接口和实现类、Collections工具类、迭代器和加强for循环、泛型基本含义和类型、然后是异常、最后是昨天学习的线程与多线程安全问题。经过这些天的学习,基本的理论知识都比较简单,容易上手。难度不算很大。下面说说具体的学习内容及个人体会:
Date类 主要是获取系统时间和格式化时间。其中,Date date = new Date();和System.currentTimeMillis本质上是一样的。Date:空参数构造方法=>Date()获取当前系统日期和时间;
Date date = new Date();
有参数构造方法=>Date(Long date)参数是传递毫秒值,把毫秒转换为date日期
Date date = new Date(0L);==>就是1970-01-01 08:00:00;
SimpleDateFormat用来格式化。需要指定格式,如(yyyy-MM-dd)
Calendar是一个抽象类 不能直接创建对象,只能通过静态方法getInstance来创建对象:
Calendar c =Calendar.getInstance();
设置时间可以直接c(年份,月份,号数);
Stringbuilder类:字符串缓冲区和String是差不多的,一般用于优化。因为它的添加快。
Collection是单列集合接口。分为List set两个子接口。List的特点是有序、可重复、有索引。set没有索引、不可重复。Linkedset是有序的。集合的实现类的方法主要有add;set;get;size;tostring;removd;contain等。
集合.add:添加元素
集合.remove:删除元素
集合.contains(...):判断当前集合中是否包含给定的对象
集合.isEmpty();判断集合是否为空
size 获取集合元素个数
toArray 把集合元素存到数组
clear() 清空集合中的元素
Iterator迭代器:
专门取出集合元素的接口(对集合进行遍历)
格式: Iterator<E> it=集合.iterator();
方法:
it.hasNext(); 判断集合是否还有元素
it.next(); 获取集合元素(一次一个)
注意:在使用迭代器遍历元素的时候,不要修改集合长度(否则会报异常) ,遍历也可以用size获取长度用普通for循环,效果是一样的。如果仅仅想看看集合的元素,也可以直接打印。
Collections中有两个方法,一个是用于斗地主洗牌的shuffle方法,一个是用于排序的sort方法,这两个方法都可以用Collections点出来直接使用。
Map<k,v>集合
Map集合的特点:
1.Map是一个双列集合,一个元素包含两个值(一个key,一个value)
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
3.Map集合中的元素,key不允许重复,valu可以重复
4.Map集合中的元素,key和valu是一一对应的
Map常用方法
V put(key ,value) 把指定的键与值添加到Map集合中,返回值是value
存储的时候:key不重复,返回值是null
key重复,会使用新的value替换,返回被替换的value
V get(key)通过key找到value
key存在,返回对应的值
key不存在,返回null;
V remove(key)通过key删除value 返回被删除的
把指定的key所对应的值在map中删除,
key存在:返回被删除的值
key不存在,返回null;
boolean containsKey(key):包含key返回true,不包含,返回false.
Set<K> keyset() 用来遍历map集合,返回值是set集合里面装的是所有的key值
在循环(迭代器/增强for)遍历通过key找到value值
实现步骤:
1.使用map集合中的方法keyset(),把map集合所有的key取出来,存储到set集合中
2.通过set集合,获取map中的每一个key
3.通过map集合的方法get(key),找到每一个value
Set<Map,Entry<K,V>> entryset()
Map集合可以用来斗地主排序。Map集合的遍历有两种方法,都是用迭代器来进行,一种是键找值,这种类似普通for和之前的单列集合遍历的方法;另一种就是键值对方法,这种也是用迭代器进行。
接下来就是异常Throwable。
异常分两者,编译期异常和运行期异常。编译器异常必须处理,不然编译一直辉报错,程序不能运行。运行期异常可以用不用处理,直接交给JVM处理。JVM处理的方法是打印异常,中断程序。
编译期异常有两种方式处理,一种是声明,抛给方法的调用者处理,方法的调用者要么try catch要么声明抛出。声明抛出最终的处理方式是抛到JVM处理。一般都用try catch处理。
我们也可以在自定义类中抛出异常,自定义一个异常。需要注意的是,在自定义异常中,创建get set的时候, public void setLife(Integer life) {
if (life<0){
try {
throw new Baocuo("生命值过低");
} catch (Baocuo baocuo) {
baocuo.printStackTrace();
}
}
this.life=life;
}
满参构造的时间,调用 setLife(Integer life)这个方法即可。
开启多线程一般有两个方法,一个是Thread继承类,一个是Rannable实现类。在测试类中创建对象,对象点start方法开启。
直接开始访问多线程存在不安全问题,比如买票实例,会出现卖除不存在的票和重复的票。解决的方法有三种。一种是常用的synchronized()代码块。一种是synchronized方法,还有一个是lock锁。常用的是第一种方法,synchronized代码块。
|
|