基础加强阶段:1、Object.
§ 是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object
○ toString 返回该对象的字符串表示
§ 只要打印对象就是在调用父类toString
2、equals
§ equals 指示其他某个对象是否于此对象“相等”
§ equals比较引用类型,没有覆写 比较的是地址值
§ equals一般用以比较两个对象的内容 == 比较基本类型的值和对象的地址
§ 一般字符串之间的比较用equals 因为String类已经覆写了equals
3、Objects
§ Objects 类的qeuals方法:对两个对象进行比较,防止空指针异常
§ null调用方法会报空指针异常
4、日期时间类
§ Date类表示特定的瞬间,精确到毫秒
§ currentTimeMillis 获取当前系统时间到时间原点经历的多少毫秒(中国属于东八区,加八个小时为1970.1.1 08:00:00)
5、DateFormat类(抽象类)
§ 直接子类;SimpleDateFormat格式化:日期->文本 解析 文本->日期
格式化格式(format) 1、(创建对象) SimpleDateFormat XXX = new SimpleDateFormat(模板);
2、调用 Date X= new Date ; String text = XXX. Format(Date)
§ parse方法声明了一个异常叫ParseException
6、(日历类)Calendar类(抽象类)
§ calendar类无法直接创建对象使用,里面有一个静态方法,getInstance(),该方法返回了Calendar类的子类对象
§ 常用的方法
一、Public int get (int field )返回给定的日历字段值
二、public void set(int field, int value):将给定的日历字段设置为给定值。
三、public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
四、public Date getTime():返回一个表示此Calendar时间值
(从历元到现在的毫秒偏移量)的Date对象。
§ 成员方法的参数:
int field:日历类的字段,可以使用Calendar类的静态成员变量获取
public static final int YEAR = 1; 年
public static final int MONTH = 2; 月
public static final int DATE = 5; 月中的某一天
public static final int DAY_OF_MONTH = 5;月中的某一天
public static final int HOUR = 10; 时
public static final int MINUTE = 12; 分
public static final int SECOND = 13; 秒
7、System类
§ 提供了大量的静态方法,可以获取与系统相关的信息或系统级操作在System类的API文档中,常用的方法有:
- public static long currentTimeMillis():返回以毫秒为单位的 当前时间(用来测试程序的效率)。
- public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length): 将数组中指定的数据拷贝到另一个数组中。
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。
§ Arrays.toString ();遍历数组
8、StringBuilder类:字符串缓冲区,可以提高字符串的操作效率(看成一个长度可以变化的字符串)底层没有被final修饰
§ String字符串相加内存中就会有多个字符串,占用内存空间多,效率低。
StringBuilder在内存中始终是一个数组,占用空间少,效率高,如果超出了StringBuilder的容量会自动扩容。
§ StringBuilder类的成员方法:
public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身。
○ append无需接收返回值
○ 链式编程:方法的返回值是一个对象,可以根据对象继续调用方法
例子:bu1.append("abc").append(1).append(true).append(8.8).append('中');
§ toString
String->StringBuilder:可以使用StringBuilder的构造方法
StringBuilder(String str) 构造一个字符串生成器,并初始化为指定的字符串内容。
StringBuilder->String:可以使用StringBuilder中的toString方法
public String toString():将当前StringBuilder对象转换为String对象。
例子:public class Demo03StringBuilder {
public static void main(String[] args) {
//String->StringBuilder
String str = "hello";
System.out.println("str:"+str);
StringBuilder bu = new StringBuilder(str);
//往StringBuilder中添加数据
bu.append("world");
System.out.println("bu:"+bu);
//StringBuilder->String
String s = bu.toString();
System.out.println("s:"+s);
8、包装类
§ Integer是一个类
§ 装箱:把基本类型的数据,包装到包装类型中(基本类型的数据->包装类)
○ 构造方法: Integer(int value) 构造一个新分配的 Integer 对象,它表示指定的 int 值。
Integer(String s) 构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
传递的字符串,必须是基本类型的字符串,否则会抛出异常 "100" 正确 "a" 抛异常
○ 静态方法:
static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。
static Integer valueOf(String s) 返回保存指定的 String 的值的 Integer 对象。
§ 拆箱:在包装类中取出基本类型的数据(包装类->基本类型的数据)
成员方法:
int intValue() 以 int 类型返回该 Integer 的值。
§ 自动装箱 Integer in =1;相当于 Integer in = new Integer(1)
自动拆箱in = in +2;in +2相当于in.intValue() +2=3.
Integer比较-128~127之间的数字 可以用==应为地址相同 因为存在常量池
9、基本基本类型与字符串的转换
基本类型-->字符串
1.基本类型数据的值+"" 最简单的方式(工作中常用)
2.使用包装类中的静态方法
static String toString(int i) 返回一个表示指定整数的 String 对象。
3.使用String类中的静态方法
static String valueOf(int i) 返回 int 参数的字符串表示形式。
字符串-->基本类型
使用包装类的静态方法parseXX("字符串")
Integer类: static int parseInt(String s)
Double类: static double parseDouble(String s)
第二天:一、Collection集合
§ 集合、数组的区别
○ 集合:的长度是可以变化的,提供了各种方法,集合储存的是对象,对象的类型可以不一样。
○ 数组的长度是固定的,储存的是同一类型的元素,可以储存基本数据类型。
§ 集合框架
集合按照其存储结构可以分为两大类,分别是单列集合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集合常用的方法
○ Collection接口所有单列集合最顶层的接口,里边定义了所有单列集合共性的方法。任意的单列集合都可以使用Collection集合中的方法
○ 共性的方法:
- public boolean add(E e): 把给定的对象添加到当前集合中 。
- public boolean remove(E e): 把给定的对象在当前集合中删除。
- public boolean contains(E e): 判断当前集合中是否包含给定的对象。
- public boolean isEmpty(): 判断当前集合是否为空。
- public int size(): 返回集合中元素的个数。
- public Object[] toArray(): 把集合中的元素,存储到数组中。
- public void clear() :清空集合中所有的元素。
二、迭代器(Iterator<E>接口.通用取出集合元素的方式)
§ 两个常用的方法:
○ Boolean hasNext()判断是否达到集合的末尾是就返回false 不是就返回true
○ E next() 取出集合中的元素
○ Iterator是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象, 获取元素的方式比较特殊。Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象。Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。
§ 迭代器的使用步骤(重点):
1.使用集合中的方法iterator(),获取迭代器的实现类对象,使用Iterator接口接收实现类(多态)
2.使用Iterator接口中的方法hasNext判断是否到达了集合的末尾
3.使用Iterator接口中的方法next取出集合中的元素
优化:循环
while (it.hasNext()){
String s = it.next();
System.out.println(s);
}
增强for循环(foreach)
for(String s:集合){
sout
}(底层就是迭代器)
§ 迭代器的实现原理:
coll.iterator获取迭代器的实现类对象,并且会把指针(索引)指向集合的第一个元素(0号索引)
It.hasNext()判断是否到集合末尾
It.next 1 .取出当前指针指向的元素 2.会把指针向后移动一位。
§ 迭代器的并发修改异常:ConcurrentModificationException
在使用迭代器的过程中,修改了集合的长度(添加元素,删除元素),就会抛出并发修改异常
并发:两件事情同时发生(1.迭代,2.修改集合长度)
并发修改异常的解决方法:
1.在迭代的过程中,不对集合的长度进行修改
2.了解:
Iterator接口有一个子接口ListIterator接口(只有List接口下边的集合可以使用)
ListIterator接口中定义了add方法和remove方法,可以对集合添加/删除元素
如果使用ListIterator接口中的add/remove方法对集合添加/删除元素,那么迭代器自己添加/删除的,就不会抛出异常了
在创建集合的时候会创建一个修改值,默认是0,修改值会在每次改变集合长度的时候+1。
创建迭代器对象的时候,会将集合的修改值复制一份给迭代器对象
每次调用next()获取元素的时候,都会去对比迭代器中的复制的那份期望修改值集合中的修改值是否一致,如果不一致,就会抛出并发修改异常
三、泛型
§ 泛型是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型。泛型也可以看成一个变量,用来接收数据类型 E e:Element元素
集合什么都能装,泛型规范了集合放的数据类型
创建集合对象的时候,就会确定泛型的数据类型(会把数 据类型作为参数传递,把数据类型赋值给泛型E
§ 创建集合对象,使用泛型
好处:
1.避免了类型转换的麻烦,存储数据是什么类型,取出数据就是什么类型
2.把运行期异常(代码运行之后会抛出异常),提升到了编译期(写代码的时候会报错)
弊端:
泛型是什么类型,只能存储什么类型的数据
○ 创建集合对象,不使用泛型
好处:
集合不使用泛型,默认的数据类型就是Object类型,可以存储任意数据类型的数据
弊端:
不安全,会引发异常
§ 含有泛型的方法
§ 含有泛型的接口
§ 泛型的通配符:
?:代表任意的数据类型
使用方式:不能创建对象使用,之恩最为方法的参数使用。
注意事项:泛型没有继承概念
○ 受限泛型
泛型的上限格式:类型名称<? extens 类 对象名称>
只能接收该类型及其子类
泛型的下限格式:类型名称<? super 类 对象名称>
只能解释该类型及其父类
§ 集合工具类 static void shu
第三天:
一、数据结构
§ 数据结构_栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其 他任何位置进行添加、查找、删除等操作。
特点:
○ 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。
○ 栈的入口、出口的都是栈的顶端位置
§ 数据结构_队列::queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入, 而在表的另一端进行删除。
特点:
○ 先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。
○ 队列的入口、出口各占一侧。
§ 数据结构_数组:是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素
特点:
○ 查找元素快:通过索引,可以快速访问指定位置的元素
○ 增删元素慢 指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根 据索引,复制到新数组对应索引的位置。
§ 数据结构_链表::linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每 个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
特点:
○ 多个结点之间,通过地址进行连接
○ 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素 (链表中的地址不是连续的,每次查询原属,都需从头开始)
○ 增删元素快: 增加元素:只需要修改连接下个元素的地址即可。(增加/删除一个元素,对链表整体没有影响)
○ 单向链表:链表中只有一条链子,不能保证元素的顺序(存储远和取出元素的顺序可能不一致)
○ 双向链表:链表中有两条链子,有一条链子是专门记录元素的顺序,是一个有序的集合
§ 数据结构_红黑树:
○ 二叉树binary tree ,是每个结点不超过2的有序树(tree) 。简单的理解,就是一种类似于我们生活中树的结构,只不过每个结点上都多只能有两个子结点。
○ 查询速度非常的快
二、list集合
§ List<E>接口:特点:1、有序的集合,存储元素和取出元素的顺序是一致的
2、有索引,包含了一些带索引的方法
3、允许存储重复元素
§ list接口带索引常用方法:
○ public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
○ public E get(int index) :返回集合中指定位置的元素。
list集合遍历数组 三种方式:
1、使用普通的for循环
for(int i=0; i<list.size(); i++){
//public E get(int index):
String s = list.get(i);
System.out.println(s);
2、使用迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
3、使用增强for
for (String s : list) {
System.out.println(s);
○ public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
○ public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
操作索引时一定要防止索引越界异常
§ Linkedlist集合
集合数据存储的结构是链表结构。方便元素添加、删除的集合。 注意:使用LinkedList集合特有的方法,不能使用多态
§ LinkedList提供了大量首尾操作的方
public void addFirst(E e) :将指定元素插入此列表的开头,等效于push。
public void push(E e) :将元素推入此列表所表示的堆栈。
public void addLast(E e) :将指定元素添加到此列表的结尾,等效于add.
public E getFirst() :返回此列表的第一个元素。 public E getLast() :返回此列表的后一个元素。
public E removeFirst() :移除并返回此列表的第一个元素。 public E removeLast() :移除并返回此列表的后一个元素。 public E pop() :从此列表所表示的堆栈处弹出一个元素。
public boolean isEmpty() :如果列表不包含元素,则返回true。
§ ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快.LinkedList 元素增删快,查找慢.
§ Vector集合(底层数组,单线程)
三、Set接口(集成了Collection,无序,不可重复元素,没有带索引方法,不能使用普通的for循环遍历)
§ HashSet(底层是数组、链表、红黑树)集合特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)
§ 数据结构_哈希表
○ Hash Set 哈希值 = 数组+链表 哈希值 = 数组+红黑树(查询速度快的原因就是使用了此结构)
○ Public native int hashCode();返回对象的哈希码值(方法是获得哈希值,native表示调用的是本地操作系统的方法)
○ 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)
○ Set集合不能存储重复元素的原因:调用ADD方法时,add方法会调用元素的hashCode方法和equals方法判断元素是否重复。(必须重写hashCode方法和equals方法)
§ HashSet存储自动有类型元素:给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保 证HashSet集合中的对象唯一
§ LinkedHashSet集合特点:底层是一个哈希表(数组+链表/红黑树)+链表(记录元素的储存顺序,保证元素有序)
§ 可变参数:
使用前提:
当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数.
使用格式:定义方法时使用
修饰符 返回值类型 方法名(数据类型...变量名){}
可变参数的原理:
可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
传递的参数个数,可以是0个(不传递),1,2...多个
○ 可变参数的注意事项
1.一个方法的参数列表,只能有一个可变参数
2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
○ 四、Collections
常用功能:
○ public static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素。
○ public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。
○ public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。
○ public static <T> void sort(List<T> list,、Comparator<? super T> ) :将集合中元素按照指定规则排 序。
§ Comparator比较器
方法:public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。
|
|