夯实基础系列一:Java 基础总结

2023-05-29 0 1,090

序言

大学期间接触 Java 的天数也不短了,不论自学还是应聘,都让我察觉到此基础的必要性。互联网发展博蒙阿了,各式各样框架各式各样控制技术更新插值的速度非常快,可能你正好掌控了两门控制技术的应用,它却已经走在出局的边缘了。

而自学新控制技术总要付出一定的天数生产成本,那么是不是降低天数生产成本呢?那就是打好此基础,控制技术再是不是技术革新,下层的东西也很少会变动,稳固的此基础会协助你在各式各样新控制技术的自学中得心应手,快速上手。

因为我优先选择的路径是前台开发,因此聊聊我认为的此基础有哪些。其他路径肯定也有他们的体系,从上层到高层人士,可以他们探索。前台的话,我觉得网络科学知识,各式各样协议,web 科学知识,资料库科学知识,Linux INS13ZD以及他们优先选择的前台词汇科学知识,那些是最此基础最须要稳固掌控的。

因此皮利皮,会出一系列与前台此基础相关的昌明,一是对他们过去自学的一个归纳,二是撷取出来,希望可以协助到须要的人。

概述

Java 此基础我做了 10 个方面的归纳,包括基本原理,流程词汇,URL,基本类别与演算,字符串与字符串,极度处置,Java 网络平台与缓存管理工作,分布式 Java 应用,多处置器,IO。以下对那些内容做一些简单的归纳,同时我也有完整的观念填空,网志上不方便展现,若有须要,联系我

夯实基础系列一:Java 基础总结

细节

1. 基本原理

1.1 词汇特点

纯流程词汇网络平台毫无关系性内建C#支持web可靠性防止代码攻击 易用性

强类别监督机制废弃物拆解器极度处置巡查监督机制 除去C++中难以理解易混为一谈的特性

1.2 与C++比较

解释校对优选词汇,执行速度快,虚拟化纯流程词汇,只有类,不存在自上而下表达式或自上而下表达式无操作符,无大继承,可多实现废弃物拆解器自动管理工作缓存

1.3 main表达式科学知识

Java流程出口处方法可由final,synchronized润色,不能用abstract

1.4 Java流程调用次序

动态强于非动态派生类强于常量按照成员表达式的定义次序一共10个

1.5 返回值与可见性

动态表达式属于类局部表达式属于花括号成员表达式看下一条public、protected、default、private 可见性依次递减

1.6 构造表达式

与类名相同,无返回值可重载,不能被继承,即不能被覆盖参数个数任意伴随new 一起调用,为系统调用完成对象的调用工作常量可通过super显式调用派生类。派生类没有提供无参,常量必须显式调用未定义,默认无参,润色符取决于类润色符

1.7 标识接口

无任何方法声明表示实现它的类属于一个特定的类别

1.8 clone 方法

实现Cloneable接口重写Object类中的clone()clone()中调用super.clone()把浅复制引用指向新的克隆体

1.9 反射

定义:允许流程在运行时进行自我检查,也允许

1.10 创建对象的四种方式

new反射监督机制clone()反序列化

1.11 package 作用

提供多层命名空间,解决命名冲突对类按功能进行分类,使项目组织更加清晰

2. 流程词汇

2.1 与面向过程区别

层次逻辑关系不同。流程词汇是通过类的层次结构来体现类之间的继承与发展面向过程是通过模块的层次结构概括模块与模块间的关系与功能数据处置方式不同与控制流程方式不同流程词汇是数据与操作封装成一个整体,通过事件驱动来激活和运行流程面向过程是数据单独存储,控制流程方式上按照设计调用或返回流程

2.2 特性

抽象继承多态封装

2.3 这种开发方式优点

开发效率高。代码重用保证软件的鲁棒性。经过长期测试的已有代码保证软件的高可维护性。设计模式成熟

2.4 继承

单继承只能继承派生类的非私有成员表达式和方法同名成员表达式,常量覆盖,不会继承相同表达式签名,常量覆盖,不会继承

2.5 组合和继承区别

组合:在新类中创建原有类的对象。has a继承是 is a

2.6 多态

方法重载校对时多态方法覆盖运行时多态成员表达式无大态概念

2.7 覆盖和重载区别

子派生类关系,垂直;同类方法间关系,水平一对方法发生关系;多个方法发生关系参数列表相同;参数列表不同调用的方法根据对象的类别决定;根据调用时的实参表决定方法体

2.8 抽象类与接口异同

不能被实例化接口的实现类实现了接口,抽象类的常量实现了方法,才能被实例化

接口只能定义方法,不能实现;抽象类可以有定义和实现接口须要被实现;抽象类须要被继承接口强调特定功能的实现;抽象类强调所属关系接口成员表达式默认为 public static final,成员方法 public abstract抽象类表达式默认default,方法不能用 private、static、synchronized、native 润色

2.9 内部类

动态内部类static 润色只能访问外部类中的static数据成员内部类与实例绑定不可定义动态属性和方法外部实例化后,该内部类才能被实例化局部内部类代码块内不能被public、protected、private以及static润色只能访问final 局部表达式匿名内部类无类名无构造表达式,必须继承或实现其他类原则无构造表达式无动态成员,方法和类不能是public、protected、private、static只能创建匿名内部类的一个实例new 后面有继承或实现特殊的局部内部类

2.

利用反射:obj.getClass().getSuperClass().getName()不使用super.getClass()原因:该方法在 Object中为final与native,常量不能覆盖,返回此Object运行时类

2.11 this

指向当前实例对象区分成员表达式与方法形参

2.12 super

访问派生类成员表达式或方法常量同名会覆盖,访问派生类只能通过super常量构造表达式需显示调用派生类构造表达式时,super()必须为构造表达式的第一条语句

3. URL

3.1 表达式命名

英文字母数字_和$不能包含空白字符首字符不能为数字保留字不能做标识符区分大小写

3.2 assert

软件调试 运行时开启 -ea

3.3 static

特定类的统一存储空间,类绑定成员表达式:属于类,缓存中只有一个复制成员方法:调动态数据。可实现单例模式代码块:调用动态表达式,只被执行一次内部类:不能与外部类重名,只能访问外部类动态数据(包括私有)

3.4 switch

多分支优先选择整型或字符类别表达式或整数表达式Java 7 开始支持 String。原理是String的hashCode()返回的int类别值匹配

3.5 volatile

保证线程间的可见性从缓存中取数据,而不是缓存不保证原子性

3.6 instanceof

二元演算符判断一个引用类别的表达式所指向的对象是否是一个类的实例即左边对象是否是右边类的实例

3.7 strictfp

精确浮点确保浮点演算的准确性若不指定,结果依赖于虚拟机网络平台指定后依赖于统一标准,保证各网络平台的一致性

3.8 null

不是合法的Object实例无缓存表明该引用目前没有指向任何对象

4. 基本类别与演算

4.1 基本数据类别

int长度byte(8 bit)short(16 bit)int(32 bit)long(64 bit)float长度单精度(32 bit float)双精度(64 bit double)boolean 类别表达式的取值truefalsechar数据类别:Unicode字符(16 bit)void:java.lang.Void 无法直接对其进行操作

4.2 不可变类

实例创建后,值不可变所有的基本类别的包装类+String优点使用简单线程安全节省缓存缺点:会因为值的不同而产生新的对象,导致无法预料的问题

4.3 类别转换

隐式类别转换低精度到高精度byte->short->char->int->long->float->double显式类别转换反之可能会损失精度类别自动转换低到高char类别会转换为其对应的ASCII码byte、char、short参与演算自动转为int,但”+=”,不转基本数据类别与boolean不能相互转换多种类别混合演算,自动转成容量最大类别演算符优先级点 () [] +(正) -(负) ++ — ~ ! * / % +(加) -(减) << >> >>> < <= > >= instanceof == != & | ^ && || ?: = += -= *= /= %= &= |= ^= ~= <<= >>= >>>=

5. 字符串与字符串

5.1 字符串创建与存储监督机制

堆常量池new String(“abc”)创建1个或2个对象

5.2 ==、equals和hashCode区别

== 比较引用,缓存未覆盖,同==;比较内容hashCode鉴定对象是否相等,返回整数

5.3 String,StringBuffer,StringBuilder

String:不可变,执行效率最低StringBuffer:可修改,线程安全,效率较高StringBuilder:可修改,线程不安全,效率最高

5.4 其他

字符串调用方式length属性和length()方法

6. 极度处置

6.1 finally块执行时机

若try中有return,在return前若try-finally或catch-finally中都有return,finally会覆盖

6.2 finally代码块不是一定会被执行

流程进入try之前出现极度try中调用System.exit(0)

6.3 Error

严重错误,不可恢复

6.4 Exception

可恢复,校对器可捕捉检查性极度IOSQL运行时极度JVM处置NullPointExceptionClassCastExceptionArrayIndexOutOfBoundsException出现极度后,一直往上层抛,直到遇到处置代码或最上层多态。若先捕获基类,再捕获常量。常量处置代码将永远不会得到执行

7. Java网络平台与缓存管理工作

7.1 Java网络平台与其他词汇网络平台的区别

纯软件,包括JVM与JAVA APIJVM虚拟,不虚拟化

7.2 JAVA代码的执行

代码校对为class:sun jdk 中javac装载class:ClassLoader执行class解释执行校对执行client compilerserver compiler

7.3 java源码校对监督机制

词法分析器组件:Token流语法分析器组件:语法树语义分析器组件:注解语法树将语法树中的名字、表达式等元素与表达式、方法、类别等联系到一起检查表达式使用前是否已声明推导泛型方法的类别参数检查类别匹配性进行常量折叠检查所有语句都可到达检查表达式的确定性赋值解除语法糖将泛型JAVA转成普通Java检查所有checked exception都被捕获或抛出将含语法糖的语法树转成简单语法树eg:foreach,自动折叠代码生成器组件:字节码

7.4 类加载监督机制

装载:全限定名+类加载器加载类链接校验格式不符,抛VerifyError加载引用的类失败:抛NoClassDefFoundError准备:动态表达式默认调用解析:属性、方法验证(可选)调用(不是类加载必须触发的)动态调用代码构造器代码动态属性调用触发时机调用了new反射调用了类中的方法常量调用了调用JVM启动过程中指定的调用类Bootstrap Class Loader:$JAVA_HOME/jre/lib/rt.jarExtension Class Loader:$JAVA_HOME/jre/lib/ext/*.jarSystem Class Loader:$CLASSPATHUser Defined Class Loader

7.5 类执行监督机制

解释执行

JVM字节码为中间代码,由JVM在运行期对其解释并执行invokestaticinvokevirtualinvokeinterfaceinvokespecial基于栈代码紧凑,体积小线程创建后,产生PC和Stack指令解释执行栈顶缓存:栈顶值缓存在寄存器上部分栈帧共享 校对执行

client compiler轻量级,占缓存少方法内联去虚拟化冗余消除server compiler重量级,占缓存多逃逸分析是C2进行很多优化的此基础标量替换:用标量替换聚合量栈上分配若对象未逃逸,C2会优先选择在栈上直接创建Point对象实例,而不是在堆上栈上分配更快速,对象易拆解同步消除:如果发现同步的对象未逃逸,那也没有同步的必要。C2会去掉同步代码块

7.6 缓存空间

方法区:类信息,线程共享堆对象实例+字符串分代管理工作新生代旧生代本地方法栈:支持native方法,Sun JDK的实现中本地方法栈和JVM方法栈是同一个PC寄存器:线程私有JVM方法栈:线程私有

7.7 缓存分配

Java对象,堆上分配,分配需加锁,开销大当堆上空间不足–>GC–>仍不足–>抛OutOfMemorySun JDK 为新创建的线程在Eden上分配TLAB多个小对象比大对象分配更高效基于逃逸分析直接从栈上分配

7.8 缓存拆解

收集器引用计数收集器计数器增减有消耗不适合循环引用跟踪收集器集中式管理工作自上而下记录数据的引用状态从根集合扫描对象,可能会造成应用流程暂停三种实现算法复制适用于拆解空间中存活对象较少缺点:须要增加一块空的缓存空间及进行对象的移动标记-清除:会产生缓存碎片标记-压缩:不产生缓存碎片Sun JDK中可用GC新生代串行GC(Serial GC):复制算法Minor GC强软弱虚并行拆解GC(Parrallel Scavenge):扫描复制多处置器并行 GC(ParNew):配合旧生代 CMS旧生代和持久代可用GC串行:标记压缩+清除并行:标记压缩并发:CMS标记:暂停并发标记:恢复,轮询着色对象,以标记它们重新标记:暂停并发收集:恢复CMS缓存拆解易产生碎片,但是它提供了整理碎片的功能浮动废弃物:CMS拆解时产生应该拆解但要等到下次CMS才能被拆解掉的对象Full GC对新生代旧生代及持久代都进行的GC触发的四种情况旧生代空间不足持久代空间满CMS GC出现promotion failed和concurrent mode failure统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间

7.9 缓存泄露

一个不再被流程使用的对象或表达式还在缓存中占有存储空间符合废弃物拆解标准对象赋空值null给对象赋予新值,重新分配了缓存空间泄露的两种情况堆中申请的空间没有被释放对象不再被使用,但仍然存活在缓存中泄露原因动态集合类各式各样连接监听器表达式不合理的返回值单例模式

8. 分布式Java应用

8.1 基于消息方式实现系统间的通信

TCP/IP+BIOsocket.setSoTimeOut()设置等待响应的超时天数一连接一线程缺点:无论连接是否真实,都要创建线程BIO下服务器端所处置的事件Buffer:存放处置的数据NIO Reactor模式,通过注册感兴趣的事件及扫描是否有感兴趣的事件发生,从而做出相应的动作多个请求,连接复用只有在有真实的请求时,才会创建线程一请求一线程UDP/IP+BIODatagramSocket:负责监听端口,读写数据DatagramPacket:作为数据流对象进行传输UDP/IP+NIODatagramChannel:监听端口,进行读写ByteBuffer:数据流传输NIO好处:只在有流要读取或可写入流时才做出相应的IO操作,而不像BIO方式阻塞当前线程

8.2 基于远程调用方式实现系统间的通信

远程调用方式系统间通信和系统内一样让使用者感觉调DL文件将应用+WSDL文件放入HTTP服务器借用Java辅助工具根据WSDL文件生成客户端stub代码stub将产生的对象请求信息封装为标准化的SOAP格式数据,并发请求到服务器端服端在接收到SOAP格式数据时进行转化,反射调用相应的Java类SOAP优点支持跨词汇,缺点对复杂对象结构难支持

8.3 基于开源框架

Spring RMI

9. 多处置器

9.1 线程资源同步监督机制

JVM保证以下操作次序同一线程操作对于main Memory 上的同一个表达式的操作对于加了锁的main Memory上的对象操作为避免资源操作的脏数据问题,JVM提供了synchronizedvolatilelock/unlock目的是控制资源竞争

9.2 线程交互监督机制

基于Object的wait/notify/notifyAll为避免假唤醒,须要double check调用对象的wait–>wait sets—>释放锁—>其他线程notify—->wait sets—->执行此对象线程—>删除sets中此线程基于JDK 5 并发包,支持线程交互Semphore的acquire,releaseCondition的await,signalCountDownLatch的await和countDown

9.3 线程状态

NewRunnable RunningWaitTimedWaitBlockedTerminated

9.4 sleep()与wait()方法的区别

sleep暂停一段天数执行Thread的动态方法不释放锁须要捕获极度wait使线程暂停执行Object方法,用于线程间通信释放锁

9.5 守护线程

前台提供服务用户线程全部终止,只剩下守护线程时,JVM就会退出调用start()之前,调用线程对象的setDaemon(true)

9.6 join

调用该方法的线程在执行完run()后,再执行join方法后面的代码线程合并,实现同步功能

10. IO

10.1 流本质

数据传输

10.2 流分类

字节流:不使用缓存字符流码表映射使用缓存

10.3 装饰者模式

运行时动态给对象增加额外的职责是你还有你,一切拜托你FilterInputStream

10.4 Java Socket

ServerSocket server = new ServerSocket(2000);Socker socket = server.accept();客户端:Socket socket = new Socket(“localhost”,2000);

10.5 NIO

Channel–Selector–Buffer反应器模式

10.6 序列化

对象持久化方式解决在对对象流进行读写操作时引发的问题对象写进流里进行网络传输,保存到文件,资料库

10.7 如何实现序列化

实现Serializable接口使用FileOutputStream来构造ObjectOutputStream对象使用该对象的writeObject(obj)方法将对象写出要恢复时,使用对应的输入流

10.8 序列化特点

一个类能被序列化,它的常量也能被序列化static代表类成员,transient代表临时数据。均不能被序列化序列化影响性能,须要才使用须要通过网络来发送对象,或对象的状态须要被持久化到资料库或文件中序列化能实现深复制,即可以复制引用的对象

10.9 反序列化

将流转化为对象UID最好他们定义。优点提高流程运行效率。省去计算过程提高流程不同网络平台兼容性。不同计算方式,反序列化失败增强流程各个版本的可兼容性。加入新属性,默认UID变化

10.10 外部序列化

实现Externalizable接口控制
夯实基础系列一:Java 基础总结

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务