java基础知识点总结
-
Javac:对java文件进行编译,生成jvm可以执行的字节码文件,也就是class文件。
Java:负责运行,启动jvm加载运行时所需要的类库,并执行class文件。 -
基本数据类型:
byte
,short
,int
,long
,float
,double
,boolean
,char
-
运算符:
++
,--
:如果运算符放在前面,则先进行自增或者自减,然后在进行其他运算,如果运算符放在后面,则先进行其他运算在进行自增或者自减。 -
&
和&&
:都是逻辑与,使用&
的时候,两边都参与运算,使用&&
的时候,如果左边为false
,右边不进行运算,只有左边为true
的时候,右边才进行运算。 -
|
和||
:都是或操作,使用|
的时候,两边都参与运算,使用||
的时候,左边为true
,右边不参与运算。 -
位运算符:~取反,<<左移,>>右移,>>>无符号右移
-
Switch
:答案书写没有顺序,当匹配到正确的答案就开始执行,一直执行到遇到break
结束,或者等到switch
语句结束,支持byte
,short
,int
,char
,string
,enum类型
。 -
方法的重载:方法名一致,参数个数或类型不同,与返回值无关。
-
数组:arr是数组类型,通过new关键字创建数组实体。
-
冒泡排序:
Public void sort(int[] arr){
for(int i=0;i<arr.lenth-1;i++){
for(int j=0;i<arr.lenth-i-1;j++){
if(arr[j]>arr[j+1]{
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
-
面向对象:是一种编程思想,将现实中具有统一特征的事物抽象描述。
-
三大特性:封装,继承,多态。
- 封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要外界知道具体实现细节。
- 继承主要描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下对功能进行扩展。
- 多态指在一个类中定义的属性和方法被其它类继承后,他们可以具有不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义。
-
垃圾回收:当一个对象不被引用的时候,它就变成了一个垃圾对象,但是他仍占据内存,时间一长,容易造成内存溢出,此时Java虚拟机会自动调用垃圾回收机制将内存释放,也可人为去调用
system.gc()
方法,但是不能保证立即执行,他会在jvm的下一个回收周期内执行,finalize()
方法在垃圾回收时被自动调用,可以自定义此方法。 -
Jvm内存模型:
程序计数器
程序计数器一块较小的内存空间,作用是在线程执行字节码文件时的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条要执行的字节码指令,分支,循环,跳转,异常处理等基础功能都需要依赖这个计数器来完成。为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各个线程之间的计数器互不影响,独立内存,是线程私有的.
java虚拟机栈
Java虚拟机栈也是线程私有的,用来存储局部变量,操作栈,动态链接,方法出口等信息,每一个方法被调用到执行完成的过程,就对应着一个栈帧在虚拟机栈里面压栈出栈的过程。
本地栈
本地栈为虚拟机使用到的native方法服务。
```
>堆内存
```
堆是jvm中内存最大的一块,是所有线程共享的一个区域,在jvm启动时创建,用来存放实例对象,也是垃圾收集器管理的主要区域。现在一般采用分代收集算法。Java堆可分为新生代,年老代和matapace区。新生代包括Eden区,to survivor和from survivor区。当eden区和from区占用内存达到一定比例的时候,就会调用垃圾回收机制,采用复制算法,将eden区和from区存活的对象复制到to区,然后将Eden区和from区清空,然后to区变为from区,from区变为to区,其中存活对象每次复制就会有计数器加1,当和为15的时候,此对象移至老年代。
```
>方法区
方法区也是共享区域,用来存放已被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据。
```
-
Static:可以用来修饰方法,变量,代码块等。被static修饰的在类加载时被加载一次,可以通过类名.的方式进行调用。静态方法只能调用静态方法和静态变量。
-
Static和final一块用表示全局常量,一般字母大写。
-
单例模式:分为懒汉模式和饿汉模式
Class single{ private static single INSTANCE=new single(); public single getSingle(){ return INSTANCE; } }
Class single{ private static single INSTANCE=null; public single getSingle(){ if(INSTANCE==null){ INSTANCE= new single(); } return INSTANCE; } }
-
类的继承是指在当前类的基础上去构建一个新的类,这个新类被称为子类,当前类称为父类,子类会自动拥有可继承的父类的属性和方法。使用
extends
关键字。 -
重写父类方法:具有相同的方法名,参数列表以及返回值类型。
-
子类再重写父类的方法之后,需要使用
super关键字
来调用父类的成员变量和成员方法。而且必须位于子类构造方法的第一行,并且只能出现一次。 -
子类重写父类方法时,不能使用比父类更加严格的访问权限。
-
Java只支持单继承,但可以多级继承,也可以实现多接口。
-
Final关键字可用来修饰类,变量,方法,被final修饰具有以下特征:
final类不能被继承,没有子类,final类中的方法默认是final的。
final成员变量表示常量,只能被赋值一次,之后不能再改变。
final方法不能被子类的方法覆盖,但可以被继承。
-
抽象类:当一个类中包含了抽象方法,这个类就必须使用abstract关键字修饰,使用
abstract
关键字的类为抽象类。 -
包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法,只需使用
abstract
进行修饰即可。 -
抽象类特点:
- 抽象类不可以被实例化。
- 抽象类必须有其子类覆盖掉所有抽象方法后,才可以进行实例化,否则该子类还是抽象类。
-
接口:使用interface修饰,接口中的方法都是抽象的,不可以被实例化。
-
多态:在设计一个类时,需要其中的方法具有一定的通用性。在同一个方法中,由于参数不同而导致执行结果各异的现象就是多态。
-
多态中判断其类型:使用关键字
instanceof
,可以判断一个对象是否为某个类(或接口)的实例或子类实例。语法如下:对象 instanceof 类(或接口)
-
object:
getClass().getName()
返回对象所属类名hashCode()
返回对象的哈希值
-
异常
Throwable
有两个直接子类Error
和Exception
,其中error时程序中产生的错误,比较严重,一般会直接导致虚拟机停止运行。而exception称为异常类,直接子类为RuntimeException
和编译异常类。 -
Throwable中常用的方法:
- String getMessage() 返回详细信息字符串
- void printStackTrace() 输出至标准错误流
- void printStackTrace(PrintStream s) 输出至指定错误流
-
try...catch和finally:
用于捕获异常并进行处理,finally表示无论程序是否发生异常都会执行,一般用来关闭资源
finally只有一种情况下不会执行,那就是在try..catch语句中执行了System.exit(0)语句,即退出了java虚拟机finally不执行。 -
throws关键字:将异常抛出去交给调用者处理,如果一直抛到顶级方法处,将会有jvm虚拟机进行处理。
-
自定义异常只需
继承Exception类
,在构造方法中使用super()语句调用Exception的构造方法
。 使用语法格式:throw new Exception自定义异常对象
,然后通过try..catch进行处理打印出异常信息。 -
常见的异常:找不到类异常、空指针异常、数组越界异常、找不到方法异常、IO异常等
-
访问控制级别:public > protected > default > private
-
进程:一个程序包括至少一个进程,一个进程包括至少一个线程。
-
线程的创建:1.继承Thread类创建多线程;2.实现Runnable接口创建多线程。建议使用第二种方法,可以避免由于Java的单继承带来的局限性。
-
通过Thread的currentThread()方法获得当前线程的实例对象,然后调用getName()获取线程名称。
-
线程的生命周期及状态转换:
新建状态--就绪状态--阻塞状态--运行状态--死亡状态
-
线程的优先级:
static int MAX_PRIORITY 10
static int MIN_PRIORITY 1
static int NORM_PRIORITY 5 -
线程休眠、线程让步和线程插队:
sleep(long millis)方法:让当前执行的线程暂停一下,进入休眠等待状态,当指定时间一过,开始执行,会阻塞该线程
yield()方法:让当前执行线程暂停,不会阻塞该线程,将线程状态改为就绪状态。
join()方法:当某个线程调用其他线程的这个方法时,调用的线程将被阻塞,知道被join()方法加入的线程执行完成。 -
线程的同步:
将要共享的的代码块或方法放入synchronized区域中,当线程执行的时候加锁,执行完释放锁。
-
线程之间的通信:
通过wait(),notify(),notifyAll()方法来解决线程间的通信问题。
这三个方法的调用者应该是同步锁对象。 -
String常见操作:
char charAt(int index) |返回index位置字符
int length() |返回字符串长度
boolean isEmpty() |判断字符串是否为空
boolean contains(CharSequence cs) |判断字符串是否包含指定字符
String toLowerCase |将字符串小写
String toUpperCase | 将字符串大写
String valueOf(int i) | 将int类型的转换为字符串类型
char[] toCharArray() | 将字符串转换为数组
String replace(a,b) | 把a替换成b
String[] split(string regex) | 按指定字符进行分割
String substring(int beginIndex) | 截取一个新的字符串
String trim() | 返回一个新的字符串,去除原字符串首尾的空格 -
equals()方法用于比较两个字符串中的字符是否相等,==方法用于比较两个字符串对象的地址是否相同
-
String类表示的字符串是常量,一旦创建后内容和长度无法改变。StringBuffer表示字符容器,内容和长度都可以更改。
-
system类:
static void exit(int status) | 终止当前的java虚拟机
static long gc() | 运行垃圾回收器,并对垃圾进行回收
static long currenTimeMillis() | 获取以毫秒为单位的当前时间
static Properties getProperties() | 获取当前系统书香
static String getProperty(String key) | 获取指定键描述的系统属性 -
Runtime类:用于封装JVM虚拟机进程。每次启动虚拟机都对应一个Runtime实例,并且只有一个实例,所以他是单例模式,而且对象不可以直接实例化,获取方式如下:
Runtime run = Runtime.getRuntime();
-
Runtime类中提供了一个exec()方法,用于执行dos命令,可用他来打开一个新的进程。
-
math类:
Math.abs() | 绝对值
Math.ceil() | 向上取整
Math.floor() | 向下取整
Math.round() | 四舍五入
Math.max() | 较大值
Math.min() | 较小值
Math.random() | 大于等于0.0小于1.0的随机值 -
Random类:
Random 构造方法,创建一个伪随机数生成器
Random(long seed) 使用一个seed种子创建伪随机数生成器 -
Date类用于表示日期和时间,里面大多数方法已过时,只有两个构造方法建议使用,一个是Date(),创建当前日期时间的date对象,另一个是Date(long date),用于指定时间的Date对象。
-
Calendar类是一个抽象类,可以调用静态方法getInstance()来得到一个Calendar对象,然后调用器相应的方法。
-
dateformat类是抽象类,通过调用静态方法getDateInstance()来得到dateformate对象,formate()用来转换日期为字符串。
-
集合可分为单列集合collection和双列集合map。
-
collection有两个重要子接口,list和set,其中list的特点是元素有序,可重复;set的特点是无序且不能重复。list接口实现类主要有arraylist和linkedlist;set接口实现类主要是hashset和treeset。
-
map,键值对存储方式,不可重复,实现类主要有hashmap和treemap。
-
arraylist:长度可变的数组,增删慢,查找快。
-
linkedlist:内部是双向循环列表,具有查找慢,增删快的特点。
-
iterator:主要用于迭代访问集合中的元素。可以通过hashNext()判断集合中是否有下一个元素,然后调用next()方法将元素取出。也可以用增强for循环进行遍历集合元素。
-
hashset:添加元素时,会调用对象的hashcode()方法来确定元素的存储位置,然后调用equals()方法来确保当前位置没有重复元素。
-
treeset:内部采用排序二叉树来存储元素,存储对象时需要实现comparable接口进行排序。
-
hashmap、treemap、properties。
-
collections工具类,可以对集合进行添加元素addAll(),反转元素顺序reverse(List list),随机排序shuffle(List list),自然排序sort(List list)。
-
arrays工具类:sort排序。
-
InputStream和OututStream:
int read() | 每次读取一个8位的字节
int read(byte[] b) | 读取若干字节,把他们保存到参数b指定的数组中
int read(byte[] b,int off,int len) | 读取若干字节,保存到参数b指定的数组中,off表示字节数组开始保存数据的起始下标,len表示读取字节的数目
void close() | 关闭流
void write(int b) | 向输出流写入一个字节
void write(byte[] b) | 把参数b指定的数组的所有字节写到输出流
void write(byte[] b,int off,int len) | 把数组中从偏移量off开始的len个字节写入输出流
void flush() | 刷新输出流并强制写出所有缓冲的输出字节
void close() | 关闭流并输出字节 -
FileInputStream和FileOutputStream是针对文件的读写的类。
-
字节缓冲流:分别是BufferedInputStream和BufferedOutputStream。这两个流都使用了
装饰设计模式
。内部都定义了一个大小为8192的字节数组,当调用read或者write方法的时候,会将数据先存入定义好的数组,然后将字节数组的数据一次性读写到文件中。 -
字符流Reader和Writer:FileReader和FileWriter用于读写文件,BufferedReader和BufferedWriter是具有缓冲功能的流,可以提高读写效率。
-
readLine()方法用于一次读取一行文本,newLine() 写入一个换行符。
-
转换流:InputStreamReader和OutputStreamWriter将字节流转换为字符流,只针对操作文本文件的字节流进行转换。
-
序列化:使用ObjectOutputStream将对象保存至硬盘,使用
writeObject(Object obj)
方法写入文件。当对象进行序列化时,必须保证该对象实现了Serializable接口。 -
反序列化:使用ObjectInputStream将对象恢复序列化前的Java对象,使用readObject()方法读取文件。
-
打印流:PrintStream,提供打印数据的print()方法和println()方法。
-
File类常用构造方法:
File(String pathname) | 指定文件路径创建File对象
File(String parent,String child) | 指定文件父路径和一个子路径(包括文件名称)创建File对象
File(File parent,String child) | 指定File类的父路径和子路径(包括文件名称)创建File对象 -
File类常用方法:
boolean exists() | 判断文件或目录是否存在
boolean delete() | 删除文件或目录
boolean createNewFile() | 当文件不存在时,新建一个文件对象,如果存在,则返回false
String getName() |返回对象的名称
String getPath() | 返回对象的路径
String getAbsolutePath() | 返回该对象的绝对路径值
String getParent() | 获取对象的父目录
boolean isFile() | 判断该对象是否为文件
boolean isDirectory() | 判断该对象是否为文件夹
long length() | 返回文件内容长度
String [] list() | 列出指定目录的全部内容,只列出名称
File[] listFiles() | 返回包含所有子文件和子目录的File数组 -
网络通信协议:对数据的传输格式,传输速率,传输步骤等做统一规定,通信双方必须同时遵守才能完成数据交换。
-
TCP/IP协议中的四层结构:应用层,传输层,网络层,链路层。
-
IP地址是一个标识号,可以唯一的标识一个计算机,由4个字节组成。端口号用来区分计算机中的应用程序,两个字节,取值范围是0~65535。
-
InetAddress类用来封装IP地址:
InetAddress getByName(String host)
InetAddress getLocalHost()
String getHostName()
boolean isReachable(int timeout) | 指定时间内地址是否可达
String getHostAddress() -
UDP是无连接通信协议,在传输数据时,发送端和接收端不会建立逻辑连接。此协议消耗资源小,通信效率高,一般用于音频,视频和普通数据的传输。传输不安全。
-
TCP协议是面向连接的通信协议,传输数据前现在发送端和接收端建立逻辑连接,然后在传输数据,提供了两台计算机之间可靠无差错的数据传输。
-
“三次握手”:
第一次握手,客户端向服务器端发送连接请求,等待服务器确认;第二次握手,服务器端向客户端发送一个响应,通知客户端收到了连接请求;第三次握手,客户端再次向服务器端发送确认信息,确认连接。 -
UDP通信使用DatagramPacket类封装UDP通信中发送或接受的数据。
- 常用的构造方法有:
DatagramPacket(byte[] buf,int length) | 用于接收端
DatagramPacket(byte[] buf,int length,InetAddress addr,int port) | 通常用于发送端
DatagramPacket(byte[] buf,int offset,int length) | 用于接收端
DatagramPacket(byte[] buf,int offset,int length,InetAddress addr,int port) | 通常用于发送端- 常用方法:
InetAddress getAddress() | 返回IP地址
int getPort() | 返回端口号
byte[] getData() | 返回数据
int getLength() | 返回数据长度 -
DatagramSocket:使用这个类的实例对象发送和接收DatagramPacket数据包。
1. 常用的构造方法有:
>DatagramSocket() | 创建发送端的DatagramSocket对象,未指定端口号
>DatagramSocket(int port) | 可做接收端和发送端的DatagramSocket对象,做接收端时,必须指定端口号,用来监听指定端口
>DatagramSocket(InetAddress addr,int port) | 适用于多网卡的情况
2. 常用方法:
>void receive(DatagramPacket p) | 将接收到的数据填充到DatagramPacket数据包中
>void send(DatagramPacket p) | 用于发送DatagramPacket数据包,发送的数据包中包含数据,数据长度,远程主机IP,端口号
>void close() | 关闭当前Soket
-
TCP通信严格区分客户端和服务器端,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端。
-
服务器端ServerSocket和客户端Socket这两个类用于实现TCP程序,通信时,先建立服务器端,等待客户端连接。
-
ServerSocket:
- 构造方法:
ServerSocket() | 未绑定端口号,不能直接使用,需要调用bind方法绑定端口号
ServerSocket(int port) | 绑定到一个指定的端口号上
ServerSocket(int port ,int backlog) | 指定端口号,指定在服务器时可以与之保持连接请求的等待客户数量,不指定默认为50
ServerSocket(int port,int backlog,InetAddress bindAddr) | 多块网卡和多个IP的情况- 常用方法:
Socket accept() | 用于等待客户端的连接
InetAddress getInetAddress() | 返回一个InetAddress对象,里面封装了IP地址
boolean isClosed() | 判断ServerSocket对象是否为关闭状态
void bind(SocketAddress endpoint) | 将ServerSocket对象绑定到指定的IP地址和端口号 -
Socket:
- 构造方法:
Socket()
Socket(String host,int port)
Socket(InetAddress address,int port)- 常用方法:
int getPort() | 返回int型的Socket对象与服务器端连接的端口号
InetAddress getLocalAddress() | 获取Socket对象绑定的本地IP地址
void close() | 关闭socket连接,结束本次通信
InputStream getInputStream() | 返回一个输入流对象,如果该对象是有服务器端的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据
OutputStream getOutputStream() | 返回一个输出流对象,如果该对象是由服务器端的Socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据
void shutDownOutput() | 关闭客户端输出流,如果在客户端不调用,服务器端就不会读到-1(传输结束标志)