黑马程序员技术交流社区
标题:
【石家庄校区】笔记交流第一期
[打印本页]
作者:
巴拉巴拉x
时间:
2018-4-14 11:03
标题:
【石家庄校区】笔记交流第一期
本帖最后由 小石姐姐 于 2018-4-20 09:51 编辑
【石家庄校区】笔记交流第一期
常用API
Object
Object 是所有类的根类,所有的类都直接或者间接的继承了Oject类
Object 常用方法
String toString();
直接输出对象,默认的是输出对象的toString();
toString 方法返回的是该对象的字符串表示: getClass().getName() + "@" + Integer.toHexString(hashCode());
getClass():返回的是字节码对象
getName();返回该对象的name成员变量,在该方法中返回的是该类的全名
Integer.toHexString();返回的是指定参数的十六进制字符串形式
Integer是一个类,调用静态方法toHexString();将int整型数字转换为十六进制字符串.
hashCode():返回该对象的哈希码值(内部地址),(哈希码值是把地址值经过计算得出的一个十六进制的数值),(哈希算法 散列算法,一对一的对应关系. 待深入了解)
获取字节码对象的3种方式
通过Object类的getClass()方法获取,有对象的时候用这种
通过类名调用属性class来获取(属性和方法不一样),没有对象的时候可以用这种
实际上.class是一种特殊形式,成为类字面常量,class是关键字不能作为属性名,且Object类中并没有定义这个属性
通过Class类的静态方法forName()来获取,也是没有对象的时候可用
因为该方法使用字符创来寻找类,有可能并没有该字符创对应的类,所以会抛出异常,ClassNotFoundExceptiong,
同一个类的字节码对象只有一个,和这个类的对象的地址值是不同的概念,通过类的对象来获取此类的字节码对象是一样的(对象所属的类所对应的字节码对象的地址值),他是对象就可以调用方法(具体方法在反射里边学习)
字节码对象可不可以理解为源代码的地址值?
equlas方法
Object类中的equlas方法
boolean equlas(Object obj);
使用==来比较两个对象是否相等,==比较的是地址值是否相等
System类
被final修饰,不能被继承
构造方法也被final修饰,不能创建对象
成员变量和成员方法被static修饰,可以直接用类名来调用
System类中的常用方法
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
* src: 源数组;
* srcPos: 指定从哪个索引位置开始复制
* dest: 目标数组
* destPos:指定目标数组接收元素的索引位置
* length: 目标数组接收元素的个数
注意:复制是注意数组长度,不要超出索引,否则会出现数组越界异常
static long currentTimeMillis();
以毫秒值返回当前系统时间
开始计算时间是0时区的1970年1月1日0时0分0秒,计算机元年
static void exit(int status);
终止当前正在运行的虚拟机
惯例:非0表示异常终止
System.currentTimeMills();
表示的是当前系统时间,1970-1-1至今的毫秒数
Date类的概述和构造
API中Date类下有一个子类也叫Date,这个子类是sql包下的类,今天学习的是java.util下的Date类
Date:表示的是特定的瞬间,精确到毫秒,他可以通过方法来设定自己所表示的时间,可以表示任意时间
已过时是什么意思
可能有缺陷,或者后来又有了新的更适合的方法,不推荐使用,但是也可以使用
构造方法
Date():创建的是一个表示当前系统时间的Date对象
Date(long date);根据 "指定时间"创建Date对象
设置的方法 setTime(long time);
毫秒值--->Date
返回值是void,参数long
void setTime(long time);
由于参数是long类型,所以传参的时候要是数字后面加L,因为eclipse默认的数字类型是int,(也可以不加吧,有隐式转换么不是?)
获取的方法 getTime();
Date--->毫秒值
返回值是long,没有参数
long getTime();
text包下的类大部分都是用来格式化的
SimpleDateFormat类
格式化:
Date-->String
String format(Date date);
解析
String --> Date
Date parse(String str);
有异常需要抛出
SimpleDateFormat功能测试
构造方法
SimpleDateFormat();使用默认的模式进行对象的构建
SimpleDateFormat(String pattern);使用指定的模式进行对象的构建
Calendar 类的概述和测试
Calendar: 日历,提供了一些操作年月日时的方法
操作:增删改查
查:int get(int field);field是字段值的意思,,
返回值是int类型
注意月份字段,获取的是0-11,而我们的习惯是1-12,所以,get完月份以后要记得+1!!
改: void set(int field, int value);一样注意字段值,功能是直接赋值
void add(int field, int value);他的功能也是改,是在原基础上增加或减少
注意value的值可以是负数,负数就是减少的操作
减少的值如果计算结果为负值,则月份会减1,28天的2月减完28天后会变成1月,31天的减完31天后会变成上个月,30天的减完30天后会变成上个月
包装类
包装类就是封装了基本数据类型的类,为我们提供了更多复杂的方法和一些变量
Integer:
String --> int
方法1: int intValue();
方法2: static int parseInt(String s);
方法3: static Integer valueof(String s);
int ---> String
方法1: +"";
方法2: String toString();
方法3: static String toString(int i);
Integer 的构造方法
Integer(int value);
Integer(String s);
自动装箱和自动拆箱
JAK 1.5 以后才有的功能
自动装箱和自动拆箱,就是把基本数据类型和他对应的引用数据类型之间的自动转换,
Integer int
charactor char
正则表达式
详见API中Pattern类
与JAVA无关,它就是一套独立的规则规范,可以用于匹配字符串,
方法
boolean matches(String regex);判断当前字符串是否匹配指定的正则表达式,如果匹配返回true,如果不匹配返回false;
字符
数量词
\转义符
集合体系结构
由于不同的数据结构(数据的组织,存储方式),所以Java为我们提供了不同的集合,但是不同的集合他们的功能都很相似,不断的向上提取,讲共性提取出来,这就是集合体系结构形成的原因
从最上学习,使用最下的具体实现类
Collection 接口
是单列集合体系的顶层
List
ArrayList
Collection 接口
常用功能
boolean add(E e); 添加元素
void clear(); 清空集合
boolean contains(Object o); 是否包含某个元素
boolean isEmpty();是否为空
boolean remove(Object o); 删除元素
int size();返回集合中的元素个数
Object[] toArray();将集合转换成一个Object类型的数组
Object[],可以存储任何类型,但是遍历的时候不知道该用何种类型接收,所以加个泛型,让他只存储一种类型,为了方便遍历
集合的遍历方式
转换成数组,有索引以后再遍历,用toArray()方法.
迭代器
迭代器
Iterator :可以用于遍历集合
方法
E next();:返回下一个元素
使用这个方法获取元素如果没有下一个元素,就返回一个异常(错误)
boolean hasNext();判断是否有元素可以获取
void remove();删除最后返回的元素
迭代器要先通过集合对象获取迭代器对象,集合对象调用iterator()方法来创建iterator对象
迭代器相当于把集合复制了一遍,然后操作这个复制品
迭代器是依赖于集合的,相当于集合的一个副本,当迭代器在操作的时候,如果发现和集合不一样,则抛出异常
并发修改异常 concurrentModificationException
使用迭代器进行遍历的时候使用迭代器来进行修改,千万不要用集合来修改
用迭代器来修改会同步修改集合
修改特指的是改变长度的修改
get/set方法不改变长度,无影响
Listiterator接口,有add方法,
泛型
由于集合可以存储任意类型的对象,当我们存储了不同类型的对象,就有可能在转换的时候出现类型转换异常,所以java为了解决这个问题,给我们提供了一种机制,叫做泛型
泛型:是一种广泛的类型,把明确数据类型的工作提前到了编译时期
好处:
避免了类型转换的问题
可以减少黄色警告线
可以简化我们代码的书写
什么时候可以使用泛型?
当在API或者源码中看到标志就表示可以使用泛型
foreach 的概述和测试
又名增强for循环
格式:
for(元素类型 变量名: 数组或集合对象){可以直接使用变量}
注意事项
在增强for循环中不能修改集合,会出现并发修改异常
增强for循环的底层就是迭代器
常见数据结构
结构
理解,详见jpg文件
热点
数组: 查找快,增删慢
链表: 查找慢,增删快
栈:先进后出.相当于程序中的嵌套的大括号,都是一个一个套进去的,程序都是由上往下执行,在main方法中,最先写的大括号,最后消失,最后写的大括号最先消失,
队列:先进先出,想当于程序中并列的大括号,程序都是由上往下执行,在main方法中,先写的会先消失,后写的会后消失
List的特点和特有功能
有序的(存储和读取的顺序是一致的)
有整数索引,可以通过索引提取元素
允许重复
特有功能
void add(int index, E elment): 在指定索引位置添加指定元素
E get(int index): 根据索引返回元素
E remove(int index):删除指定元素并返回
E set(int index, E element): 将指定索引位置的元素替换为指定元素,并将原先的元素返回
以上四个方法注意返回值
List的子类,LinkedList特有功能
ArrayList
底层是数组结构,查询快,增删慢
LinkedList
底层结构是链表,查询慢,增删快
如何选择使用不同的集合?
如果查询多,增删少,则使用ArrayList
如果查询少,增删多,则使用LinkedList
如果不知道使用什么,则使用ArrayList
LinkedList
特有功能
void addFirst(E e):将元素添加到索引为0的位置
void addLast(E e);将元素添加到索引为size()-1的位置
E getFirst():获取索引为0的元素
E getLast():获取索引为size()-1的元素
E removeFirst():删除索引为0的元素并返回
E removeLast():删除索引为size()-1的元素并返回
以上的方法可以模拟栈和队列的结构
泛型
泛型的类型擦除
泛型只是一种安全监测机制,只在编译时期有效
当源代码编译为class字节码文件后,代码中是不存在泛型的,这称之为泛型的类型擦除
泛型的定义位置
类 class Student
接口 interfac USB
方法
成员方法
静态方法,只能使用自己定义的泛型
泛型的边界
? 通配符,如果<?>系统会随机产生一个没有的类型,
?声明的时候用,实际使用的时候要用实际的类型
<? extends T> 父类T或者他的子类
?只能作为范围使用,不能作为具体的泛型使用,且单独使用的时候,编译完成后会自动生成一个没有定义的泛型,所以只能存储null,无意义,所以只能和extends或者implements配合使用,才能确定范围,才有意义!!
Set集合和Map 双列集合
Set集合
Set接口的特点:
元素无序(存储和读取的顺序有可能不一样)
元素不允许重复,元素唯一. 有且只能有一个null.add();返回值是boolean 类型,有可能添加不成功,返回值有可能是false,而List是肯定会添加成功的
没有索引!
HashSet类,是Set接口的实现类
add();方法是如何实现去重的
HashSet的add()方法,首先会使用当前集合中的每一个元素和新添加的元素进行hash值比较
如果hash值不一样,则直接添加新的元素
如果hash值一样,则继续与已有元素比较地址值或使用equals方法进行比较
如果比较结果一样,则认为重复,不添加
如果和所有的已有元素比较都不一样,则认为不重复,添加元素
先比较hash值,后比较地址值或者equals()方法比较
Set集合是无序的,调用equals()方法比较的顺序是不定的,所以调用equals方法的次数不定,
Collections
Collections和 Collection的区别
Collection 是集合体系的最顶层,包含了集合体系的共性
Collections是一个工具类,方法都是 用于操作Collection
方法
static int binarySearch(List list, Object key); 返回的是元素所对应的索引,有索引就只能用于List集合, 使用二分查找法查找指定元素在指定列表的索引位置.只能用于查找元素按自然顺序排列的集合,
static void copy(List dest, List src); 把源列表中的元素覆盖到目标列表,目标列表的长度要大于等于源列表.不同于遍历源列表,添加到目标列表,添加的话目标列表的元素不变,只是在后面继续添加源列表的元素,而覆盖是把目标的列表的元素替换.
static void fill(List list,Object obj);使用指定的对象填充指定列表的 所有元素
static void reberse(List list); 反转.
static void shuffle(List list); 随机置换:把List类的对象的元素随机打乱,
static void sort(List list); 按照列表中元素的自然顺序进行排序
注意有的没有自然顺序的要自定义自然顺序
static void swap(List list,int i, int j);将指定列表中的两个索引上的元素进行置换,
返回值类型 void,说明源参数列表中的参数发生了改变,有返回值的参数一般不发生改变(bufferedString中的append方法)
Map和Collection的区别
Mpa:是一个双列集合,常用于处理有对应关系的数据,key是不可以重复的,我们也称之为夫妻集合
Collection: 是单列集合,有不同的子体系,List允许重复且有序,Set不允许重复且无序
Map
Map: 双列集合,一个叫键(key),一个叫值(value),
Map,可不可以看做一个自定义索引的一个数组或者集合,键值相当于索引,value的值相当于集合中的元素?
将键映射到值的对象一个映射不能包含重复的键,每个键最多只能映射到一个值
键不可以重复,值可以重复
键是无序的
Map常用功能
添加功能
V put (K key, V value);就是将key映射到value,如果key存在,则覆盖value,并将原来的value返回;有返回值,返回的value的值
获取功能
int size();
V get(Object key)
判断功能
boolean containsKye(Object key);判断指定的key是否存在
boolean containsValue(Object value);判断指定的value是否存在
boolean isEmpty();判断是否有对应关系
删除功能
void clear();清空所有的对应关系
V remove(Object key);
遍历功能
Set keySet();以Set集合的形式返回所有的key
List values();
实现一个接口不是要实现这个接口的所有方法么?那么Values类为什么只实现了一部分?
Map的第一种遍历方式:
遍历所有的key,再根据key去找他对应的value;
Map的第二种遍历方式:
把key和value当做一个类的成员变量,然后创建这个类的对象,然后遍历这个对象组成的集合Map;
可变参数
当参数不确定时,
格式:
注意事项:
在可变参数之后不可再追加参数
可变参数只能是同一种数据类型
可变参数的定义位置必须在方法的形参列表的最后一个
异常
异常的产生和异常处理
异常的产生
异常:
不正常,我们在写代码的时候出现的 编译或者运行时的错误
系统异常(红字内容)包含了错误的类型,元音以及位置
异常的体系结构
Throwable(最顶层)
Error:出现的不能够处理的严重问题
Exception:出现的可以处理的问题
异常的处理方式
JVM默认的处理方式:
会把遗产的类型,原因,位置显示在命令行上,并 终止程序,且发生异常后的代码不会再执行
自己手动处理
捕获
try....catch语句
格式:
try{可能出现问题的代码}catch(异常类型的对象){处理方式}
执行顺序
首先执行try语句,异常下面的代码不再执行,直接跳入catch语句中,
catch语句结束后整个try...catch语句结束,继续执行后边的代码.如果
没有异常,try...catch语句结束,继续执行后边的代码.
有可能出现异常的语句中如果有变量,用try...catch语句只捕获变量,没有处理变量.则在catch执行完后,此变量不能再使用,如果在catch处理中对此变量进行了处理,则在语句结束后还可以继续使用
抛出去,让调用者去处理.
当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,
关键字: throws在方法的声明处抛出异常
多异常处理:
多层catch的时候,子类异常在上边,父类异常在下.
可以使用多个try...catch语句
可以使用一个try,多个catch语句.
多个catch之间可以有子父类关系,如果有子父类关系,则子类异常在上,父类异常在下.没有子父类关系的时候,放哪里都行.即平级异常关系没有先后执行顺序.
估计应该会用于一个语句可能会出现多个异常的时候使用,或者是调试的时候多条语句使用
JDK1.7以后可以在一个catch方法里边传入多个异常,中间用符号"|"来连接,后面接一个变量.
Throwable常用方法 & 自定义异常
异常处理是不是多用于软件测试类的开发
Throwable接口为异常的顶层
常用方法
String getMessage();返回异常原因
有详细原因的返回具体原因,没有详细原因的返回null.
String toString();返回类型和原因
void printStackTrace();和虚拟机返回的一样:类型,原因和位置
前两个有返回值,可以用常量接收,操作异常
打印结果由于是不同的输出流打印,可能结果不是按照顺序打印的.
finally的概述和应用场景
组合try...catch使用,用于 释放资源等收尾工作,无论try...catch语句如何执行,finally一定会执行,
和try...catch组合应用,放在catch后面
异常的分类
编译时异常
在编译时期必须处理
捕获try...catch
抛出; throws
运行时异常
RuntimeException的子类就是运行时异常,在编译时期可以选择处理或者不处理
自定义异常
throws : 处理异常的一种方式,由调用者来处理异常
throw : 制造异常的方式,并且结束程序.抛出的是一个异常对象,throw后面跟一个new出来的对象
如果抛出的是编译时期异常,必须在方法声明处抛出(throws),
如何自定义一个异常类?
写一个类去继承Exception或者RuntimeException,然后实现多个构造即可
递归
把大问题拆成很小问题,把小问题拆成小小问题,知道有能解决的小问题为止,拆问题的方法要相同,
注意事项:
递归一定要有出口,(要有能解决的小小问题),否则会没有结果,程序会一只运行,知道内存溢出,系统崩溃
递归次数不宜过多,内存溢出
StackOverFlow 解决编程问题网站
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2