Java 高级语法学习笔记(基础)

2023-11-15

目录

反射机制

Class 类

类初始化(类加载)

类的生命周期(七大阶段)

1.加载(接入.class文件)

2.验证(连接 linking 的第一阶段,为了安全)

3.准备*(分配内存及初步初始化)

4.解析(字符翻译成引用阶段)

5.初始化(代码正式开始执行的阶段)

6.使用

7.卸载

接口的加载

类和对象的初始化方法

反射原理(Class对象)

Class.forName() 方法

反射的使用

反射获取构造方法并使用

Constructor 类(管理构造函数的类)

反射方法的其它使用:

1.通过反射越过泛型检查

泛型(代码标准化)

如何通过反射拿到泛型的真实类型

泛型接口

泛型方法

泛型的类型擦除*

类型擦除带来的问题

泛型数组(栈)

类型边界(更灵活的类型设置)

通配符 ?(类型辅助限定)

上界通配符

下界通配符

扩展:泛型规范和建议

泛型命名规范:

使用泛型的建议


反射机制

Java 的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。(引用词条)

简短的说:反射就是在程序运行状态中访问类及其信息等等

而反射的原理在于Class对象!所以我们先讲讲Class类相关的知识,知道的可以跳到反射原理

Class 类

Class类是个特殊类,它映射着JVM运行时的类或接口的信息。

类初始化(类加载)

当程序主动使用某个类时,如果该类还未加载到内存中的话,则JVM会通过加载、连接、初始化来对该类进行加载。

特点:

  1. 类型的加载、连接、初始化都是在程序运行时完成的
  2. 让程序更加的灵活(因为加载是在运行时才完成的)

解析:

  • 类型:定义的类、接口称为类型(不涉及类的对象),而在类加载的过程中属于创建对象之前的类信息
  • 程序运行期间:只在运行时,这让程序更加的灵活(比如动态代理)

注意:

  • 类加载器会提前加载类,而不会等到它首次被主动使用时再加载它
  • 如果某类提前加载时遇到了它的.class文件缺失或错误,类加载器会直到它首次被主动使用时才报告错误(LinkageError错误),否则不会上报

类的生命周期(七大阶段)

(由图可知,类从被加载到虚拟机内存——>类被卸载出内存后死亡。一共经历了七个阶段)

注意:验证、准备、解析三个阶段统称为连接(linking),而有五个阶段(加载、验证、准备、初始化、卸载)的顺序是绝对固定的。所以类加载必须有这种顺序开始,所以其它解析和使用的顺序是不固定的,比如解析可以放在初始化后开始,这就支持了Java的运行时绑定(动态绑定/晚期绑定)

1.加载(接入.class文件)

加载阶段图解:

检查后加载:.class文件中二进制数据被读取到内存中,并放到运行时数据区的方法区,最后在堆中创建一个 java.lang.Class 对象(用来封装类在方法区的数据结构)。这个Class对象是类加载的最终产物,它对外提供了访问方法区内数据结构的接口。

根据图总结:.class文件(二进制数据) ——> 读取到内存 ——> 数据放入到方法区 ——> 堆中创建类对应的Class对象 ——>  由Class对象提供访问方法区的接口

(Class 对象位置 和 HotSpot 虚拟机:JDK1.7位于永久代。JDK1.8位于元空间并移除了永久代)继而它们实现了方法区,并可放入Class对象。

加载.class文件的方式:类加载器是程序运行的基础,其通常由JVM提供的(又叫系统类加载器)

  1. 从本地系统中加载
  2. 通过网络下载
  3. 从zip、jar等归档文件中加载
  4. 从专用数据库中提取
  5. 将.java文件动态编译成.class文件

JVM 为 java 类编译 Class 对象并存储在同名的 .class 文件中,在运行时需要生成该类的对象时, JVM 就会检查(该类是否装载到内存中)?生成实例对象:则把该类的.class文件装载到内存中

三元运算符,hhh

2.验证(连接 linking 的第一阶段,为了安全)

目的:确保被加载类的正确性(确保.class文件字节流的包含信息是否符合当前虚拟机的要求)

4个步骤的验证动作:

  1. 文件格式验证
  2. 元数据验证
  3. 字节码验证
  4. 符合引用验证

注意:验证阶段对于安全性比较重要,但对程序运行本身无影响。所以类经过反复验证,就可以考虑用 -Xverifynone 参数来关闭大部分的类验证操作,以缩短虚拟机类加载的时间。

3.准备*(分配内存及初步初始化)

验证阶段完成后,JVM 就会为类变量分配内存(分配内存于方法区)并初始化。也就是正式为类变量(静态变量)分配内存并设置其初始值。

在准备阶段是否被分配内存呢?

public static String s1 = "我已经被分配内存啦!";
public String s2 = "555 我还没有被分配内存呢!";

注意:JVM不会为类成员变量(实例变量)分配内存,实例变量的内存分配需等到初始化阶段才开始。而且类变量(静态变量)的初始化是赋系统的默认值,而不是程序员代码里设置的值。(如int类型就是0,String类型就是null)但是!如果它拥有 final 修饰符的话就直接是程序员代码里设置的值了。

因static提前分配内存的前提下,它们初始化为什么呢?

public static int i1 = 9;
//初始化为0,而不是代码设置里的9
public static final int i2 = 666;
//因为final修饰符,直接初始化为666

原因:因为final是常量/最终修饰符,赋值后就不改变(在程序运行期间),所以它修饰的变量就提前赋程序员设置的值。而非final修饰的变量的值可能随时被改变(在后面的阶段中),所以就不会提前赋值。

4.解析(字符翻译成引用阶段)

闯过准备阶段后就来到解析阶段。引用下大佬的话:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符 7 类符号引用进行。

注释:

  • 符号引用就是一组符号来描述目标,可以是任何字面量。
  • 直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

5.初始化(代码正式开始执行的阶段)

到这里程序才真正开始执行(前面只是准备工作、热热身)。

类的使用方式:

  • 主动使用:当某个类的首次被主动使用时,才会让它初始化/执行。下面是主动使用的种类:
    1. 创建类的实例,即 new 一个对象
    2. 其定义静态变量/静态方法被访问(常量池的除外)
    3. 体内有常量被访问
    4. 其子类被初始化
    5. 反射
    6. Java虚拟机 = 启动类的类(JavaTest)
    7. 包含 main 方法的类(首先被初始化的类)
  • 被动使用

6.使用

JVM 从入口方法(main方法)开始执行代码。

7.卸载

当代码执行完毕后,JVM就开始消耗其创建的Class对象,最后负责程序运行的JVM也退出了内存。

JVM(Java虚拟机)何时结束它的生命周期?

  1. 程序正常执行结束
  2. 执行了 System.out 方法
  3. 程序执行过程中遇到了异常/错误而终止
  4. 由于操作系统的错误而导致JVM进程终止

接口的加载

接口的加载阶段和类有所不同(接口更“懒”):类初始化时要求自己的所有父类都完成了初始化,但是接口初始化时只对用到的父接口进行初始化。

类和对象的初始化方法

编辑器按下面要素的在代码中的出现顺序,排序执行:

类初始化方法的成分要素:        静态变量的赋值语句、静态代码块

对象初始化方法的成分要素:        实例变量的赋值语句、构造代码块(如果没检测到构造方法的代码就不会执行对象初始化方法,所以对象初始化方法一般在创建类对象时执行)

请说出下列代码的执行顺序吧!

class First {
    public static int i = 1;
    static {
        System.out.println("First的静态代码块");
    }
}
public class ActiveUse {
    public static void main(String[] args) {
        First f;
        System.out.println("定义了一个对象引用 f");
        f = new First();
        System.out.println("实例化了 f 对象");
    }
}

隔离答案分界线

隔离答案分界线

隔离答案分界线

隔离答案分界线

隔离答案分界线

隔离答案分界线

运行结果:
            定义了一个对象引用 f
            First的静态代码块
            实例化了 f 对象

反射原理(Class对象)

我们知道,加载阶段时将.class文件读入内存后,相应的创建了一个Class对象。而反射的本质是通过Class对象来反向分析对象的各种组成信息(包括静态变量、构造方法、方法、所在包等等)

明确的是:

  1. Class对象是自动被创建且一个类只会产生一个
  2. Class对象就相当于类对象的“原本”,new的对象只是这个“原本”的“拓本”(所以相同类型都共享一个Class对象)

注意:Class 类没有公共构造方法。而Class对象是由加载类时的JVM(进一步说是其调用类加载器的defineClass方法)自动构造的。(所以我们不必手动创建Class对象,JVM会帮我们创建)

Class类的常用方法:(共有64个)
格式 效能
getName() 返回此Class对象表示的实体(类、接口、数组类、基本类型或void)名
newInstance() 用默认构造器(无参构造器)为类创建一个实例/对象
getClassLoader() 主要返回该类的类加载器
getComponentType() 主要返回数组组件类型的 Class
getSuperclass() 返回此Class对象表示的实体的超类的 Class
isArray() 判断此Class对象是否表示一个数组类

forName 和 newInstance 可以结合起来使用,根据存储在字符串中的类名创建对象。

Object obj = Class.forName("完整类名带包名").newInstance();

JVM为每个类型管理一个独一无二的Class对象,即Class对象是唯一的。因此可以使用 == 操作符来比较类对象。

if(e.getClass() == Employee.class) ...

Class.forName() 方法

forName() 是个获取Class对象(加载类)方法,并且是个静态方法。

newInstance() 和 new 创建对象的比较
newInstance() new
What 初始化一个类(使用类加载机制) 生成一个实例(创建一个新的类对象)
Why 考虑到设计问题 普通正常创建对象
How 弱类型,低效率,无参构造 强类型,高效率,能调用任何构造(非封装影响)

反射的使用

反射相关的 API 分为:

  1. 获取反射的Class对象
  2. 通过反射创建类对象
  3. 通过反射获取类属性、方法以及构造器

反射的本质已经说过了,就是在Class对象的基础上反向获取类对象的各种成分信息。所以反射第一步就是获取要被反射的类的Class对象

如何获取 Class 实例呢?
格式 备注
Class.forName("完整类名带包名") 静态方法(需要该类的全路径名)
对象.getClass() 已有对象,又来反射?画蛇添足吧
类型.class 需要导入该类的包

反射获取构造方法并使用

格式 效能
public Constructor[] getConstructors() 所有 public 构造方法
public Constructor[] getDeclaredConstructors() 所有的构造方法
public Constructor getConstructor(Class... parameterTypes) 单个的 public 构造方法
public Constructor[] getDeclaredConstructors(Class... parameterTypes) 单个的构造方法

(图例:有下划线的是批量操作,无下划线+倾斜的是单个操作。)带 declared 关键字的方法是不受封装影响的。当然不止是构造方法,如类方法、类属性都可适用的。

Constructor 类(管理构造函数的类)

Constructor 类的主要方法
格式 API 的解释
T newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的实例,并用指定的初始化参数初始化该实例

反射方法的其它使用:

1.通过反射越过泛型检查

泛型用在编译期间,编译过后泛型擦除。所以可以用反射来越过泛型检查的。

例子略,以后补充。

泛型(代码标准化)

先来引用一下词条:泛型程序设计程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。

对于Java来说,泛型是被参数化的类或接口,是对类型的约定。

在我看来,接口是类的统一规范,而泛型就是对象类型的统一规范。而泛型接口就是规范中的规范。

特点:

  • 经过编译器支持的泛型是降低了代码的冗余度/提升了效率(因为减少了类型转换的次数)
  • 通过检查添加元素的类型,提升了安全性
  • 提升了程序的健壮性和规范性

格式:写在类名/接口后面 <E> (E 代表要求统一的对象类型)

注意!由于泛型是参数化类型的规范,代表只有实际传参时/程序运行时JVM才能拿到其具体真实类型,所以影响它相关的实例化(但是可以通过转型间接完成实例化及通过容器),而且泛型类型不能是基本数据类型,不过可以是包装类。

private int maxSize;
private T[] items;     
private int top;

public StackT(int maxSize){
    this.maxSize = maxSize;
    this.items = (T[]) new Object[maxSize];
    this.top = -1;
}

(通过转型创建泛型数组)

如何通过反射拿到泛型的真实类型

实际上因为编译后就会擦除泛型,所以Java泛型我们很难通过 new 的方式来实例化对象(还有获取其真实类型)。不过通过反射的机制还是可以做到的,而Java获取 Class 实例的方式有 3 种:

格式 能否获取到泛型的真实类型 备注
Class.forName("完整类名带包名") 只要知道该类的全限定类名的路径即可
对象.getClass() × 没有对象,因为无法使用 new 来实例化泛型对象
类型.class × 获取不到真实类型,因为泛型编译后就会擦除,程序运行时就获取不到泛型的真实类型了

泛型接口

构造例子:

public interface Content<T> {
    T text();
}

泛型接口的两种实现类:(类头)

  • 实现接口的子类明确声明了泛型类型
  • 实现接口的子类继续不声明泛型类型

泛型方法

构造格式:

封装等级 [是否静态] <T> [返回类型] 方法名(参数列表:T obj或T... args) {

}

(在使用泛型方法时,通常不必写明泛型类型参数,因为编译器会自动推断出具体类型。即类型参数推断(type argument inferece)。类型参数推断只对赋值操作起效,其它操作比如参数传递时并不起效。假如将某个泛型方法的调用结果作为参数传递给另一个方法时,编译器并不会执行类型参数推断:编译器认为它是 <Object>

泛型的类型擦除*

Java程序运行大体上分为:编译阶段、运行阶段。

而对于泛型来说,当编译阶段过后就会被擦除;所以在运行阶段时泛型的真实信息已经丢失了。

所以泛型的生命周期仅仅在编译阶段)以下是类型擦除的工作内容:(准备运行阶段)

  1. 把泛型的所有类型参数都替换成 Object;若有指定类型边界,就用类型边界替换。
  2. 擦除出现的类型声明(即 <> 内容)
  3. 生成桥接方法以保留扩展泛型类型的多态性

类型擦除带来的问题

擦除的代价是显而易见的,这使得泛型不能用于显式地引用运行类型的操作,比如转型、instanceof 操作、new 表达式... 因为运行时关于类型的参数信息都丢失了。所以当你在写泛型代码时就必须时刻提醒自己,它们本质上都是 Object 类型(运行时)

new T();
//这样是行不通的,因为编译器无法确定 T 是否有默认构造函数(无参构造函数)

不过我们可以通过 Class 类及其方法(isInstance()、.class等等)来弥补类型擦除的问题,例子略。(工厂模式)

泛型数组(栈)

跟上面的工厂模式一样,使用 Class 类的方法把类信息存储起来,需要时再拿出来调用即可。

类型边界(更灵活的类型设置)

语法形式:

<类型参数 extends XXX>
或:
《T extands 类/接口1 & 接口2 & 接口3...》

(可见,如果设置多个类型边界:除第一个可以设置为类,后面只能是接口了)

通配符 ?(类型辅助限定)

比较
通配符 ? 泛型类型 T
简单区别 不能写到赋值语句中 可以写到赋值语句中
通常用法场景 传递参数 定义具体类型

上界通配符 <? extends 类型A>

即限定类型为:A及其子类

下界通配符 <? super 类型B>

即限定类型为:B及其父类

注意:上界通配符和下界通配符是不兼容的。我们知道泛型是不能向上转型的(因为需要运行绑定),但是我们可以通过通配符来间接完成向上转型。而通配符和泛型搭配使用!

扩展:泛型规范和建议

  1. 泛型类型的类型参数不能是值类型
  2. 不能创建类型参数的实例
  3. 不能说明类型为类型参数的静态成员
  4. 类型参数不能使用类型转换或 instanceof 关键字
  5. 不能创建类型参数的数组
  6. 不能创建 或 catch 或 throw 参数化类型对象
  7. 泛型相同不能作为方法重载的理由

泛型命名规范:

泛型名 描述
E Element(元素)
N Number(数字)
K Key(键)
V Value(值)
S、U、V、etc. 2nd、3rd、4th、types

使用泛型的建议

  • 消除类型检查告警
  • List 优先于数组
  • 优先考虑使用泛型来提高代码通用性
  • 优先考虑泛型方法来限定泛型的范围
  • 利用有限制通配符来提升 API 的灵活性
  • 优先考虑类型安全的异构容器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 高级语法学习笔记(基础) 的相关文章

  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • ExceptionConverter:java.io.IOException:文档没有页面。我正在使用 iText

    当我执行下面的代码时 File f new File c sample pdf PdfWriter getInstance document new FileOutputStream f document open System out p
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • linux,Centos7系统yum问题,显示已经安装wget,但实际不能使用

    yum更新时 root centos7 yum update Loaded plugins fastestmirror langpacks Repository epel is listed more than once in the co
  • Python读取Excel文件是常见的操作,其中pd

    Python读取Excel文件是常见的操作 其中pd read excel 是一个常用的函数 但有时候会出现ValueError Unknown engine openpyxl错误 这种情况通常是因为pandas库没有正确安装openpyx
  • java8 快速实现List转数组,JsonArray,map 、分组、过滤等操作

    1 分组 List里面的对象元素 以某个属性来分组 例如 以id分组 将id相同的放在一起 Map
  • 12个高效Python小技巧,建议收藏!

    代码写不出来 程序越看越烦 我是不是不适合学 Python 啊 这可能是很多初学编程同学的心声 首先大家要明确一点 编程不是一下就能学会的事情 当我们在学习编程的时候 其实可以做很多事情来让自己学习变得更加容易 更加高效 掌握以下12种快速
  • wx.getLocation(Object object)申请方法,最新版

    一个点击的视频 三张截图 重点 1 我们加了这个类目 截图 生活服务 gt 百货 超市 便利店 2 进页面走获取定位wx getLocation接口功能 截图 3 门店列表 截图 点击距离走 wx openLocation方法 An hig
  • MES系统成为工业4.0首选,制造业真正数字化车间你看过吗?

    在日益激烈的市场竞争中 MES管理系统已经成为企业提升生产效率 降低成本 提高竞争力的关键 通过MES管理系统实现数据集成和分析 能够对产品制造过程的各个环节进行可视化控制 从设计 制造 质量 物流等环节全面掌控信息 实现对产品全生命周期的
  • df -h 查看 Used+Avail != Size

    问题描述 在测试过程中发现 该机器的根目录空间 41G 5 7G 50G 即 Used Avail Size 问题原因 经过搜索 了解到这种情况可能是Linux系统默认的文件保留块导致的 Linux系统默认保留5 的容量作为应急使用 可能的
  • C++中用两个栈实现一个队列

    想要利用两个栈实现一个队列 首先我们需要搞清楚栈和队列的特性 栈是后进先出 是一个压栈的过程 而队列则是先进先出的一个过程 用两个栈去实现一个队列 该怎样做 首先假如我们有一组数据 7 5 9 2 然后我们需要一个栈 stack
  • 请谈谈你对大数据的理解

    一 请谈谈你对大数据的理解 物联网 移动互联网 云计算和大数据是新一代信息技术发展中的华彩乐章 物联网中的网络传感器采集了各种各样的数据 移动终端产生的各种日志记录 这些构成了海量数据 云计算为产生的海量数据提供了分布式存储和分布式并行计算
  • 日常干货“杨辉三角”和“统计用户输入正整数中每个数字重复的次数并打印”

    目录 前言 使用java实现杨辉三角的输出 统计用户输入正整数中每个数字重复的次数并打印 前言 这些天一直在家 憋坏了 写了一些java的题目 为3月份的比赛做准备 下面的无法理解可设断点一个一个测 或者来问问我随时欢迎 使用java实现杨
  • 基于JDK1.8 的LinkedList源码分析

    基于JDK1 8 的LinkedList源码分析 代码注释 JDK版本 jdk1 8 0 181 package java util import java util function Consumer Doubly linked list
  • 数据挖掘相关的10个问题

    NO 1 Data Mining 和统计分析有什么不同 硬要去区分Data Mining和Statistics的差异其实是没有太大意义的 一般将之定义为Data Mining技术的CART CHAID或模糊计算等等理论方法 也都是由统计学者
  • Windows部署多个Memcached和Redis服务

    Windows部署多个Memcached和Redis服务 引言 1 部署多个Memcached服务 1 1 准备工作 1 2 创建服务 1 3 删除服务 2 部署多个Redis服务 2 1 准备工作 2 2 创建服务 2 3 卸载服务 总结
  • Linux高性能服务器编程|阅读笔记:第8章 - 高性能服务器程序框架

    目录 简介 系列笔记 8 1 服务器模型 8 1 1 C S模型 8 1 2 P2P模型 8 2 服务器编程框架 8 3 I O模型 8 4 两种高效的事件处理模式 8 4 1 Reactor模式 8 4 2 Proactor模式 8 5
  • 对存储过程进行加密和解密(SQL 2008/SQL 2012)

    开始 在网络上 看到有SQL Server 2000和SQL Server 2005 的存储过程加密和解密的方法 后来分析了其中的代码 发现它们的原理都是一样的 后来自己根据实际的应用环境 编写了两个存储过程 一个加密存储过程 sp Enc
  • 方法

    方法 方法定义 调用 方法完整的定义形式 方法的其他定义形式 方法使用的常见问题 方法案例 方法调用的内存图 方法的参数传递机制 方法的参数传递案例 方法重载 单独使用return关键字 1 方法概述 1 1 方法的概念 方法 method
  • 解决elementUI中el-select组件的选中不显示问题

    el select组件选中不显示的原因好像只出现在多级联动中 并且选中是有值的 只是单纯的不回显 可以在el select中加入change事件 然后使用vue的set方法将值重新修改进去
  • react修改node_modules里的文件

    一 node modules里的文件可以使用patch package来修改 安装patch package yarn add patch package 修改package json 新增命令postinstall scripts pos
  • 超详细maven的卸载、重新安装与配置

    一 maven的卸载 maven在使用时只是配置了环境变量和本地仓库 我们只需要删除本地仓库 在环境变量中移除maven的环境变量 1 删除解压的maven文件夹 在之前的安装中 我将本地仓库和maven解压后的文件放在同一个文件夹下 此时
  • Java 高级语法学习笔记(基础)

    目录 反射机制 Class 类 类初始化 类加载 类的生命周期 七大阶段 1 加载 接入 class文件 2 验证 连接 linking 的第一阶段 为了安全 3 准备 分配内存及初步初始化 4 解析 字符翻译成引用阶段 5 初始化 代码正