Java学习记录
Java快速入门
Java基本知识
-
Java 最大的特点跨平台
-
JavaSE(个人版)、JavaEE(企业版)、JavaME(微型版,用于消费电子产品开发)
-
Java地位类似Windows
Java运行机制
-
运行流程:源文件(.java)---[Javac编译器]--->字节码(.class)---[JVM虚拟机]--->可执行程序
-
JDK JRE JVM之间的关系
JDK(Java Development Kit)
调试器、编译器(javac)
JRE(Java Runtime Environment)
库函数
JVM(Java Virtual Mechine)
Java方法
方法的重载
定义:名字相同,参数不同(要求功能类似)
int add(){...}; int add(int a){...}
面向对象
- 对象类似表格,由属性和方法组成
- 面向对象是一种设计者思维,组装
内存机制
- 栈:负责函数运行,main开始
- 堆:负责存储对象部分
- 方法区:负责存储类的不变部分(方法、常量)
垃圾回收机制
原理:
- Java的内存管理很大部分是堆中对象的释放
- 堆分为3个部分:年轻代(Eden区+Survivor1区+Survivor2区)、年老代、永久代(元数据空间)
- 有3种回收器:Mini GC(负责年轻代)、Major GC(负责年老代)、Full GC(全部都可以负责)
- System.gc()可以建议系统进行垃圾回收
算法:
- 引用计数法
- 引用可达法
静态和普通
普通属性、普通方法有this指针(隐式参数),区分和局部变量相同的普通属性,如this.a=a,再构造函数中调用重载的构造函数时显示使用,如
Test(int a, int b){
this.Test(a);
...
}
静态属性、静态方法没有this指针,有静态构造方法,用于静态属性的初始化,即
static{
...
}
package 和 import
package作用就是对类进行分类存放,使其有条理性,一定程度上解决类同名问题。
import导入有两种
- 导入类
import java.lang.Math; //导入java.lang.Math类
import java.lang.*; //导入java.lang包下的所有类
- 导入静态变量或者静态方法
import java.lang.Math.PI; //导入PI静态变量
import java.lang.Math.random; //导入random()静态方法
import java.lang.Math.*; //导入Math类下所有静态变量和方法
重写Override
要求:
==
:方法名、形参列表相同<=
:返回值类型、声明异常类型,子类小于等于父类>=
:访问权限,子类大于等于父类
组合
对象持有另一个对象
封装
目的
- 高内聚、低耦合:高内聚指的类内部数据操作细节自己完成,不允许外部干涉;低耦合指的是仅暴露少量的方法给外部使用,尽量方便外部调用。举例:手机高内聚,所有的实习细节都封装在手机壳里面,并且独立运行,手机也是低耦合,对外部只有屏幕、充电口、开关、音量调节按钮而已。
实现
-
private: 类内友好
-
(default): 包内友好
-
protected: 包内友好、父子友好
-
public: 全局友好
get set方法
封装的一般方法是将属性都设置为private,然后外部通过set get函数进行访问。
多态
同一个方法,不同对象调用方法完全不同
对象类型转化
- 向上转化(子类转化为父类): 自动转化
- 向下转化(父类转化为子类): 强制转化,(子类类型)对象
抽象类
抽象方法:只有方法名没有实现,前面加abstract。
含有抽象方法的类就是抽象类,抽象类不能产生对象,子类必须实现抽象父类的抽象方法。
接口
基本格式:
控制符 interface 接口名 [extends 接口1, 接口2, ...]{
//常量
/*public abstract final*/数据类型 变量名 = 值;
//抽象方法
/*public abstract*/返回类型 方法名(形参列表);
//默认方法
default 返回类型 方法名(形参列表){...}
}
接口是一种规则,需要类来实现.
内部类
内部类是为了封装而生的,是编译才有的概念
有4种内部类:
-
成员内部类
-
非静态内部类
-
静态内部类
-
-
匿名内部类
只使用一次,所以不需要名字
- 局部内部类
在方法中定义类
数组
数组的创建
数组的初始化
- 静态初始化
- 动态初始化
- 默认初始化
数组的常用操作
数组遍历
-
for(int i=0; i < array.length; ++i)
-
for(int i:array)
数组拷贝
数组的打印、排序、查找、填充
利用Array类中的方法
-
打印:
Array.toString(数组对象)
-
排序:
Array.sort(数组对象)
,该类数组对象需要实现comparable接口,comparable中有compareTo()方法需要实现 -
查找:
Array.binarySearch(数组对象,查找元素)
-
填充:
Array.fill(数组对象, 开始pos, 结束pos, 填充元素)
二维数组
即数组的数组
总结
-
JDK、JRM、JVM的包含关系
-
.java --javac-->.class--JVM-->可执行文件
-
基本数据类性,引用类型 (基本数据类型也有对应的应用类型)
-
类和对象
-
pacakage 包名; import 包名.类名(*); import static 包名.类名.静态方法; /* 类的成员有属性、方法、内部类 类和成员都有修饰符: 1.public protected default private 2.static final abstract */ public class 类名(和文件名一致) [extends 父类名]{ //属性 //构造方法 修饰符 构造方法(形参列表){ } //方法 //静态内部类 public static class A{ //静态成员 } //非静态内部类 public class B{ } }
-
类和对象的存储(JVM内存模型)
- 栈(存放方法,从main方法开始)
- 堆(对象)
- 方法区(方法、静态成员、常量池)
-
接口
public interface 接口名 [extends 接口1, 接口2, ...]{ [public static final] 类型名 属性名 = 值; [public abstract] 返回类型名 方法名(参数列表); //补充默认方法 default 返回类型名 方法名(形参列表); //补充静态方法 static 返回类型名 方法名(形参列表); }
-
封装
public protected (default) private 的作用范围
-
继承
- 类继承 (单) 接口继承(可多)
- super
- 重写 @Override
-
多态
Java 基础深化与提高
泛型与泛型类
容器
基本结构
-
Collection接口
-
Set接口
- HashSet类
- LinkedHashSet类
- TreeSet类
-
List接口
- ArrayList类
- LinkedList类
- Vector类
-
-
Map接口
- HashMap类
- LinkedHashMap类
- TreeMap类
- Properties类
- HashTable类
Collections接口
//查看基本信息
int size();
boolean isEmpty();
//增删操作
boolean add(Object element);
boolean addAll(Collections c);
boolean remove(Object element);
boolean removeAll(Collections c);
boolean retainAll(Collections c); //只保留与容器c交集的元素
void clear();
//查看
boolean contains(Object element); //是否包含某个元素
boolean containsAll(Collections c);
//迭代器
Iterator iterator(); //返回迭代器,用于容器遍历
//转化
Object[] toArray();
List接口
特点:有序+可重复
//增加操作
boolean add(int index, Object element);
//删除操作
boolean remove(int index);
//修改操作
boolean set(int index, Object element);
//查看/查找
Object get(int index);
int indexOf(Object element);
int lastIndexOf(Object element);
ArrayList类
特点:
- 通过数组实现,所以查找效率高,增删操作效率低
- 线程不安全
IO
基本概念
输入输出流
- 输入流:程序外部-->内部
- 输出流:程序内部-->外部
数据源
- 源设备:发送数据的设备
- 目标设备:接受数据的设备
节点流、处理流(包装流):流像管子一样,可以嵌套
- 节点流:直接链接数据源的流
- 处理流:包装其他流的流
4大IO抽象类
字节
- InputStream
方法:
int read(); //字节读取,读取成功则返回0-255的十进制数,读取失败则返回-1
void close(); //关闭流
·子类:
节点流:
FileInputStream; //操作文件
ByteArrayInputStream; //操作字节数组
处理流:
ObjectInputStream; //操作对象
DataInputStream; //操作基本数据类型和字符串类型
BufferdInputStream; //增加缓存功能,提供效率
- OutputStream
方法:
void write(int ); //写入一个字节
void close(); //关闭流
子类:
节点流:
FileOuputStream;
ByteArrayOuputStream;
处理流:
ObjectOutputStream;
DataOutputStream;
BufferedOutputStream;
PrintStream;
字符
- Reader
方法:
int read(); //字符读取,读取成功则返回0-65535的十进制数,读取失败则返回-1
void close(); //关闭流
子类:
节点流:
FileReader;
处理流:
BufferedReader;
- Writer
方法:
void write(int ); //写入一个字符
void close(); //关闭流
方法:
节点流:
FileWriter;
处理流:
BufferedWriter;
File类
File类是处理磁盘文件或者目录的包装类
方法:
//初始化
File(String path); //相对路径获取方式System.Property("user.dir");
//创建文件/目录
boolean createNewFile();
boolean mkdir();
boolean mkdirs();
//删除文件
boolean delete();
//操作
String getPath();
...
多线程
基本概念
-
程序:可执行文件(静态的),一般放在磁盘,需要时在拿到内存运行;
-
进程:进程是程序在内存上的一次运行,独占了一块内存空间,由若干个线程(至少1个)、code、数据构成;
-
线程:线程是运行在进程内的一个线性执行单元,同个进程内线程之间共享数据(出现共享互斥问题)
-
主线程:由main方法开始的线程
-
子线程:由main方法创建的新线程
java中的线程
Thread
Runnable
线程控制
- 线程结束
- 线程暂停
- sleep(long s); 进入阻塞状态,并在一定时间后回到就绪状态
- yeild();进入就绪状态,给同优先级的其他线程让cpu资源
线程联合
join函数,被加入的线程需要等待加入线程运行完毕后才能运行
线程优先级
t.setPriority(5);
t.start();
System.out.println(t.getPriority());
守护线程
线程分为用户线程和守护线程,守护线程用来服务于用户线程,比如垃圾回收,用户线程死亡则守护线程也死亡。
线程同步
线程同步的基本知识
线程同步的java实现
- 成员变量
synchronized(成员变量对象名){
//需要同步的代码块
}
- this
synchronized(this){
//需要同步的代码块
}
synchronized public void func(){
}
- 类名.class
synchronized(类名.class){
//需要同步的代码块
}
synchronized public static void func(){
//需要同步的代码块
}
线程的并发协作
模型:生产者(线程) -->[缓冲区]-->消费者(线程)
作用
- 逻辑上实现生存者线程和消费者线程的分离,解除了他们之间的耦合
- 协调了生产者线程和消费者线程之间的速度,提高效率
线程之间的通信
- wait
- notify
- notifyAll
通信+syn机制才能实现生产者消费者模型
网络编程
基本概念
计算机网络
将不同地方的计算机通过通信线路链接起来,在网络操作系统、网络管理软件、网络通信协议的管理和协调下,实现计算机的资源共享和信息通信的系统
网络通信协议
- 协议:标准、规则,类似人类之间的交流需要共同的语言,计算机之间的信息交流也需要同一套规则。
- 计算机通信太复杂,于是进行了分层,有IOS模型(理论)和TCP/IP模型(工业),每个层都有对应的协议。
- 在模型的指导下,计算机之间的通信时层层包装(发送方)再层层拆分(接收方)的过程。
数据的(拆分)封装与解封(合并)
why:数据量太大很难一次传输,需要分段后按照次序发送;
what:发送方将数据层层拆分和封装,直到物理媒体传输,接送方对受到的数据进行拆分
how:因为每一层封装和解封都是一个原理,所以我们这里只讨论某一层。第i层的作用是传输i+1层提供的数据,发送方把上层来的数据PUD先拆分再包装,利用下层建立好的服务传送,接收方接受到数据后再合并起来。
IP地址和端口号
- IP: 标识计算机
- 端口号:标识服务
URL
构成:https(协议)😕/www.baidu.com(域名)[端口号]/index.html(文件)
作用:标识计算机的资源(目录、文件、复杂对象的引用)
Socket
作用:在应用层和传输层之间创建了桥梁,是传输层提供的编程接口,使得应用程序可以进行网络通信
TCP UDP
TCP
位于传输层,可靠传输方式,建立虚拟链路,断开虚拟链路,类似打电话.
3次握手,4次挥手
UDP
位于传输层,不可靠传输,类似于发短信
Java网络编程中的常用类
Socket的编程循序
-
服务器创建ServerSocket对象,设置好监听接口;
-
ServerSocket对象调用accept()方法,并使之处于阻塞状态,等待客户端的链接;
-
客户端创建Socket对象,设置好要连接服务器的IP和Port;
-
客户端发出请求,客户端和服务器建立链接;
-
通过Socket对象获得客户端和服务器的建InputStream和OutStream流对象;
-
客户端和服务器之间利用流传输数据;
-
关闭流关闭Socket对象
-
信息:岗位是有限的,太晚就没了,所以要把握好时间,字节那两次机会要快一点,预计3月20号前投一次
-
面试或者面试失败会有危险吗,不会,反而有益,锻炼胆量,学到面试经验,还是很不错的!所以不要害怕,大胆面试