视频 JAVA基础
1. java语言特性
- 跨平台(核心优势)
- 有安全内存管理和访问机制
- 有完善的应用程序接口
1.1 java技术体系
- java 程序设计语言
- 各种硬件平台上java虚拟机
- class 文件格式
- java API类库
- 第三方java 类库
1.2 java技术体系四个平台
- Java Card: 支持java小程序(Applets)运行在校内存设备上(如智能卡)
- Java ME (Java Micro Edition): 支持Java程序运行在移动终端(手机)上的平台 ,以前版本称为J2ME
- Java SE(Java Standard Edition): 个人计算机 支持面向桌面级应用(Windows等应用程序),以前版本称为J2SE
- Java EE(Java Enterprise Edition) : 企业版,定位服务器端应用。支持多层架构的企业应用(如ERP、CRM) 以前版本称为 J2EE
平台关系
HotSpot 是当前使用最广泛的java虚拟机
1.3 JRE和JVM关系
JRE(Java Runtime Environment) 包括JVM、库函数、运行java应用程序所需文件
JDK(Java Development Kit):包含JRE,以及增加编译器和调试器等用于程序开发的文件。
1.4 变量分类
- 局部变量(local variable)
方法或语句块内部定义的变量。
生命周期是从声明位置开始到到方法或语句块执行完毕为止。
局部变量在使用前必须先声明、初始化(赋初值)再使用。
- 成员变量(也叫实例变量 member variable)
方法外部、类内部定义的变量。
从属于对象,生命周期伴随对象始终。
如果不自行初始化,它会自动初始化成该类型的默认初始值。实例变量的默认初始值
- 静态变量(类变量 static variable)
使用static定义。
从属于类,生命周期伴随类始终,从类加载到卸载。
如果不自行初始化,与成员变量相同会自动初始化成该类型的默认初始值
1.4 数据类型分类
引用数据类型
用来引用对象,占4个字节,记录的是其引用对象的地址
1.4.1 浮点数
浮点数不精确 一定不可以用比较,如果用比较可以用
java.math
包下面的两个有用的类:BigInteger
和BigDecimal
,
这两个类可以处理任意长度的数值。
BigInteger
实现了任意精度的整数运算。
BigDecimal
实现了任意精度的浮点运算。
1.4.2 逻辑运算符 、位运算符
短路与或
从左到右计算,如果只通过运算符左边的操作数就能够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。
1.5 方法概念
- 方法就是一段用来完成特定功能的代码片段方法就是一段用来完成特定功能的代码片段
- 形式参数:在方法声明时用于接收外界传入的数据(方法定义时的括号里的参数)。
- 实参:调用方法时实际传给方法的数据(方法调用时括号里的值)。
-注意
- Java中进行方法调用中传递参数时,遵循值传递的原则(传递的都是数据的副本)
- 基本类型传递的是该数据值的copy值
- 引用类型传递的是该对象引用的copy值,但指向的是同一个对象
1.5.1 构造器
构造器要点
- 通过new关键字调用!!
- 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
- 如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加!
- 构造器的方法名必须和类名一致!
1.5.2 对象创建过程
this本质是
- 创建好的对象的地址
- 解决程序中二义性问题(变量、方法)。应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
- 调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
- this不能用于static方法中
static
用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。
- 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
- 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!
- 用“类名.类属性/方法”来调用
- 在static方法中不可直接访问非static的成员
代码
内存占用
super
构造方法第一句总是:super(…) 来调用父类对应的构造方法。
所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
可以通过super.f() 调用父类函数
多态必要条件:
- 继承
- 方法重写
父类引用指向子类对象
多态例子
final
- 修饰变量 : 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值
- 修饰方法:该方法不可被子类重写。但是可以被重载!
- 修饰类: 修饰的类不能被继承。比如:Math、String等
2. java类相关的基础知识
2.1 继承
a.基本概念
- 用extends 表继承;单继承
- 继承都是public 继承
public class Manager extends Employee{ }
- 超类 = 基类 = 父类 ; 派生类 = 孩子类 = 子类
- 调用父类的同名方法可以用
super.getSalary()
b.覆盖(override)和 重载(overload)
- 都是Java多态性的不同表现。
- overload:父类与子类之间多态性的一种表现。在子类中定义某方法与其父类有相同的名称和参数。但子类的访问权限不要低于父类的访问权限。
- overload:是一个类中多态性的一种表现。在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型。Overloaded的方法是可以改变返回值的类型
- 多态:一个对象变量,可以指示多种实际类型的现象
- 动态绑定:运行时刻自动选择调用哪个方法的现象
c. 4个访问修饰符
- private : 本类可见
- public:所有类可见
- protected:本包和所有子类可见
default:本包可见,不需修饰符
2.2 抽象类
- 使用abstract关键字
- 包含一个或多个抽象方法的类 必须被声明为抽象类
(类即使不含抽象方法,也可以将类声明为抽象类)- 抽象类不能被实例化
public abstract class Person{ public abstract String getDescrition(); }
- 抽象类可包含具体数据与具体方法
- 抽象方法具体实现可在子类中。
public abstract class Person{ private String name; public Person(String name){ this.name = name; } public abstract String getDescription(); public String get name(){ return name; } }
2.3 接口
- 接口不提供方法实现(方法都是抽象方法)
- 接口可以多继承
- 接口方法默认是
public abstract
- 接口常量默认是
public static final
(无变量定义)- 用extends 实现多继承
- 子类通过implements 实现接口中的 规范
- 接口不能创建实例
一个类实现接口,必须实现接口中的所以方法
接口例子
内部类p 300集105
2.4 java 方法
2.4.1 equals 方法
- 检测对象是否相等;判断对象是否有相同的引用
- 检测对象状态是否相等,若状态相等,则对象相等。如:雇员对象的姓名、薪水等属性都相等,则对象相等
- 只有对象属于同一个类(
getClass
方法判断),对象相等equals()
方法特性:
- 自反性:非空引用x,
x.equals(x)
返回true- 对称性:任何引用x, y ,
y.equals(x)
和x.equals(y)
结果一样- 传递性:任何引用x, y , z,若
x.equals(y)
为true,y.equals(z)
为true,则x.equals(z)
为true- 一致性:若引用对象没变,则反复调用函数的结果一致
- 非空引用x,
x.equals(null)
返回false
对称性对于父类和子类对象可能不成立,具体分析
-对象ainstanceof
类B — 表示判断左边对象是否是右边类的实例
equals方法和== 区别
- 补充知识:
- 基本数据类型:
a.整数类型: int、long、 byte、 short
b.浮点型:float、 double
c.字符型:char
d.布尔型:boolean- 引用数据类型
a.类
b.接口
c. 数组- 对比
- ==
a. 对于基本类型来说,== 比较的是值 是否相等
b. 对于引用类型来说, ==比较的是两者在内存中存放的地址- equals
所有类都继承于Object
这个超类,其中有一个equals
方法, 比较的是对象内存地址值String类下重写public boolean equals(Object obj){ return (this == obj); }
equals()
方法为:String的equals()方法仅仅是对比它的 数据值public boolean equals(Object obj){ if(this == obj) return true; if(obj instanceof String){ String str = (String)obj; int n = lenghth(); if(n == str.length()){ int i = 0; while(n -- != 0){ if(str.charAt(i)!= charAt(i)) return false; i++; } return true; } return false; } }
2.4 异常机制
2.4.1 异常
指程序运行过程中出现的非正常现象
- 输入错误
- 除数为零
- 需要处理的文件不存在
- 数组下标越界
异常处理 指程序在出现问题时依然可以正确的执行完
异常分类
java异常类层次结构
Exception类是所有异常类的父类,分为:
- RuntimeException 运行时异常
- CheckedException 已检查异常
- RuntimeException:加判断条件解决
如被 0 除、数组下标越界、空指针等
- ArithmeticException异常:试图除以0
- NullPointerException:程序访问一个空对象的成员变量或方法, 或者访问一个空数组的成员
- ClassCastException引用数据类型转换,容易出现
解决办法:加上(a instanceof B )判断- ArrayIndexOutOfBoundsException
-NumberFormatException:数字格式化异常
数字格式化异常
- CheckedException 已检查异常
IOException、SQLException等以及用户自定义的Exception异常
两种异常处理方式
- try/catch”捕获异常(finally一定执行)
try-catch-finally
异常处理流程
try-catch-finally 例子
throws”声明异常
- 不一定立刻处理它,可以再把异常throws出去(向上传递给调用它的方法处理)
- 若一个方法中可能产生某种异常,但是并不能确定如何处理这种异常,则应根据异常规范在方法的首部声明该方法可能抛出的异常。
throws 例子用户自定义异常
自定义异常例子
2.5 数组
2.5.1 数组常用函数
- 数组拷贝
static void arraycopy(object src,int srcpos,object dest, int destpos,int length)
将src数组里的元素值赋给dest数组的元素,其中srcpos指定从src数组的第几个元素开始赋值,length参数指定将src数组的多少个元素赋给dest数组的元素。
2.5.2 java.util.Arrays类
Arrays.toString(a)
可以打印a数组Arrays.sort(a)
数组a排序Arrays.binarySearch(a, key)
二分查找
二维数组打印表格
二维数组表格
2.6 常用类
2.6.1 包装类
-
包装类是解决基本数据类型转成对象的问题
基本数据类型对应包装类
- 自动装箱、拆箱
- 自动装箱: 基本类型的数据处于需要对象的环境中时,会自动转为“对象”
不需要显式调用Integer.valueOf()
- 自动拆箱: 对象会自动转成基本数据类型
不需要显式调用intValue()
等方法
- 整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的是提高效率。
当调用valueOf()
函数时,先检查数值是否在【-128, 127】之间,如果在,则从缓存数组中拿出,不在则创建新的Integer对象(对象比较时容易出问题)
2.6.2 String类
- String
private final char value[]
- String 中字符串数组初始化后不可变,final修饰。
- 每次对String操作都会生成新的String对象,效率低
- StringBuilder
char value[]
可变字符序列- 线程不安全,但效率高(一般使用它)
- StringBuffer
- 可变字符序列
- 线程安全,但效率低(因为很多方法都用synchronized修饰)
- 每个StringBuffer对象都用一定的缓冲区容量,当字符串大学不超过容量时,不会分配新的容量,超过时,自动扩容
统计使用内存和时间的函数
- 统计内存 ---
Runtime.getRuntime().freeMemory()
- 统计时间 ---
System.currentTimeMillis()
2.6.3 时间相关类
p300集
2.7 容器
2.7.1 Arraylist
- 底层基于动态数组实现(线程不安全)
- 随机访问数组元素的效率高
- 末尾增删元素效率高,增删数组中的元素因为要移动数据效率低。
- 数组元素的容量是固定的,当元素个数超过其容量时,需要扩容(以当前容量的1.5倍扩容)---(原size+ size右移(除2))。扩容的过程中,会进行大量的数组复制操作
2.7.2 Linkedlist
- 底层基于循环双向链表数据结构
- 随机访问效率低
- 增删元素效率高,只需修改指针
- 一个表项包括3个部分:元素内容、前驱表项、后继表项。无论LikedList是否为空,链表内部都有一个header表项,它既表示链表的开始,也表示链表的结尾。
2.7.3 Vector
- 可实现自动增长的对象数组, 以实现类似动态数组的功能。
- 创建了一个向量类的对象后,可以往其中随意插入不同类的对象。
- vector是线程(Thread)同步(Synchronized)的,所以它也是线程安全的
总结: 数组(Array)和列表(ArrayList)有什么区别?
- Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
- Array大小是固定的,ArrayList的大小是动态变化的(1.5倍扩容)
2.7.4 HashMap
- 底层实现采用了哈希表, 数据结构是数组和链表
12.6 HashMap和Hashtable有什么区别?
HashMap和Hashtable都实现了Map接口。
- HashMap是非synchronized的,所以线程不安全;单线程性能比hashtable好。- Hashtable是synchronized,线程安全,但是单线程比hashmap慢
- HashMap 可以接受null(key和value 都可以为null),HashTable不可以接受null
- HashMap不能保证随时间推移map元素次序不变
- 遍历方式不同:HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。
- 初始容量不同:HashMap的初始长度为16,之后每次扩充变为原来的两倍。Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1(n为上一次的长度)
java虚拟机 java 文件加载过程
类加载器加载机制
双亲委派机制线程和进程区别 线程通信 进程通信
3.锁
4.原子性linux chmod 该权限3个数字各代表什么
当前目录查询以某后缀的文件个数
9.synchronized设计模式有哪些 Spring bin文件格式。。有哪些
synchronized、lock 乐观锁悲观锁区别是什么、应用场景哪些,知道哪些并发相关知识,synchronized、lock,
ssm
面向对象的三大要素
值和引用的区别
数据结构中堆和栈的区别
简述链表,如何判断一个链表是否是单链表
计算机网路:
TCP三次握手,四次挥手
七层网络模型
TCP,UDP的不同
http和https的区别
4、java里的抽象类和接口什么区别
5、浏览器中输入一个url后,发生了什么
手撕代码:
求数组中出现次数最多且最大的数
手撕代码:
一副扑克牌,从中随机抽取5张牌,判断这5张牌是否是顺子。(不能用排序)
spring框架