首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【精选】面试官:聊下常见设计模式有哪些?

1.常见设计模式 单例模式解决是如何在整个项目中创建唯一对象实例问题,避免重复创建(实例化) 对象,已经有现成实例就用现成。...工厂模式解决是如何不通过 new建立实例对象方法,您可以使用工厂创建对象,而不直接使用 new。这样, 果您想要更改所创建对象类型,只需更改该工厂即可。使用该工厂所有代码会自动 更改。...实现单例模式要点: 三私一公:私有化静态属性私有化构造方法,私有化克隆方法,公有化静态方法。 <?php //(1)....需要一个保存唯一实例静态成员变量: private static $instance; //私有化静态属性 //(2)....构造函数和克隆函数必须声明为私有的,防止外部程序new从而失去单例模式 意义: private function __construct() //私有化构造方法 { $this->_db =

1.1K20

OC-基础总结(二)

引用计数器作用: 用来记录当前这个对象有多少个人在使用它,默认情况下,创建1个对象出来,这个对象引用计数器默认值是1。 2)....自动生成私有属性。 2). 自动生成这个属性getter setter方法声明。 3). 自动生成这个属性getter setter方法实现。 @property参数 1)....解决方案: 其中一边不要使用#import引入对方头文件,而是使用@class 名;来标注这是1个,这样就可以在不引入对方头文件情况下,告诉编译器这是1个。...在分类方法实现中不可以直接访问本类私有属性(定义在本类@implementation之中),但是可以调用本类getter setter来访问属性。...分类中可以存在和本类同名方法 当分类中有和本类中同名方法时候,优先调用分类方法,哪怕没有引入分类头文件。 如果多个分类中有相同方法,优先调用最后编译分类。

922100
您找到你想要的搜索结果了吗?
是的
没有找到

深入理解Java Runtime Area Java运行时数据区Java Runtime Area分类从线程角度理解Java Runtime Area从存储内容理解Java Runtime Are

image.png 程序计数器 Java虚拟机栈 本地方法栈都是线程私有的 而 Java堆****方法区****运行时常量池都是所有线程共享 进一步理解: 对于线程私有的数据区域程序计数器 Java...其实,方法区中除了包括你所说“已加载基本信息、常量、静态变量等”外,还包括编译器编译后代码,而且这应该是方法区中主要一部分,毕竟中主要是方法和属性,而属性,如果是实例域的话则新建对象后存储在堆...但其实是存储在堆中,因为这是属于对象信息,每个对象都拥有不同实例变量,这些实例变量都存储在堆中,不管是基本数据类型还是引用数据类型 ava虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用时候都会创建一个栈帧用于存储局部变量表...因为它不是静态变量,不会独立于实例而存在,而该类实例化之后,放在堆中,当然也包含了它属性i。 如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。...这两个对象都是线程私有(安全)。 比如定义了int[] is = new int[10].

41510

Java中高级面试题部分答案解析(2)

文章来源:Java知音公众号 这里是一些题型解析,还是这些话:不一定全部正确,有一些是没有固定答案,如果发现有错或者更适合答案欢迎留言矫正。...JVM内存结构 根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。...4、程序计数器: 线程私有;是当前线程所执行字节码行号指示器,每条线程都要有一个独立程序计数器,这类内存也称为“线程私有内存。...java多态表现在哪里 主要有两种表现形式:重载和重写 重载: 是发生在同一中,具有相同方法名,主要是看参数个数,类型,顺序不同实现方法重载,返回值类型可以不同。...重写: 是发生在两个中(父和子类),具有相同方法名,主要看方法中参数,个数,类型必须相同,返回值类型必须相同

53010

绝了!华为技术专家居然把JVM内存模型讲解这么细致!

每个线程在创建后,都会产生自己程序计数器和栈帧,程序计数器用来存放执行指令偏移量和行号指示器等,线程执行或恢复都要依赖程序计数器程序计数器在各个线程之间互不影响,此区域也不会发生内存溢出异常。...作用 程序计数器(后文简称为 PCR)有两个作用: 字节码解释器通过改变PCR依次读取指令,实现代码流程控制,:顺序执行、选择、循环、异常处理 多线程情况下,PCR用于记录当前线程执行位置,从而当线程被切换回来时候能够知道该线程上次运行到哪了...特点 一块较小内存空间,【线程私有】。每条线程都有一个独立程序计数器。 唯一一个不会出现OOM内存区域。 2. Java虚拟机栈(JVM Stack) 2.1. 定义 。...:Stringintern()方法就能在运行期间向常量池中添加字符串常量。 当运行时常量池中某些常量没有被对象引用,同时也没有被变量引用,那么就需要垃圾收集器回收。...综上看来 程序计数器、Java虚拟机栈、本地方法栈是线程私有的,即每个线程都拥有各自程序计数器、Java虚拟机栈、本地方法区。并且他们生命周期和所属线程一样。

64041

Java基础面试题 - 总结

int放不下时会进行截取,一旦截取HashCode正确性就无法保证了,所以这点可以推断出HashCode存在不相同字符拥有相同HashCode。...所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法情况下,他们之间比较还是内存中存放位置地址值,跟双等号(==)结果相同;如果被复写,按照复写要求来。...接口中没有 this 指针,没有构造函数,不能拥有实例字段(实例变量)或实例方法。 抽象不能在Java 8 lambda 表达式中使用。...JDBC中,利用反射动态加载了数据库驱动程序。 Web服务器中利用反射调用了Sevlet服务方法。 Eclispe等开发工具利用反射动态刨析对象类型与结构,动态提示对象属性和方法。...很多框架都用到反射机制,注入属性,调用方法,Spring。 如何使用Java反射?

62600

JVM专题

线程共享: 堆 方法区 直接内存(非运行时数据区一部分) 线程私有的: 程序计数器 虚拟机栈 本地方法栈 堆 堆区是java虚拟机所管理内存中最大一块,Java堆是所有线程共享一块内存区域,在虚拟机启动时创建...程序计数器 程序计数器是一块较小内存空间可以看作当前线程所执行字节码行号指示器。...其主要功能概括为如下: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码流程控制,顺序执行、选择、循环、异常处理。...在多线程情况下程序计数器用于记录当前线程执行位置,从而当线程被切换回来时候知道该线程上次运行到哪里。...Java虚拟机栈 同程序计数器,Java虚拟机栈也是线程私有的,它生命周期和线程相同,描述是Java方法执行内存模型,每次调用方法都是通过栈传递

25920

【JVM系列】1.Java虚拟机内存模型

一、前言 Java虚拟机,简称JVM(Java Virtual Machine),是Java语言中最为核心一个东西,Java程序运行离不开它,因为它存在,使得Java拥有“一次编译,多次运行...线程私有程序计数器、虚拟机栈、本地方法栈 线程共享:堆、方法区 二、程序计数器 程序计数器是一块很小内存空间,用于存放下一条运行指令,它是线程私有的,可以认作为当前线程行号指示器。...为此,每一个线程都必须用一个独立程序计数器,来记录下一条要运行指令。各个线程之间计数器互不影响,独立工作。...如果当线程正在执行一个Java方法,则程序计数器记录正在执行Java字节码地址,如果当前线程正在执行一个Native方法,则程序计数器为空。...主要保存信息是元数据,即类型信息、常量池、域信息、方法信息,static修饰变量加载时候就被加载到方法区中。

37730

Java虚拟机内存结构(JVM)

信息、常量、静态变量存放在方法区中 创建对象存放在堆中 堆中对象调用方法时会使用到虚拟机栈,本地方法栈,程序计数器 虚拟机栈对应是方法执行过程,本地方法栈是用来调用本地方法执行过程 线程下一条将要执行指令存放在程序计数器...单线程中是没有锁竞争。(锁和锁块内对象不会逃逸出线程就可以把这个同步块取消)。 虚拟机栈(Java stack) Java虚拟机栈属于线程私有的,生命周期和线程相同。...每一个操作数栈都会拥有一个明确栈深度用于存储数值,其所需最大深度在编译期就定义好了,保存在方法Code属性中,为maxstack值。...栈内存溢出(StackOverflowError)主要有以下几种情况: 栈帧过多,递归调用没有正确设置结束条件 栈帧过大,json数据转换,对象嵌套对象 (用户有部门类属性,部门类由用户类属性) 本地内存栈...程序计数器 程序计数器是线程私有,存放每个线程接下来要执行指令。 通过移位寄存器实现,程序计数器不会内存溢出。

46710

华为技术专家居然把JVM内存模型讲解这么细致「建议收藏」

每个线程在创建后,都会产生自己程序计数器和栈帧,程序计数器用来存放执行指令偏移量和行号指示器等,线程执行或恢复都要依赖程序计数器程序计数器在各个线程之间互不影响,此区域也不会发生内存溢出异常。...作用 程序计数器(后文简称为 PCR)有两个作用: 字节码解释器通过改变PCR依次读取指令,实现代码流程控制,:顺序执行、选择、循环、异常处理 多线程情况下,PCR用于记录当前线程执行位置,从而当线程被切换回来时候能够知道该线程上次运行到哪了...特点 一块较小内存空间,【线程私有】。每条线程都有一个独立程序计数器。 唯一一个不会出现OOM内存区域。 2. Java虚拟机栈(JVM Stack) 2.1....相对于类属性变量准备阶段和初始化阶段,局部变量没有准备阶段,必须显式初始化。 如果是非静态方法,则在index[0]位置上存储是方法所属对象实例引用,随后存储是参数和局部变量。...综上,程序计数器、Java虚拟机栈、本地方法栈是线程私有的,即每个线程都拥有各自程序计数器、Java虚拟机栈、本地方法区。并且他们生命周期和所属线程一样。

27310

Android 面试之必问Java基础

为了线程切换后能恢复到正确执行位置,每条线程都需要有一个独立程序计数器,各个线程之间计数器互不影响,独立存储,这类内存区域为【线程私有内存。...程序计数器具有如下特点: 是一块较小内存空间。 线程私有,每条线程都有自己程序计数器。 生命周期方面,随着线程创建而创建,随着线程结束而销毁。...其实就是为了保证同一个对象,保证在 equals 相同情况下 hashcode 值必定相同,如果重写了 equals 而未重写 hashcode 方法,可能就会出现两个没有关系对象 equals 相同...接口和抽象区别和相同点是什么 相同点: 接口是绝对抽象,不可以被实例化,抽象也不可以被实例化。 可以不实现抽象和接口声明所有方法,当然,在这种情况下也必须得声明成是抽象。...线程有一些基本属性id、name、以及priority。 id:线程 id 用于标识不同线程,编号可能被后续创建线程使用,编号是只读属性,不能修改。

73520

JVM--内存模型

,也渐渐明白了全栈工程师由来,技术路上没有尽头,只有不断学习 JVM内容偏向概念,不像代码执行就能够看到结果,总结起来也比较麻烦,有条件还是看下JVM相关书籍比较好,总结不到位地方也可以相互探讨...而JVM帮助我们从申请内存、释放内存繁琐工作中释放出来 二、线程共享与私有 JVM在运行程序时,分成两块数据区,共享数据区和私有数据区 1.共享数据区 试想以下我们Java代码中哪些代码是固定?...哪些代码是动态? 固定可以用文本来表示,比如名、属性、常量、方法名、代码执行顺序等。其实就是我们写代码 动态是文本无法表示变量进行一系列运算得到值。...实例化对象时,对象中有一个对象头,其中有个类型指针会指向方法区元信息,下面的图看看就好,不必深究 对象头组成.png 2.私有数据区 除了方法区和堆,其他都是私有数据区,前面已经提到了,私有数据区都是方法运行时数据...: 2.2程序计数器与本地方法栈 程序计数器程序计数器就是临时记录方法运行到哪一行了,程序运行实际并不存在并行,而是不同线程不断抢占cpu,然后执行一段时间,又重新开始竞争,只是执行时间太短,导致人根本感受不到

23720

基础篇-ObjectC继承、类别、属性

在 .h 中声明成员变量,又不想被子类调用,可以对这个成员变量进行限定: { @private NSMutableArray*modelArray; } @private 私有成员,只有当前可以访问...2)扩展属性,这个类别无法做到。 OC中子类可以拥有和父相同名称方法,在子类调用时,优先去自己内部寻找,如果没有则一层一层往上找; (4)OC语言是单继承语言。...在声明property属性后,有2种实现选择 @synthesize  作用是实现属性,getter,setter方法....如果只声明一个属性a,不使用@synthesize实现:编译器会使用_a作为属性成员变量(如果没有定义成员变量_a则会自动生成一个私有的成员变量_a;如果已经定义了成员变量_a则使用自定义成员变量_...(例如上面birthday):则此时编译器会使用a作为属性成员变量(如果定义了成员变量a,则使用自定义成员变量;如果此时没有定义则会自动生成一个私有的成员变量a,注意如果此时定义是_a则它跟生成a

1.7K10

JVM系列(一):Java虚拟机内存模型

一、前言 Java虚拟机,简称JVM(Java Virtual Machine),是Java语言中最为核心一个东西,Java程序运行离不开它,因为它存在,使得Java拥有“一次编译,多次运行”特点...线程私有程序计数器、虚拟机栈、本地方法栈 线程共享:堆、方法区 二、程序计数器 程序计数器是一块很小内存空间,用于存放下一条运行指令,它是线程私有的,可以认作为当前线程行号指示器。...为此,每一个线程都必须用一个独立程序计数器,来记录下一条要运行指令。各个线程之间计数器互不影响,独立工作。...如果当线程正在执行一个Java方法,则程序计数器记录正在执行Java字节码地址,如果当前线程正在执行一个Native方法,则程序计数器为空。...主要保存信息是元数据,即类型信息、常量池、域信息、方法信息,static修饰变量加载时候就被加载到方法区中。

90600

JVM内存模型1 程序计数器2. Java虚拟机栈(JVM Stack)3. 本地方法栈(Native Method Stack)4 Java堆(Java Heap)5 方法区6 直接内存(Direc

定义 程序计数器是一块较小内存空间,可看作当前线程正在执行字节码行号指示器 如果当前线程正在执行是 Java方法 计数器记录就是当前线程正在执行字节码指令地址 本地方法 那么程序计数器值为...作用 程序计数器有两个作用 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码流程控制,:顺序执行、选择、循环、异常处理。...在多线程情况下程序计数器用于记录当前线程执行位置,从而当线程被切换回来时候能够知道该线程上次运行到哪儿了。 1.3. 特点 一块较小内存空间 线程私有。...:Stringintern()方法就能在运行期间向常量池中添加字符串常量。 当运行时常量池中某些常量没有被对象引用,同时也没有被变量引用,那么就需要垃圾收集器回收。...综上看来 程序计数器、Java虚拟机栈、本地方法栈是线程私有的,即每个线程都拥有各自程序计数器、Java虚拟机栈、本地方法区。并且他们生命周期和所属线程一样。

1.2K90

10个用于C#.NET开发基本调试工具

dotPeek可以从任何程序集中创建符号服务区,即使没有符号或源代码也是如此。它像dnSpy一样,它或反编译代码并从中创建符号。...要了解有关使用或不使用OzCode调试LINQ更多信息,请查看我文章:如何在C#中调试LINQ查询。 3....它具有许多对调试有用功能,这里是其中一些: 查看加载模块 查看句柄 创建Dump 查看进程树 查看性能计数器 ?...以下是一些可以使用性能计数器衡量事情示例: CPU使用率 内存使用率 进程中引发异常数 I/O字节读写 对你asp.net应用程序请求数 在asp.net应用程序中请求响应时间 你可能会监视成千上万种不同计数器...例如,如果你想了解进程内存使用情况,则有以下计数器私有字节,虚拟字节,工作集,私有工作集,Gen X 集合,GC时间百分比,大对象堆大小 等等。

2.5K50

开心档之Swift 访问控制访问控制

: 超 子类 ---- 常量、变量、属性、下标访问权限 常量、变量、属性不能拥有比它们类型更高访问级别。...比如说,你定义一个public级别的属性,但是它类型是private级别的,这是编译器所不允许。 同样,下标也不能拥有比索引类型或返回类型更高访问级别。...以上程序执行输出结果为: 计数器: 100 新增加数量 100 计数器: 800 新增加数量 700 ---- 构造器和默认构造器访问权限 初始化 我们可以给自定义初始化方法申明访问级别,但是要不高于它所属访问级别...但必要构造器例外,它访问级别必须和所属访问级别相同。 如同函数或方法参数,初始化方法参数访问级别也不能低于初始化方法访问级别。...默认初始化方法 Swift为结构体、都提供了一个默认无参初始化方法,用于给它们所有属性提供赋值操作,但不会给出具体值。 默认初始化方法访问级别与所属类型访问级别相同

77410

JVM - 运行时数据区域(1)

JDK1.8 运行时数据区域 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享: 堆 方法区 直接内存 (非运行时数据区一部分) 程序计数器 程序计数器是一块较小内存空间,可以看作是当前线程所执行字节码行号指示器...另外,为了线程切换后能恢复到正确执行位置,每条线程都需要有一个独立程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有内存。...程序计数器主要有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码流程控制,:顺序执行、选择、循环、异常处理 多线程情况下程序计数器用于记录当前线程执行位置,从而当线程被切换回来时候能够知道该线程上次运行到哪...虚拟机栈 与程序计数器一样,Java 虚拟机栈也是线程私有的,它生命周期和线程相同,描述是 Java 方法执行内存模型,每次方法调用数据都是通过栈传递。...(实际上,Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。)

58640

开心档之Swift 访问控制

:超子类----常量、变量、属性、下标访问权限常量、变量、属性不能拥有比它们类型更高访问级别。...比如说,你定义一个public级别的属性,但是它类型是private级别的,这是编译器所不允许。同样,下标也不能拥有比索引类型或返回类型更高访问级别。...以上程序执行输出结果为:计数器: 100新增加数量 100计数器: 800新增加数量 700----构造器和默认构造器访问权限初始化我们可以给自定义初始化方法申明访问级别,但是要不高于它所属访问级别...默认初始化方法Swift为结构体、都提供了一个默认无参初始化方法,用于给它们所有属性提供赋值操作,但不会给出具体值。默认初始化方法访问级别与所属类型访问级别相同。...:res is: 20res is: 30res is: 50----扩展访问权限你可以在条件允许情况下、结构体、枚举进行扩展。

97520
领券