47.重载和重写的区别,自己的语言描述:
重载是在同一个类中的相同名字的方法,而参数列表不同所形成的.
重写是发生在有继承关系的类中,子类继承父类的方法然后对父类的方法进行重写,是因为父类满足不了需求,需要重写.重写必须有相同的方法名,相同的返回值类型,
相同的参数列表.重写的方法不能比被重写的方法有更低的访问权限.重写的方法不能比被重写的方法抛更广的异常.父类的构造方法和私有方法不能被重写.静态的方法不存在重写

  1. 工具类
    (1) 排序算法: sort()方法,可以排序。静态方法,直接使用类名调用就行。Arrays.sort();
    冒泡排序算法
    选择排序算法:
    选择排序比冒泡排序的效率高。高在交换位置的次数上。选择排序的交换位置是有意义的。
    循环一次,然后找出参加比较的这堆数据中最小的,拿着这个最小的值和最前面的数据“交换位置”。
    查找算法:binarySearch
    二分法查找:二分法查找建立在排序的基础之上。二分法查找效率要高于“一个挨着一个”的这种查找方式。
    (2) Arrays是一个工具类。 java.util.Arrays 1.构造方法私有化 2. 成员方法都是静态的
    (3) 正则表达式(独立的学科),主要可以用来做字符串处理,可以描述特定的字符模式,如:”a{2}”表示由两个字符“a”构成的字符串,
    等同于普通字符串“aa”,如”\d”代表任意一个数字 0~9, \D 代表所有的非数字,\w 代表所有的英文字母,\W 代表所有的非英文字母。
    public boolean matches(String regex),返回此字符串是否匹配给定的正则表达式。
    public String replaceAll(String regex, String replacement)使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。

***49. 类型转换
(1)int,String相互转换
1) int类型转string :
valueOf() String s1 = String.valueOf(s); //s为数字
或用+" "
2) String类型 -> int类型
•String -> Integer -> int思路来实现. Integer i1 = new Integer(s); int num = i1.intValue(); //s为字符串
•通过Integer #parseInt()方法来实现. int num = Integer.parseInt(s);
3)
把基本类型的数据封装成其对应的包装类型, 则称之为自动装箱. Integer ii = 100; //自动装箱.
把包装类型的对象拆解成其对应的基本类型, 则称之为自动拆箱. Integer ii = 100; i1 += 200; 可以将integer类型当int类型用
注意:自动拆装箱都是JDK5的新特性
(4) SimpleDateFormat类, 叫日期格式化类, 专门用来格式化和解析日期的.
• 格式化(日期 -> 文本), 即: Date -> String String format(Date date)
将date以我们给定的规则转为一个String类型的时间
• 解析(文本 -> 日期), 即: String -> Date Date parse(String 时间) 将String时间转为Date
注意:如果我们给定的规则与实际时间规则不一致:会出现ParseException异常:解析异常 选择将异常添加到方法上
• public final String format(Date date) 解释: 用来格式化日期的.
• public Date parse(String source) 解释: 用来解析字符串形式的日期的.
(5) Calendar类叫: 日历类, 是方便我们操作日期的. 它里边的功能大多数是用来替代java.util.Date类的功能的. (抽象类)
成员变量 (都是静态变量,用类名. 的方式访问)
• public static final int YEAR 解释: 表示年份.
• public static final int MONT 解释: 表示月份.
• public static final int DATE 解释: 表示年中的某一天.
• public static final int DAYOFMONTH 解释: 表示月中的某一天.
• public static final int DAYOFWEEK 解释: 表示星期中的某一天.
成员方法(要创建对象 )
• public static Calendar getInstance(); 解释: 创建Calendar类型的子类对象.
• public int get(int field) 解释: 根据日历字段, 获取其对应的值.
• public void set(int year, int month, int day) 解释: 设置时间为指定的年, 月, 日.
• public void add(int field, int count) 解释: 修改指定的时间为指定的偏移量, 例如: 往前推2天, 推3个月, 往后推2年.
(6)Integer是int基本数据类型的包装类,在使用-128~127之间的数是调用缓存区的,超过127的话是相当于new了一个新对象.

50.String变成int[]类型的数组并排序
1. String -> String[] String#split(); String[] str = s.split(" "); 把字符串转成其对应的字符串数组.
2. String[] -> int[] Integer.parseInt(); [parseInt(String s) 将字符串参数作为带符号的十进制整数。 ]
int[] arr = new int[str.length]; 定义和字符串数组长度一模一样的int[]
遍历字符串数组, 获取到每一个字符串.
for (int i = 0; i < arr.length; i++) {//把对应的字符串类型的整数转成其对应的 int类型的整数, 并填充到int[]中.
arr[i] = Integer.parseInt(strArray[i]);}
3. 对int[]数组进行排序. Arrays.sort()
4. int[] -> String StringBuilder, 遍历

51.集合 Collection接口 集合是用来存储多个同类型数据的容器, 它的长度是可以变化的.重写了toString方法]
(1) 集合的顶层都是接口, 其中Collection接口是单列集合的顶层接口, Map接口是双列集合的顶层接口
(2) Collection接口(单列集合)有两大子体系:
List体系的特点是: 有序, 可重复
Set体系的特点是: 无序, 唯一
(3) 因为Collection是接口,我们可以通过多态的方式, 创建其子类对象, 从而实现创建Collection接口对象.
*** Collection list = new ArrayList();
[在jdk1.7之前两边都得加泛型,在jdk1.7之后可以只在左边加,但是右边的括号不能省]
解释:
1. 集合后边的<数据类型>是泛型的意思, 泛型是用来限定集合中存储元素的数据类型的.
(不用泛形,集合可以存储任意类型) 泛型只能使用引用数据类型,无法使用基本数据类型.
2. 例如:
–Collection说明集合中只能存储字符串.
–Collection说明集合中只能存储整数.
泛型只能是引用数据类型, 且在实际开发中, 泛型一般只结合集合来一起使用
*** (4)常用方法 [增删改查]
• public boolean add(E e) 添加元素.
• public boolean remove(Object obj) 从集合中移除指定的元素.
• public void clear() 清空集合对象
• public boolean contains(Object obj) 判断集合中是否包含指定的元素
• public boolean isEmpty() 判断集合是否为空 [集合没用内容就返回true,有则返回false]
• public int size() 获取集合的长度, 即集合中元素的个数
** (5) 迭代器 对象.iterator()
public Iterator iterator() //根据集合对象, 获取其对应的迭代器对象.
解释:
1. 因为Iterator是接口, 所以这里返回的其实是Iterator接口的子类对象.
2. 迭代器是依赖于集合而存在的.
•Iterator迭代器中的方法
public boolean hasNext() //判断迭代器中是否还有下一个元素.
public E next() //获取迭代器中的下一个元素.
(6) 总结: 集合的使用步骤
集合的步骤可以分为四大步三小步, 具体如下:
1. 创建集合对象.
2. 创建元素对象.
3. 把元素添加到集合中.
4. 遍历集合
1).根据集合对象获取其对应的迭代器对象. Iterator<泛型> name1 = name2.iterator();
通过Collection#iterator()方法实现.
2).判断迭代器中是否有下一个元素.
通过Iterator#hasNext()方法实现.
3).如果有, 就获取该元素.
通过Iterator#next()方法实现.
注意: next方法用几次会导致hasnext方法跳到该对象的下一次.

  1. list 集合特有的
    (1) 特点: 有序,可重复,有索引
    (2) 常用方法独有 [还继承Collection里面的方法]
    • public void add(int index, E element)
    解释: 在集合的指定位置(索引), 插入指定的元素, 索引越界会报IndexOutOfBoundsException异常.
    • public E remove(int index)
    解释: 删除指定索引处的元素, 并返回被删除的元素, 索引越界会报IndexOutOfBoundsException异常.
    • public E set(int index, E element)
    解释: 修改指定索引处的元素为指定的值, 并返回修改前的元素, 索引越界会报IndexOutOfBoundsException异常.
    ** • public E get(int index)
    解释: 根据索引, 获取其对应的元素, 索引越界会报IndexOutOfBoundsException异常.
    (3) 遍历集合 for循环 + size() + get()的形式, 遍历List集合.
    (4) 列表迭代器指的是ListIterator接口, 它是List集合特有的迭代器.该迭代器继承了Iterator迭代器
    • List集合中的成员方法
    public ListIterator listIterator() //根据List集合对象, 获取其对应的列表迭代器对象.
    • ListIterator迭代器中的成员方法 [倒着遍历得先正向遍历才能倒向遍历]
    public boolean hasPrevious() //判断列表迭代器中, 是否有上一个元素.
    public E previous() //获取列表迭代器中的上一个元素.
    (5) 当使用普通迭代器(Iterator)遍历集合的同时, 又往集合中添加元素, 就会报并发修改异常.
    迭代器依赖于集合而存在, 在判断成功后, 集合中添加了新的元素, 而迭代器并不知道, 所以就报错了
    其实这个问题说的是: 迭代器遍历集合中的元素时, 不要使用集合对象去修改集合中的元素 .
    •列表迭代器解决
    细节一: 必须使用列表迭代器中的添加元素的方法. ListIterator#add(); [先new对象]
    细节二: 这种方式添加的元素是在刚才迭代到的元素后边的
    •通过for循环 + size()方法来解决.
    细节一: 这种方式添加的元素是在集合的最后位置添加的
    注意:在用for循环删除元素的时候要小心集合的长度变动导致漏删. 用i–或倒着遍历解决
    (6) List集合是一个接口, 它的常用子类有两个, 分别是:ArrayList, LinkedList.
    • ArrayList集合的特点: 底层数据结构是数组, 查询和修改快, 增删慢
    • LinkedList集合的特点: 底层数据结构是链表, 查询和修改慢, 增删快

**53. LinkedList的特有方法
LinkedList集合主要是用来操作头和尾元素的, 所以它里边定义了大量这类的方法, 常用的方法如下:
• public void addFirst(E e) 往列表的开头插入指定的元素
• public void addLast(E e) 往列表的末尾插入指定的元素
• public E removeFirst() 删除列表中的第一个元素, 并返回被删除的元素
• public E removeLast() 删除列表中的最后一个元素, 并返回被删除的元素.
• public E getFirst() 返回列表的第一个元素
• public E getLast() 返回列表的最后一个元素

54.增强for
(1) 概述:增强for是JDK1.5的新特性, 它是用来简化数组和Collection集合的遍历的.
(2) 格式
for(元素的数据类型 变量名 : 数组或者Collection集合对象) {
//上述的 变量名 代表的就是, 数组或者Collection集合中的每一个元素.}
(3) 好处
增强for是用来简化数组和Collection集合的遍历的.
注意事项:要通过增强for遍历的数组或者Collection集合,不能为null.即:增强for的目标要判断是否为null.
增强for的底层是一个: 迭代器

55.Set集合 :Set集合是Collection集合的子体系, 它的元素特点是无序, 唯一 ,没用索引
(1) 1.Set集合是一个接口, 所以不能通过new的方式直接创建它的对象
2. Set集合中没有带索引的方法, 所以不能通过普通for循环遍历
3. Set集合的常用子类主要有两个, 分别是HashSet集合和TreeSet集合
(2) 唯一性:是将数据存储到hash里面的map ,先跟集合中存储的元素比较hash值,hash值不一样就存储,一样在比较地址值,地址值一样就不存储,
地址值也不一样在看存储进来的是否为空,不为空在比较内容,内容不一样就存储,一样就不存储.
使用该方法就是为了降低调用equals()方法的次数, 从而实现 节约资源, 提高效率!
(3) HashSet集合
1.底层数据结构是哈希表
2. 对集合的迭代顺序不做任何保证, 也就是说不保证元素的存取顺序一致
3. 没有带索引的方法, 所以不能通过普通for循环遍历
4. 由于是Set集合, 所以是不包含重复元素的集合
总结: HashSet集合的特点是: 无序, 唯一, 元素无索引, 它的底层数据结构是: 哈希表
(4)LinkedHashSet 有序,唯一 (跟hashset 其他用法一样)

  1. 可变参数
    (1)格式 参数列表中 参数类型… 变量名
    (2)特点:
    1.可以接受任意个实参
    2.底层就是一个数组,可以接受一个数组,也可以将他作为数组使用
    3.可变参数必须在参数列表最后一个,也只能有一个
    4.当传入的参数过多时,可以将其封装成一个数组在传入,提高了代码的可阅读性

57.Map集合 语法: public interface Map<K, V> //K: 键的类型, V: 值的类型 需要new对象
(1)Map集合是双列集合的顶层接口, 它是用来存储键值对对象的, 其中键具有唯一性,而值是可以重复的.hashtable不能存储null值.
即: Map集合的数据结构只针对于键有效
(2)因为Map是接口,不能通过new关键字直接创建它的对象,我们可以通过多态的形式,创建其子类对象.
注意: Map集合的常用子类主要有两个, 分别是: HashMap和TreeMap.
(3)public V put(K key, V value) key:无序,唯一,可以存储null(一个) value:可以重复
解释:
1. 往双列集合中添加元素, 键不存在则直接添加, 并返回null
2. 键存在则用新值覆盖旧值, 并返回被赋值之前的值
** (4)方法名 说明
V put(K key,V value) 添加元素
V remove(Object key) 根据键删除键值对元素 [返回的是删除后的value值数据]
void clear() 移除所有的键值对元素
boolean containsKey(Object key) 判断集合是否包含指定的键
boolean containsValue(Object value) 判断集合是否包含指定的值3
boolean isEmpty() 判断集合是否为空
int size() 集合的长度,也就是集合中键值对的个数
V get(Object key) 根据键获取值
Set keySet() 获取所有键的集合
Collection values() 获取所有值的集合
Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合 Set<Map.Entry<K,V>> set=对象.entrySet ;
(5)HashTable 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。
为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法
(6)两种常规Map性能
hashmap基于哈希表实现.使用HashMap要求添加的键类明确定义了hashCode()和equals()[重写这2种方法],为了优化HashMap空间的
使用,可以调优初始容量和负载因子。TreeMap是基于红黑树实现.TreeMap没有调优选项,因为该树总处于平衡状态。
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
总结:HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。
(7)在集合体系结构中提供了可以排序的集合:TreeSet、TreeMap
存储的元素会根据指定的规则自动进行排序
排序的方式有两种:1.自然排序 2. 比较器排序(Comparator) //强制排序
小结:在TreeSet集合中,存在两种排序方式:
1、自然排序。要实现自然排序,存储的元素自身就必须是实现Comparable接口
2、比较器排序。要实现比较器排序,需要依赖于Comparator接口在向TreeSet集合中存储String类型、Integer类型或Double时,这些类型都已经实现了
Comparable接口,并重写了该接口中的comparaTo方法在Comparable接口中,具有一个抽象方法:comparaTo()

58.Collections类是针对集合操作的工具类
(1)public static void sort(List list) 将指定的列表按升序排序
(2)public static void reverse(List<?> list) 反转指定列表中元素的顺序
(3)public static void shuffle(List<?> list) 使用默认的随机源随机排列指定的列表 [类似洗牌操作]

***59. Lambda表达式 [jdk1.8之后]
(1)函数式编程思想:函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做” 而我们要学习的Lambda表达式就是函数式思想的体现.
(2)Lambda表达式的标准格式: (形式参数) -> {代码块}
• 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
• ->:由英文中画线和大于符号组成,固定写法。代表指向动作
• 代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
• 组成Lambda表达式的三要素:形式参数,箭头,代码块
前提:有一个接口, 且接口中有且仅有一个抽象方法
(3)省略的规则
• 参数类型可以省略。但是有多个参数的情况下,不能只省略一个
• 如果参数有且仅有一个,那么小括号可以省略
• 如果代码块的语句只有一条,可以省略大括号和分号,和return关键字
(4)注意事项:
Lambda表达式使用,需要有上下文环境,不能单独使用.必须有上下文环境,才能推导出Lambda对应的接口.
根据局部变量,调用方法的赋值得知Lambda对应的接口 [赋值,调用方法]
(5)Lambda表达式和匿名内部类的区别:
•所需类型不同
–匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
–Lambda表达式:只能是接口
• 使用限制不同
–如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
–如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
• 实现原理不同
–匿名内部类:编译之后,产生一个单独的.class字节码文件
–Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成

60.异常 try.catch.finally
(1)格式: try{ // 可能出问题的代码 } catch(Exception e) { e.printStackTrace() }finally {一般来说永远都会运行}
(2)java中异常的作用是:增强程序健壮性. java中异常以类和对象的形式存在.
java后台打印异常堆栈追踪信息的时候,采用了异步线程的方式打印
try里面可以写return语句,如果有finally的话,先执行finally里的,在执行return语句.
(3)异常在java中以类和对象的形式存在。那么异常的继承结构是怎样的
Object
Object下有Throwable(可抛出的)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下有两个分支:
Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常)
RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行)
(4)编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
编译时异常因为什么而得名?
因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。
所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。
因为异常的发生就是new异常对象。
(5)编译时异常和运行时异常的区别?
编译时异常一般发生的概率比较高.对于一些发生概率较高的异常,需要在运行之前对其进行预处理
运行时异常一般发生的概率比较低
(6)其他名字:
编译时异常还有其他名字: 受检异常:CheckedException 受控异常
运行时异常还有其它名字: 未受检异常:UnCheckedException 非受控异常
(7)Java语言中对异常的处理包括两种方式:
第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。谁调用我,我就抛给谁。抛给上一级。
第二种方式:使用try…catch语句进行异常的捕捉。这件事发生了,谁也不知道,因为我给抓住了。
注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行。
(8)catch后面的小括号的类型可以是具体的异常类型,也可以是该异常的父类.
catch 可以写多个,建议catch的时候,精确的一个一个处理,有利于程序的调式. 写多个的时候,从上到下,从小到大[先写子类]的原则.
(9)jdk8新特性
try{试运行的代码}catch(NullPointerException | ArithmeticException){ sout (“打印信息”);} catch里面可以写多个异常
(10)java怎么自定义异常
1)编写一个类继承Exception或者RuntimeException.
2)提供2个构造方法,一个无参数的,一个带有String参数的.
直接new MyException(“打印信息”) 这个对象,然后在 e.printStackTrace(); 就可以打印信息了. [ MyException 自己命名的自定义子类异常]
*** 或者直接在 throw new MyException(“打印信息”);

61.FILE类
(1)介绍:是文件和目录路径名的抽象表示.文件和目录是可以通过File封装成对象.对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已
(2)File类的构造方法
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例
(3)File方法
1.创建方法
public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
public boolean mkdir() 创建由此抽象路径名命名的目录
public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
2.判断方法
public boolean isDirectory() 测试此抽象路径名表示的File是否为目录
public boolean isFile() 测试此抽象路径名表示的File是否为文件
public boolean exists() 测试此抽象路径名表示的File是否存在
3.获取方法
public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 [返回此抽象路径名的绝对路径名字字符串]
public String getPath() 将此抽象路径名转换为路径名字符串 [写的什么路径就拿什么路径]
public String getName() 返回由此抽象路径名表示的文件或目录的名称 [拿路径最后一个文件或文件名]
public String[] list() 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 [拿当前路径下所有的文件及目录]
public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组 [返回当前目录下的所有文件与目录]
4.删除方法
public boolean delete() 删除由此抽象路径名表示的文件或目录 [删除某个文件或为空的目录]