本帖最后由 小石姐姐 于 2018-4-20 09:54 编辑
经验交流---JE07期_day05-day08笔记
day05-day08学习笔记day05第一章 Object类和system类1.1 Object类 概述: Object类是java的根类,所有类的父类. 它中描述的所有方法,子类都可以使用 在Object类众多的方法中,我们先学习equals方法和toString方法,其他方法后面课程中会陆续学到 获取字节码对象的方式: 1.通过Object类的getClass()方法获取 2.通过类名调用属性class来获取 3.通过Class类的静态方法forName()来获取 快捷键生成toString方法 public class EqualsDemo { public static void main(String[] args) throws ClassNotFoundException { Student s = new Student("小明",18); //the way 1 通过Object类的getClass()方法获取 Class clazz1 = s.getClass(); //the way 2 .通过类名调用属性class来获取 Class clazz2 =Student.class; // the way 3 通过Class类的静态方法forName()来获取 Class clazz3 = Class.forName("com.itheima_2.Student"); System.out.println(clazz1.equals(clazz2)); //true
System.out.println(clazz1.equals(clazz3)); //true
System.out.println(clazz1.equals(clazz1)); //true
System.out.println(clazz2.equals(clazz3)); //true
同一个类的字节码都是一样的System类System类 被final修饰 包含一些有用的类字段和 方法 它不能被实例化 复制数组: static void arraycopy(Object src , int srcPos , Object dest, int desPos , int length ) src : 源数组 srcPos:从源数组的哪个索引开始复制 dest : 目标数组 desPos : 从目标数组的第几个索引开始接收 length: 目标数组接收源数组的索引个数 不能超过目标数组的长度 调方法 用sysytem类名 点 方法名
int[] src ={1,2,3,4,5,6,7,8,9};
int[] desk = new int [6] ;
System.arraycopy(src,0,desk,0,4);//1,2,3,4,0,0
System.arraycopy(src,0,desk,0,6);//1,2,3,4,5,6
System.arraycopy(src,0,desk,0,7);java.lang.ArrayIndexOutOfBo undsException 索引越界
System.out.println(Arrays.toString(desk));返回当前的系统时间: static long currentTimeMillis() 以毫秒值返回当前的系统时间 从 1970-1-1 0:0:0至今的毫秒数
1000毫秒=1秒;
相对于1970-1-1 0:0:0 0
现在的时间
long now = System.currentTimeMillis(); 时间都是毫秒 终止虚拟机的运行: static void exit(int status) Data类 :表示特定的瞬间,精确到毫秒,它可以通过方法来设定自己表示的时间,可以 表示任何的时间 //system.currentTimeMillis(); 返回的是当前的系统时间,1970-1-1 至今的毫秒数 构造方法[td]构造方法摘要 | **Date**() 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。 | | | | **Date**(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。 | |
无参 Date(): 创建时一个表示当前系统时间的Data对象 有参 Date(long data) :根据 指定的时间创建Data对象 需要导包 : import java.util.Data;
Date a = new Date();
System.out.println(a.getTime());//1523179137820
Date a1 = new Date(0);
System.out.println(a1.getTime());//0
System.out.println(a.toLocaleString());//2018-4-8 17:18:43
toLocaleString : 当地时间的字符串 Date的常用方法: 毫秒值 - - - Date对象 设置 返回值时void 参数是long void setTime(long Time)
void setTime(long Time) 设置时间 Date - - -毫秒值 获取 返回long,无参数
long.getTime() 获取时间 SimpleDataFormatSimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。 格式化 Data - - -String 2049-8-26 2049年8月26日
String format(Data data)解析: String - - - Data "2049 -8 -26 "
Data parse(String source)构造方法: SimleDataFormat() 使用默认的模式进行对象的构建
SimpleDateFormat sdf = new SimpleDateFormat();
Date date = new Date();
String s = sdf.format(date);
//jiexi
Date d = sdf.parse(); SimleDataFormat(String pattern) 使用指定的模式进行构建 [td]字母 | 日期或时间元素 | 表示 | 示例 | G | Era 标志符 | | AD | y | 年 | | 1996; 96 | M | 年中的月份 | | July; Jul; 07 | w | 年中的周数 | | 27 | W | 月份中的周数 | | 2 | D | 年中的天数 | | 189 | d | 月份中的天数 | | 10 | F | 月份中的星期 | | 2 | E | 星期中的天数 | | Tuesday; Tue | a | Am/pm 标记 | | PM | H | 一天中的小时数(0-23) | | 0 | k | 一天中的小时数(1-24) | | 24 | K | am/pm 中的小时数(0-11) | | 0 | h | am/pm 中的小时数(1-12) | | 12 | m | 小时中的分钟数 | | 30 | s | 分钟中的秒数 | | 55 | S | 毫秒数 | | 978 | z | 时区 | | Pacific Standard Time; PST; GMT-08:00 | Z | 时区 | | -0800 |
解析的对象必须和默认的模式一样 使用指定的模式:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
//格式化
Date date = new Date();
String s = sdf.format(date);
Calendar 日历
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。abstract修饰 抽象类 Calendar类静态方法 Calendar c = Calendar.getInstance(); //返回当前时间 方法 : 修改 : 添加: 获取:
**package** com.itheima_05;
**import** java.util.Calendar;
/*
* Calendar:日历,提供了一些操作年月日时的方法
*
* 获取
* 修改
* 添加
*
*
*/
**public** **class** CalendarDemo {
**public** **static****void** main(String[] args) {
//static Calendar getInstance()
Calendarc = Calendar.*getInstance*();
//void set(int field, int value) :把指定的字段修改成指定的值
//c.set(Calendar.DAY_OF_MONTH, 20);
//void add(int field, int amount): 在指定的字段上加上指定的值
c.add(Calendar.*DAY_OF_MONTH*, -1);
//int get(int field) // 返回给定日历字段的值
//public static final int YEAR 1
//System.out.println(Calendar.YEAR);
//int year = c.get(1);
**int** year = c.get(Calendar.*YEAR*);
**int** month = c.get(Calendar.*MONTH*) + 1;
**int** day = c.get(Calendar.*DAY_OF_MONTH*);
System.*out*.println(year + "年" + month + "月" + day + "日");
}
}包装类: byte Byte short Short char Character int Integer long Long 构造方法 Integer(int value) Integer(String s )
Test //Integer(int value)
Integer i = new Integer(10);
System.out.println(i);
// Integer(String s)
Integer i1 = new Integer("11");
System.out.println(i1);
// int intValue()
int i3 = Integer.valueOf(12);
System.out.println(i3);
// static int parseInt(String s)
String s = Integer.toString(13);
System.out.println(s);
//static String toString(int i)
int i4 = Integer.parseInt("14");
System.out.println(i4);
自动装箱和拆箱 //自动装箱 基本数据类型转换为包装类 Integer i= 10; //自动装箱 相当于Integer i = new Integer(10); int a = i ; //自动拆箱 int a = i . intValue(); 包装类可以自动转换成基本数据类型 ArrayList list = new intValue(); list.add(10); //自动装箱 正则表达式: 是一种用于匹配字符串的规则; 可用于判断字符串是否符合某种规则,比如是否是邮箱,是否是手机号等等. Pattern类: 创建正则表达式模板,内有正则表达式的规则 常用规则 : 具体查看API模板 字符:
x :
\\ :
[abc]:DAY_06 集合Collection List ArrayList Collection接口 (单列集合体现) 顶层接口常用方法:boolean add(E e): 添加元素 添加成功返回ture 否则false void clear() boolean isEmpty() boolean remove(Object o ) int size() Object toArray() 将集合转换成一个Object类型的数组 迭代器Iterator 接口作用 提供遍历集合的安全方式:获取迭代器
迭代器 运行先指向第一个元素前面的位置 需要先判断有没有下一个 元素.hasNext() 是否有下一个元素
使用集合对象调用Interator<E> iterator()方法 成员方法: hasNext() 方法:判断集合中是否有元素可以迭代 next() 用于返回迭代的下一个元素 void remove() 从迭代器指向的
集合的遍历方式:
1.toArray(),可以把集合转化成数组,然后遍历数组即可
2.iterator(),可以返回一个迭代器对象,我们可以通过迭代器对象迭代集合
Iteartor : 用于遍历集合
E next : 返回下一个元素
arr.next();使用next方法获取元素,可能会抛出NOSUCH异常
所以我们呢要使用hasNext()方法 判断是否有下个元素
Iterator 是依赖于集合的,相当于集合的一个副本,当迭代器在操作是 ,发现和集合不一样的时候就会抛出异常
Exception in thread "main" java.util.ConcurrentModificationException:并发修改异常 解决方案:在使用迭代器遍历的时候,使用迭代器去修改 Iterator 里没有这个方法 ListIterator Iterator的子类接口 泛型 由于集合可以i存储任意类型的对象,当我们存储了不同类型的对象,就可能在转换的时候出现类型转换异常,所以java为了解决这个问题,给我们提供了一种机制,叫做泛型. 泛型 是一种广泛的类型,把明确数据类型工作提前到编译时期 好处: 避免了类型的转换问题 可以减少黄色警戒线 可以简化我们代码的书写 什么时候使用泛型? 当我们看到<E> 就可以使用泛型 foreach增强for循环作用 遍历数组和集合 格式: for(元素类型 新变量名:数组或集合对象){ 可以直接使用变量 //每次循环都会遍历出一个元素,保存到变量名中 } for( ){ // } 常见的数据结构ArrayList类(底层是数组,查询快,增删慢) LinkedList类 (底层是链表,查询慢,增删快) void addFirst(E e)添加元素到集合 void addEnd(E e) 添加元素到结尾
数组 int[] arr = {1,2,3,4,5};
数组的特点:
长度一旦定义不会改变
数组中的元素都有整数索引
数组只能存储同意类型的于那苏
数组既可以存储基本数据类型,也可以存储引用数据类型
如何获取数组的元素 arr[2]
如何在元素3的后面加一个新的元素8,howtodo
首先创建一个新的数组 长度+1
遍历源数组 当碰到3的时候 在元素3的后面添加新的元素8
最后把剩下的元素添加到8后面
数组在操作上的特点:
查找快,增删慢
链表:有链子链接起来的一堆节点;
节点:地址值,值,下一个节点的地址值
栈和队列栈 : 先进的后出 后进的先出来 弹夹 : 队列 : 先进先出 排队买票: List类 有序的collention 特点: 有序的(存储和读取的顺序是一致的) 有整数索引 允许重复的
List的特有功能
void add(int index, E element);
E get(int index)
E remove(int index)
E set(int index , E element)
//void add(int index, E element); 在指定索引添加元素
list.add(0,"hello");
list.add(0,"world");
打印结果 是 world hello
list.add(0,"hello");
list.add(0,"world");
list.add(1,"java");
打印结果 是 world java hello
//E get(int index) 根据索引返回元素 会有越界
for(){
list.get(i)
}
E remove(int index) 删除指定索引的元素
list.remove(2)
E set(int index , E element)//将指定位置的元素修改围殴EList的子类,LinkedList特有功能List的子类 ArrayList 底层的数组结构,查询快,删除慢 LinkedList 底层的链表的结构,查询慢,增删快 特有的方法: 用于处理开头和结尾的元素 LinkedList的一些方法
void addFirst(E e):将元添加到开头
void addLast(E e): 结尾
E getFirst() 获取开头的元素
E getLast() 获取结尾size()-1的元素
E removeFirst() 删除第一个
E removelast() 删除最后一个
file://C:/Users/ADMINI~1/AppData/Local/Temp/1523358976838.png?lastModify=1523700651 day07集合(HashSet,HashMap,Map集合嵌套)Set体系的特点
HashSet存储字符串并遍历
创建集合对象
//HashSet<String> hs = new HashSet<String>();
Set<String> hs = new HashSet<String>();父接口指向子类对象
添加元素对象
hs.add();
遍历 // 没有索引 三种方式: 转数组 迭代器 ForNB
Set接口 继承自Collection 接口 Set集合的特点: 无序(存储和读取的顺序有可能不一样)
无序,指的是 存入和去取出的顺序是不一样的.而不是说 每一次取出来的是随机顺序,存入后每次取出的顺序都一样 不允许重复,要求元素的唯一性 没有索引
HashSet集合
Student s = new student("张三",18);
Student s = new student("张三",18);
Student s = new student("李四",18);
三个学生对象都可以i存入HashSet 里 ,这是因为:
通过查看源码发现:
add()方法,首先会使用当前集合的每一个元素和新添加的元素进行Hash值比较
如果hash值不一样,则认为不重复,会直接添加
如果hash值一样,则继续和已有元素比较地址值 或者使用equals方法
如果和所有的已有元素比较都不一样,则认为
我们发现当hashcode方法永远返回1,所有对象的hashcode方法 的比较 如果我们可以让 Collections工具类 collection和collections的区别: Collection是集合体系的最顶层,包含了集合体系的共性 Collections是一个工具类(方法static修饰,使用类名就可以调用),方法用于操作Collection
static int binarysearch(List list,Object key) 使用二分查找指定元素在列表中的位置,折半查找(集合必须是拍好顺序的)
static void copy(List dest,List src)//覆盖
static void fill(List list, Object obj)//使用指定的对象,填充到列表中的所有元素
list.add("hello");
list.add("hello1");
list.add("hello2");
Colletions.fill(list , hehe);
syso hehe hehe hehe
static void reverse(List list)//反转
static void shuffle( ) //随机置换 顺序
static void sort( ) //按照列表中元素的自然顺序进行排序
static void swap(List list , int i , int j)//将列表中的两个索引位置进行互换
HashMap集合Map接口概述: 我们通过查看map接口描述,发现Map接口下的集合和Collection接口下的集合,他们存储数据的形式不同 1.Collection 中的集合,元素是孤立存在的,单身 ,向集合中存储元素采用一个个元素的方式 2.Map中的集合 元素是承兑存在的(理解为 夫妻 ) 每个元素由键与值两个部分组成 通过键找到对应的值
3. collection中的结婚成为单列集合,Map中的集合成为双列集合Map中不能包括重复的键,但值可以重复.每个键只能对应一个值Map中不能包括重复的键,但值可以重复.每个键只能对应一个值Map中不能包括重复的键,但值可以重复.每个键只能对应一个值 Map的常用功能
1.映射功能
V put(K key , V value):以键=值的方式存入Map集合
将K映射到Value的功能 有福哦有Key存在,则覆盖Value,并将原来的Value返回
2.获取功能
V get(Object key): 根据键获取值
int size() 返回Map键值对的个数
3.判断功能
boolean containskey(Object key);
判断Map集合中是否包含键位key的键值对
判断Key是否存在
boolean containsValue(Object value)
判断Map集合中是否包含值为value键值对
判断指定的Value是否存在//map.containsValue("王五")
boolean isEmpty() 判断Map集合中是否没有任何键值对
4.删除功能
void clear()
清空Map结合中所有的键值对
V remove(object key)
根据键值删除Map中的键值对
根据指定的Key删除对应关系.并返回Key所对应的值,如果没有删除返回null
5.遍历功能
Set<Map.Entry<K,V>> entrySet()
将每一个键值对封存到一个个Entry对象中,再把所有的Entry的对象封存到Set结婚中返回.,
Set<k> KeySet(); //以set的形式返回所有的Key Set<String> keys = map.KeySet(); Collection<String> values() // 获取所有的值 collection<String> keys = map.KeySet(); for(String keys : key)
public class KeySet_ValueDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String , String >();
//添加内容
map.put("ITCAST001", "张三");
map.put("ITCAST002", "李四");
map.put("ITCAST005", "李四");
//利用keySet获取所有的key,并且遍历出所有的key
//Set<k> KeySet(); //以set的形式返回所有的Key
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key);
}
//利用values方法获取所有的value,并且遍历所有的value
//Collection<String> values() // 获取所有的值
Collection<String> values = map.values();
for (String value : values) {
System.out.println(value);
}
}Map的遍历第一种方式: 获取所有的key---遍历每一个key---用key去找他对应的value
//创建map对象
//添加映射关系
//遍历map对象
//获取所有的key
//遍历所有的key
//通过key来获取value
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
//映射对象
map.put("谢婷疯 ", "张箔纸");
map.put("陈关西", "钟欣桶");
map.put("李亚碰", "王飞");
//第一种方式 使用KeySet
Set<String> keys = map.keySet();
for (String key : keys) {
//通过Key获取value
String s = map.get(key);
//打印键值对
System.out.println(key+"\t"+s);
}
}Map遍历的第二种方式
Set<Map.Entry<K,V>> entrySet()
将每一个键值对封存到一个个Entry对象中,再把所有的Entry的对象封存到Set结婚中返回.,
//创建Map对象
//添加映射关系
//获取所有的Entry证对象
//遍历包含了Entry对象的集合
//获取每一个单独的Entry对象
//通过Entry对象获取丈夫和妻子
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("尹志平","小龙女");
map.put("令狐冲","东方菇凉");
map.put("玄慈","叶二娘");
Set<Map.Entry<String, String>> entry=map.entrySet();
for (Entry<String, String> entry2 : entry) {
String key = entry2.getKey();
String value = entry2.getValue();
System.out.println("丈夫:"+key+"\t\t"+ "妻子"+value);
}
}Map中key是类的Test创建一个学生类,重写toString方法方便遍历//创建Map对象//创建Key对象//添加映射关系//遍历map对象
可变参数:方法的形参可以一传入不定数量个参数 适用于 参数不确定的时候,类型要明确,Java可以把多个参数直接帮我们转化成数组 实参: 一个参数一个参数的传递 形参:类型 ... (三个.) 变量名 JDk1.5之后 注意:在可变参数之后不可以追加参数, 在可变参数前面可以追加 参数的数量自定义 可以给多个 也可以一个都不给 增强for循环 1.把数组中的元素添加到集合 int[] arr = {1,2,3,4,5,6}; for(int i : arr){ hs.add(i); } 2.要把集合转成数组 不能直接转int[] 可以转Integer[] //int[] arr = new int[hs.size()]; Integer[] arr = new Integer[hs.size()]; hs.toArray(arr); \ 3.Character 而不是char 利用HashCode 让对象实现排序的两种方式: 让对象具有自然顺序:让JavaBean实现Comparbale接口,重写co'mpareTo() 方法 使用比较器:定义一个类作为比较器,实现Comparator接口,重写compare()方法,排序时传入该比较器实现类的对象 重写方法的返回值的作用: 返回值为负数, 方式一: 让元素实现Comparable接口
class Dog implements Comarable<Dog>{
int age;
public Dog(int age){
super();
this.age = age;
}
@Override
public int compareTo(Dog o){
return this.age- age;
}
}
方式二:
class CatComparator implements Comparator<Cat>{
@
public int compare(Cat cat1 , Cat cat2){
return cat1.age - cat2.age;
}
}day08异常包含了错误的类型,原因以及位置 异常:不正常,我们在代码的时候出现编译或者运行时候出的错误; 异常的体系结构: Thowable 是异常的超类 Error: 出现的不能处理的问题. Exception : 出现了可以处理的一些问题 编译时异常 RuntimeException 运行时异常:编译正常 运行出错 常见异常: NullPointerException ArrayIndenxOutOfBoundException 任何数字除以0 都会抛出异常 异常的处理方式JVM默认处理方式:如果开发者没有处理异常,JVM会把异常的类型,原因,位置显示在命令行,并终止程序,一场之后的代码不会被执行; try...catch 语句 try{ 有可能出现问题的代码 }catch(){ 处理异常 } try...catch 的执行顺序 首先执行try语句 如果发现异常,后面的代码不再执行,直接跳入 catch语句中,catch语句结束后,整个try..catch语句结束 如果没有发生异常,try语句执行结束后.try..catch直接结束 抛出去 public static void main(String[] args) { try { System.out.println(1); System.out.println(1/0); System.out.println("trylast");//不打印 因为try在执行时 遇到异常就会执行catch语句,执行完毕后,结束try...catch语句 } catch (Exception e) { System.out.println("除数不能为0"); System.out.println("catch1"); } System.out.println("end"); }
thows
如何处理多个一异常可以使用多个try..catch语句 使用一个try 和 多个 catch 多个catch之间的顺序 多个catch之间可以有子父类关系 平级之间没有顺序关系 如果有子父类,父类异常必须放在子类的后面 1.NullPointException 空指针异常2.ArrayIndexOutOfBoundsException 数组越界
异常的顶层 Throwable常用的三个方法: String getMessage() 返回出现异常的原因 没有异常原因返回的话返回null String toString(); 返回错误类型和原因 void printStackTrace();返回类型原因和位置,与虚拟机的区别: 这种处理,之后的代码会执行,而虚拟机处理后,后面的代码不会执行. 小拓展System.err.print("okok"); 打印出来的字体时红的
finally的概述和应用场景try{ 有可能出现问题的代码}catch(){ 处理异常}finally{ 释放资源 处理垃圾}
异常的分类: 编译异常 编译时期异常:Exception的子类,非RuntimeException的子类,在编译时期必须处理(try..catch或者throws)
运行异常 空指针异常;syso(2/0);数组越界 ; 等运行时期异常:RuntimeException的子类就是运行时期异常,在编译时期可以自由选择处理或者不处理
自定义异常: 自定义编译异常
递归一种把问题由大化小,从小到大依次解决的思想; 在方法本身不断的调用方法自己 递归注意事项: 递归一定要有出口,内存溢出 递归次数不宜过多,内存溢出
|