初识
JDK(开发包)
JRK(运行环境)
解释型语言
数据类型:
基本数据类型:byte short int(默认) long float double(默认) char boolean
引用数据类型:类 接口 数组
扩展:
BigDecimal 字符扩展(金融)
变量与常量(final)
运算符
算数 赋值 关系 逻辑
位(& | ^ ~ >> << >>>)
条件( ? : )
包机制:
域名倒写,防止命名冲突,package import
流程控制
顺序结构
选择结构: if if-else if-esle if-else swich(jdk7支持了字符串,break default case)
循环结构: while do…while for for-each 注意:一般可记数用for,不可记用while
break & continuce (跳出循环--------终止当次循环)
return (结束方法的运行)
方法
创建:
修饰符 返回值 方法名 (参数一,参数二…){方法体;return f返回值; }
调用:
类名.方法
对象名.方法
方法重载:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
方法覆盖:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
重载(Overload)和重写(Override)的区别?
答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。
递归:
public static void main(String[] args) { //创建主函数
int n = 3; //求n的阶乘
int tmp = fac(n); //调用函数
System.out.println(tmp); //打印3的阶乘
}
public static int fac(int n){
if(n==1){ //设立结束条件
return 1; //如果n=1那就返回1
}
return n*fac(n-1); //如果n不等于1那就返回n*fac(n-1)继续调用函数直到n=1
}
数组
**Arrays工具类:**操作数组
排序算法:
冒泡排序:
面向对象
对象与类
构造方法
new 对象 (栈存放引用,堆存放具体的对象)
三大特性:
封装:属性私有,提供get set方法
继承:子类继承父类所有的非私有方法和属性(extends) this super
多态:父类的引用指向子类的对象(instanceof)
修饰符:
public protected default private static final abstract
抽象类:
接口:
1、子类实现接口,必须重写其中的方法
2、只有一个方法的接口叫做函数式接口,可以用lambda表达式简化
3、一个类可以实现多个接口
内部类:
异常
Throwable --> Exception -->运行时异常
-->Error
try{}
catch()
finally{}
throw 手动抛出异常
throws 方法抛出异常
继承Exception 自定义异常
常用类
Object Math File 包装类 Date类 String类 StringBuffer Stringbuilder(不安全)
集合框架
List:排列有序,可重复
- ArrayList
- 底层是数组,查询快(地址连续)、增删慢、线程非安全
- 初始量为10,每次扩容为1.5倍,扩容后使用copyOf()进行拷贝
- 使用add方法,首先检查是否越界,是则需要进行扩容处理(调用grow()方法)
- 使用remove()方法时,先删除该元素,然后拷贝其后面的所有元素,相当于全部前移移位,删除效率低
- LinkedList
- 底层是双向链表,查询慢,增删快。 2. 包含大量操作首尾的方法。
- unlink(x) 完成对元素的删除,删除元素调用 equals 方法其实就是判断元素是否存在链表中,unlink 方法中实现了双向链表中删除元素的操作。
- vector
- 线程是安全
Set:排列有序和无须都有,不可重复
-
HashSet集合
-
底层数据结构是HashMap,因此具有良好的存取和查找性能
-
允许null,非同步,无索引,无序
-
-
TreeSet集合
-
A:底层数据结构是红黑树(是一个自平衡的二叉树)
-
B:保证元素的排序方式,不允许null,非同步
-
-
LinkedHashSet集合
-
A:底层数据结构由HashMap和双向链表组成。
-
B:允许null
-
Map:要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
HashMap:
JDK1.7以前:数组+链表
JDK1.8 : 数组+链表+红黑树
组长度必须为2的幂(16,32,128…),默认为16。在JDK1.8之后链表长度大于8时转化为红黑树。
与HashTable的区别
1、HashMap线程不安全。HashTable线程安全,但是效率较低。
2、HashMap中key只能有一个null,value可以多个为null。HashTable不允许键或值为null。
3、HashMap底层数组长度必须为2的幂(16,32,128…),默认为16。HashTable底层数组长度可以为任意值,导致hash算法散射不均匀,容易造成hash冲突,默认为11。
4、HashMap是底层由数组+链表形成,在JDK1.8之后链表长度大于8时转化为红黑树。HashTable一直都是数组+链表。
泛型<>: 约束作用,避免类型转换之间的问题
迭代器: 集合的专用遍历方式(用于删除)
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()){
String next = iterator.next(); //取出当前的值,向下面移动一位
System.out.println(next);
}
IO流
字节流
字符流
处理流
File类
多线程
进程和线程
线程的创建:
Thread
Runnable
Callable
静态代理
动态代理
Lambda表达式:简化代码
反射
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。(动态获取类的过程)
++ 。–
i++ :先运算,后加一
++i :先加一,后运算