后台技术汇
后台技术汇
技术社区
书接上回:《探寻内部类的奥秘(上)》,今天我们继续研究:四种内部类的定义与使用,继承机制对内部类的影响,以及内部类的底层编译原理。在定义内部类的时候,可以在其前面加上一个权限修饰符 static。此时这个内部类就变为了静态内部类。Nested classes are divided into two categories: static and non-static. Nested classes
13
3
0
3
在此之前,我们需要了解,内部类与组合是完全不同的概念,虽然它看起来像是一种代码隐藏机制,但其实内部类是了解外围类,并且能与之通信。下面,我们深刻探讨内部类的用法与底层原理。​内部类的定义:将一个类的定义放在另一个类的定义内部,我们称之为内部类。​内部类可以分为四种:成员内部类:和成员变量一个级别局部内部类:在方法里的内部类(方法域内生效 或者 方法内某一段代码块域内生效)匿名内部类:基本上属于接口
18
3
0
3
技术社区
各种操作系统均提供了线程的实现(内核线程),线程是 CPU 进行工作调度的基本单位。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件 I/O 等),又可以独立调度(线程是 CPU 调度的基本单位)。而编程语言一般都会提供操作内核线程的 API, Java 也不例外。操作内核线程的模型主要有如下三种:使用内核线程(1:
20
3
0
3
技术社区
Docker 的操作围绕镜像、容器、仓库三大核心概念。下面我们通过围绕四个问题:1、容器是什么;2、容器与虚拟机的区别;3、Namespace 技术是什么;4、Docker 的三个核心概念是什么;来入门掌握 Docker。容器: 在 Linux 中,容器技术是一种进程隔离的技术,应用可以运行在一个个相互隔离的容器中,与虚拟机相同的是,可以为这些容器设置计算资源限制,挂载存储,连接网络,而与虚拟机不
25
3
0
3
技术社区
创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。原型模式目的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,进而减少在创建新对象上的性能开销。原型模式也是创建型的设计模式之一,本文是设计模式系列(共24节)的第 4 篇文章。设计模式都从六大原则出发进行总结:《第一节:设计模式的六大原则》创建型设计模式共 5 种:单例模式(
10
3
0
3
技术社区
创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。单例模式目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式也是创建型的设计模式之一,本文是 设计模式系列(共 24 节) 的第 2 篇文章。设计模式是基于六大设计原则进行的经验总结:《第一节:设计模式的六大原则》创建型设计模式共 5 种:单例模式(Singleton Patt
12
3
0
3
技术社区
String 是日常开发非常频繁的类,此外我们常用的操作还有字符串连接操作符等等。String 对象是不可变的,查看 JDK 文档,我们不难发现 String 类的每个修改值的方法,其实都是创建了一个新的 String 对象,以包含修改后的字符串内容。我们分析 String 源码,除了要理解它提供的方法是如何被使用,如果结合 JVM 内存结构的设计思路来一起分析,可以举一反三。开讲前,我们先回顾下
26
3
0
3
技术社区
Lambda 和 Stream 是 Jdk1.8 中引入的两个重要特性。Lambda 是函数式编程,可以将匿名方法像参数一样传递,本章节将从 4 个方面来介绍 lambda:Lambda 基础语法、Lambda 表达式的应用层面、Lambda 的字节码源码 以及 优缺点性能。开讲前,我们先回顾下 JVM 的内存管理结构,这节我们会涉及到方法区:程序计数器(Program Counter Regis
56
3
0
3
技术社区
Object 类是一个比较特殊的类,是所有类的超级父类,java 中如果一个类没有用 extends 关键字 明确指出继承于某个类,那么它默认继承 Object 类。下面我们一起分析这个默默被所有类所继承的 Object。Object 类是 Java 中所有类的父类,作为最重要的基类,它提供了 12 个默认实现方法(jdk8)。在解析每个方法的功能实现和用途之前,我们需要理解几个概念:Monito
8
3
0
3
技术社区
项目开发中,很多应用场合都会出现对 kafka 的应用,比如,不同的微服务 DB 数据同步、服务间的异步通知等等。笔者在此做个系统的总结,方便日后复习,希望对大家的面试笔试都有帮助。1)下载安装包,解压安装包,eg:https://www.apache.org/dyn/closer.cgi?path=/kafka/2.6.0/kafka_2.12-2.6.0.tgz2)检查修改配置文件,安装包的解
16
3
0
3
技术社区
HTTP,Hypertext Transfer Protocol,超文本协议,是在万维网上传输文件(如文本、图形图像、声音、视频和其他多媒体文件)的规则集。如果 web 用户打开他们的 web 浏览器了,其实该用户就间接地利用到了 HTTP。HTTP (Hypertext Transfer Protocol) is the set of rules for transferring files, 
163
3
0
3
技术社区
给定一个 Class 实例,我们可以获得 Constructor(构造器)、Method(方法)和 Field(域),而这些对象提供了“通过程序来访问类的成员变量、域类型、方法签名等信息”的能力。通过调用 Constructor、Method、Field 实例上的方法,可以:构造底层类的实例、调用底层类的方法、访问底层类中的域。例如,Method.invoke 使你可以调用任何类的任何对象上的任何
501
4
0
3
技术社区
在 Java1.5 发行版中,加入了可变参数列表方法,称为 variable arity method(可匹配不同长度的变量的方法)。可变参数机制:通过创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法。我们通过例子简单了解可变参数的使用:复制代码再看一个例子,我们可以在代码运行时检测可变参数数组长度:复制代码上面实现了获取可变参数列表的最小值,但有
10
3
0
3
技术社区
因此在学习设计模式之前,我们先回顾六大原则,它们分别是:单一职责原则(Single Responsibility Principle)开闭原则(Open Closed Principle)里氏替换原则(Liskov Substitution Principle)迪米特法则(Law of Demeter),又叫“最少知道法则”接口隔离原则(Interface Segregation Principl
40
3
0
3
技术社区
终结方法(finalizer)通常是不可预测的,也是危险的,一般情况下是不必要的。使用终结方法会导致行为不稳定,降低性能,以及可移植性问题。但终结方法也有其可用的地方,详见下文。在 java 中,终结方法一般会结合 try-finally 块来一起使用,在 finally 子句内部调用终结方法。不要被 System.gc 和 System.runFinalization 这两个方法所诱惑,它们确实
13
3
0
3
技术社区
给定一个 Class 实例,我们可以获得 Constructor(构造器)、Method(方法)和 Field(域),而这些对象提供了“通过程序来访问类的成员变量、域类型、方法签名等信息”的能力。通过调用 Constructor、Method、Field 实例上的方法,可以:构造底层类的实例、调用底层类的方法、访问底层类中的域。例如,Method.invoke 使你可以调用任何类的任何对象上的任何
9
3
0
3
技术社区
对于 Git 项目开发,有一些可视化的工具,如 gitk,giggle 等,来查看项目的开发历史。但本文主要讲解 gitstats 的部署和效果,对于需要写工作总结报告的同事,相信这个工具可以帮助你们在工作量数据栏上添砖加瓦。gitstats 是一个 git 仓库分析软件,可以帮助你查看 git 仓库的提交状态,根据不同维度分析计算,并自动生成数据图表。GitStats 所生成统计信息常用分为如下
15
3
0
3
技术社区
因为 JVM 提供了自动管理内存的能力,当我们用完了对象之后,它们会被自动回收,这也容易让我们产生“开发者不再需要考虑内存管理”的错觉了,其实不然。上面提到,即使 JVM 为我们提供了垃圾回收器,将没用的对象回收以节省内存使用。下面我们通过一个例子,意识到内存泄露的存在:复制代码上面程序段隐藏着一个“内存泄露”的问题:随着垃圾回收器活动的增加,或者由于内存占用的不断增加,程序性能的降低会逐渐表现出
21
3
0
3
技术社区
对于一个返回 null 而不是零长度数组或者集合的方法,客户端几乎每次用到该方法都可能会忘记写专门处理 null 返回值的代码,进而导致 NPE。有时候会有程序员认为:null 返回值比零长度数组更好,因为它避免了分配数组所需要的开销,但这种观点站不住脚。在返回值这种级别上担心性能问题是不明智的,除非分析表明这个方法是造成性能问题的真正源头返回空数组,可以使用集合实现类的 toArray()方法,
12
3
0
3
技术社区
一般来说,最好能重用对象,而不是在每次需要的时候创建同一个相同功能的新对象。重用对象是快速又高效的一种编码手段。本节讨论的目标:就是如何优化已经出现重复创建对象的代码块,以达到优化性能。本文属于《读懂 Effective Java》系列文章,本系列文章的大纲如下:《Effective Java 第3条:用私有构造器或者枚举类型强化Singleton属性》《Effective Java 第4条:通过
20
3
0
3