JAVA基础知识

2020-04-21 16:02:54来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

JAVA基础知识

最近逐渐向JAVA方向转了 ,有时间学习一下JAVA的基础知识,记录下一些笔记,以便以后参考查询,以后有时间会经常更新一些

1java中,基本的数据类型:浮点型float、字符型char ,布尔类型boolen,数值类型 byteshortintlong

 

 

 

 

 

 

2、二进制转换成十进制 11101------29

采用Unicode编码,一个Unicode16位(2个字节)来表示

3int Integer的区别

1intjava语言提供的八种基本的原始数据类型之一,当作为对象的属性是,他的默认值是0

Integerjava int提供的封装类,默认值为null,由此可见,int无法区分未赋值与赋值为0 的情况,而Integer确可以区分这两种情况

2int是基本数据类型,在使用的时候是值传递;而Integer是引用传递

3int只能用来运算,而Integer可以做更对的事情,因为Integer提供了很多有用的方法,

4)当需要往容器(例如list)里存放整数时,无法直接存放int,因为List里面存放的都是对象,所以在这种情况下只能用Integer

4、流

java语言中,输入和输出都被称作抽象的流,流可以看做是一组有序的字节集合,即数据在两个设备之间的传输

流的本质是数据传输,根据处理数据的类型不同,流可以分为两大类:字节流和字符流。其中前者以字节为单位(8bit),包含两个抽象类:InputStream(输入流)OutputStream(输出流)。字符流以字符(16bit)为单位,根据码表映射字符,一次可以读多个字节,包含两个抽象类:Reader(输入流)和Writer(输出流)。其中字节流和字符流的主要区别为:字节流在处理输入输出的时候不会用到缓存,而字符流用到了缓存。

InputStreamReader都可以用来读取数据(从文件中读取数据或从Socket中读取数据),最主要的区别如下:InputStream 用来读取二进制数(字节流),而Reader用来读取文本数据,即Unicode字符,那么二进制数与文本数据有什么区别呢?从本质上来讲所有读取的内容都是字节,想要把字节转换为文本需要制定一个编码方法,而Reader就可以把字节流进行编码从而转换为文本。当然,这个转换过程就涉及编码方式。他采用系统默认的编码方式对字节流进行编码,也可以显式的制定一个编码方式,例如“UTF-8”。尽管这个概念非常简单,但是java程序员经常会犯一些编码的错误,最常见的错误就是不指定编码方式。在读取文件或者从Socked读取数据的时候,如果没有指定正确的编码方式,读取的数据就可能会有乱码

FileInputStreamFileReader有着类似的区别,他们都是从文件中读取数据,前者读取二进制数据,后者读取字符数据

5、序列化

在分布式环境下,当进行远程通信时,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。序列化是一种将对象转换为字节序列的过程。用于解决在对对象六进行读写操作时引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件。数据库等系统里,并在需要的时候把该流读取出来重新构造一个相同的对象。所有要实现序列化的类都必须实现Serializable接口,Serializable接口位于java.lang包中,它里面没有包含任何方法,使用该对象的writeObjectObject obj) 方法就可以将obj对象写出(即保存其状态),要恢复的时候就可以使用对应的输入流,具体而言,序列化的主要特点有:

1)如果一个类能被序列化,那么他的子类也能够被序列化

2)由于static(静态)代表类的成员,transientjava关键字,如果用transient声明一个实例变量,当变量存储式,他的值不需要维持)代表的是临时数据,因此,被声明为这种类型的数据成员是不够被实例化的

3)子类实现了Serializable接口,父类没有,父类中的属性不能被实例化,但是自列中的属性仍然能够被实例化。

6、网络通讯

JAVA语言中,Socket的链接和建立的原理是什么?

https://www.jianshu.com/p/066d99da7cbd

网络上的两个程序通过一个双向的通讯链接实现数据的交换,这两个双向链路的一端成为一个SocketSocket也称套接字,可以用来实现不同虚拟机或不同计算机之间的通信。在Java语言中,Socket分为两种类型:面向连接的Socket(TCP传输控制协议)通信协议和面向无连接的SocketUDP用户数据报协议)通信协议,任何一个Socket都是由IP地址和端口号唯一确定的

 

 

 


基于TCP协议的通信过程如下:首先,serverListen(监听)指定的某个端口(建议使用大于1024的端口)是否有连接请求,然后Client端向server端发出Connect请求,紧接着,server端向Client端发回Accept(接受)消息一个连接就建立起来了,会话随即产生,server端和Client端都可以通过SendWrite等方法进行通信,

Stocket的声明周期可以分为三个阶段:打开Socket,使用Socket收发数据和关闭Socket,在java中可以使用ServerSocket作为服务端,Socket作为客户端来实现网络通信

7、描述Java类加载器的原理及其组织结构

Java语言是一种具有动态性的解释型语言,类只有被加载到JVM中够才能运行,当运行程序时,JVM会讲编译生成的.class文件按照需求和一定的规则加载到内存中,并组成一个完整的java应用程序。这个加载过程时由加载器来完成的,具体而言,就是有ClassLoader和他的子类来实现的,类的加载器本身也是一个类,其实质是把类的文件从硬盘读取到内存中。

类的加载方式分为隐式装载和显式装载两种,隐式装载指的是程序在使用new等方式创建对象的时候,会隐式的调用类的加载器把对应的类加载到JVM中,显式装载指的是通过直接调用class.forName()方法将所需要的类加载到JVM

任何的一个工程项目都是由许多个类组成的,当程序启动时,只把需要的类加载到JVM中,其他的类只有在被使用的时候才会被加载,采用这种方法,一方面可以加快加载速度,另一方面可以节约程序运行过程中对内存的开销,此外,在Java语言中,每个类或者接口都对应一个.class文件,这些文件可以被看成是一个个可以被动态加载的单元,因此当只有不分类被修改的时候,只要重新编译变化的类即可,而不需要重新编译所有的文件,因此加快了编译速度

java云烟中,类的加载是动态的,他并不会一次性的将所有的类全部加载后再运行,而是保证程序运行的基础类完全加载到jvm中,至于其他类,则在需要的时候才加载,在Java语言中可以把类分为三类 系统类、扩展类和自定义类。Java语言针对这三种不同的类提供了三种类型的加载器,这三种加载器的关系如下:

BootstrapLoader ---复制加载系统类(jre/lib/rt.jar的类)

--ExtClassLoader --负责加载扩展类(jre/lib/ext/*.jar的类)

AppClassLoader ---负责夹杂应用类(classpath指定的目录或jar中的类)

他们通过委托的方式实现,具体而言,就是当有类需要被加载时,类装载器会请求父类来完成这个载入工作,父类会使用其自己的搜索路径来索索需要被载入的类,如果搜索不到,才会有子类按照其搜索路径来搜索

 

 

 

 

 

类加载的主要步骤:

1)装载:根据查找路径找到对应的.class文件,然后导入

2)链接:检查:检查待加载的class文件的正确性

准备: 给类中的静态变量分配存储空间

解析: 将符号引用转换成直接引用(这一步是可选的)

3)解析:对静态变量和静态代码块执行初始化工作。

8JVM工作原理

为了便于管理,JVM在执行Java程序的时候,会把他管理的内存划分为不同的区域,如下图所示

 

 

 


以下将分别对这些去进行介绍

1class文件

class文件是java程序编译后生成的中间代码,这些代码将会被jvm解释执行

2)类装载器子系统 负责把class文件装载到内存中,供虚拟机执行

JVM有两种装载器,分别是启动类装载器和用户自定义装载器,其中,前者是JVM实现的一部分,后者则是JAVA程序的一部分,必须是ClassLoader类的子类,常见的类加载器主要有以下几种:

①BootstrapLoader 这是JVM的跟ClassLoader,他是用c++语言实现的 ,当JVM启动时,初始化此ClassLoader,并由此ClassLoader完成$JAVA_HOME中的jre/lib/rt.jar(Sun JDK的实现)中的所有class文件的加载,这个jar中包含了JAVA规范定义的所有的接口及实现

②Extension ClassLoader JVM用此ClassLoader来加载扩展功能的jar包
③System ClassLoader。JVM用此ClassLoader来加载启动参数中指定的Classpath中的jar包以及目录,在Sun JDK 中,ClassLoader对应的类名是APPClassLoader
④ User-Define ClassLoader。是Java开发人员继承ClassLoader抽象类自行实现的ClassLoader。基于自定义的ClassLoader可用于加载非Classpath中的jar以及目录
3)方法区
方法区用来存储被虚拟机加载的类信息、常量、静态变量和编译器编译后的代码等数据,在类加载器加载class 文件时,这些信息会被提取出来,并存储到方法中。由于这个区域是所有县城共享的区域,因此他被设计成为新城安全的。
方法区中还存放了运行时的常量池,最典型的应用就是字符串常量 例如定义了如下语句:String s="Hello";String s1=“Hello”;,其中。“Hello”是字符串常量,存储在常量池中。两个字符串引用s1和s都指向常量池中的“Hello”
4)堆
堆是虚拟机启动时候创建的被所有县城共享的区域,这块区域主要用来存放对象的实例,通过new操作创建出来的对象实例都存储在堆空间中,因此,堆就成为垃圾回收管理器管理的重点区域
5)虚拟机栈
栈是线程私有的区域,每当有新的线程创建时,就会给他分配一个栈控件,当线程结束后栈控件被回收,因此栈与线程拥有相同的生命周期,栈主要用来实现java语言中的方法的调用与执行,每个方法在被执行的时候,就会创建一个栈帧用来存储这个方法的局部变量、操作栈、动态链接和方法出口等信息,当进行方法调用时,通过压栈与弹栈等操作进行栈控件的分配与释放。当一个方法被调用的时候,就会压入一个新的栈帧到这个线程的栈中,当方法调用结束后,就会弹出这个栈帧,从而回收调用这个方法使用的栈空间
6)程序计数器
程序计数器也是线程私有的资源,JVM会给每个线程创建单独的程序计数器,他可以被看做是当前线程执行的字节码的行号指示器,解释器的工作原理就是通过改变这个计数器的值来确定下一条需要被执行的字节码指令,程序控制的流程(循环、分支、异常处理。线程恢复)都是通过这个计数器来完成的
7)本地方法栈
本地方法栈与虚拟机栈的作用是相似的,唯一不同的是虚拟机栈为虚拟机执行java方法(也就是字节码)服务。而本地方法栈则是为虚拟机使用到的Native(本地)方法服务,本地方法接口都会用到某种本地方法栈,当线程调用java方法时,jvm会创建一个新的栈帧并压入虚拟机栈,然而当他调用的是本地方法时,虚拟机栈保持不变么不会在线程的虚拟机中压入新的帧,而是简单的动态链接并直接调用指定的本地方法,如果某个虚拟机实现的本地方法接口使用的是c++链接模型,那么他的本地方法栈就是c++栈
8)执行引擎
执行引擎主要负责执行字节码,方法的字节码是由java虚拟机的指令序列构成的,每一条指令包含一个单字节的操作码,后面跟随0个或者多个操作数,然后执行这个操作,执行完成后会继续取得下一个操作码去执行
在执行方法时,JVM提供了四种指令来执行
①invokestatic“调用类的static方法
②invokevirtual:调用对象实例的方法
③invokeinterface:将属性定义为接口来进行调用
④invokespecial:调用一个初始化方法,私有方法或者父类的方法
9)垃圾回收
垃圾回收主要是回收程序中不再使用的内存

 

 

 

 

 


原文链接:https://www.cnblogs.com/mingqi-420/p/12694027.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Docker安装Redis并介绍漂亮的可视化客户端进行操作

下一篇:RabbitMQ简介