精华内容
下载资源
问答
  • 一个空的class在C++编译器处理过后就不再为,编译器会自动地为我们声明一些member function,如果你  class A{};  编译器处理后,就相当于:  class A {  public:  A(); //默认构造函数 A...

    一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,如果你写 


    class A{}; 

    编译器处理后,就相当于: 

    class A

    public: 
    A();  //默认构造函数
    A(const A&);  //拷贝构造函数
    ~A();  //析构函数
    A& operator=(const A& rhs); 
    A* operator&();  //取地址运算符

    const A* operator&() const;
    }; 


    现在做如下说明:

    看完上面的例子后,大家可能会觉得声明一个空类,大家都认为会生成     构造函数、拷贝构造函数、析构函数、赋值运算符号、取址运算符const、取址运算符
    其实不然啊,那么一个空类什么时候不是空类了呢?   其实对于这样的一个空类来说,是完全没有必要的,而编译器也不是这样做的。编译器的做法是:只有你需要用到这些函数并且你又没有显示的声明这些函数的时候,编译器才会贴心的自动声明相应的函数。  
        
    class   A{};   
        
    对于单独申明的一个空类A来说,编译器编译过程中,并没有发现创建A实例。   
    所以对于空类A来说,编译器是不会给类A生成任何函数的。   
    如果我们在代码中需要生成一个A的实例   
    比如   
    A   a;   
    编译器就会根据上面的实例,给类A生成构造函数和析构函数。   
    当使用   
    A   b(b);   
    编译器就会生成类A的拷贝构造函数。   
    A   c;   
    c   =   a;   
    编译器生成赋值运算符函数   
    A   &d   =   a;   
    编译器生成取地址运算符函数。   
        
    经过我们的分析可以这样理解:对于一个没有实例化的空类,编译器是不会给它生成任何函数的,当实例化一个空类后,编译器会根据需要生成相应的函数。这条理论同样适合非空类(只声明变量,而不声明函数)。

    展开全文
  • 这种新手都不会范的错,居然被一个工作好几年的小伙子出来,差点被当场开除了。

    你知道的越多,你不知道的越多

    点赞再看,养成习惯

    本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。

    正文

    我先描述一下bug的现象哈:

    这两个输入框的值都是我从KV(Redis之类的存储中间件)里面获取到的,也是可以实时修改的,我自作聪明,想着KV里面如果没值,就默认取一个静态变量,这样有个兜底,在类加载的时候加载静态变量,我取的时候也效率高了。

    这就也为我后面的Bug埋下了伏笔,问题是这个Bug烦就烦在他在预发环境是好的,线上却是坏的。

    先看看代码怎么写的:

    可以看到代码里面,我是在静态代码块去KV取值,如果有值就用KV的做初始值,没取到我也有默认值,我当时还在想自己的构思真巧妙,用KV比DB效率高,用常量去做兜底,不至于没配置的情况没有值,报空指针啥的。

    当时一个劲给自己加油打气,一个劲的妙啊,不知道自己写了多蠢的代码。

    这样写看似没什么问题,但是我这个值是可以修改的这就有问题了,而且我有几个地方还是取的变量,不是一直取的KV。

    而且常量被我当变量用,也都违背了这玩意的初衷了。

    我上线后,三歪就说:敖丙出大问题了,为啥我刷新一下值就不对了,再刷新值就回来了。

    我惊恐万分,深知我写了BUG,我不着痕迹的擦去我鬓角的汗水,深呼吸了一下。

    回答道:我代码还没写好呢,你怎么乱点,我告诉过你不要乱点的,现在你点坏了吧。

    三歪好像真的以为他错了,委屈巴巴的啥也没说就默默离开了。

    这个时候我马上打开电脑,也顾不上歪歪的感受了,思绪转的飞快,开始在闹海中构建整个值传递的链路。

    我改了页面的值,之后我也改了这个静态变量和KV的值,但是我在线上发现我刷新页面一会是修改之后的,一会是修改之前的值.

    这就奇怪了呀,主要是在预发还不能复现,这就很坑爹了,难受呀歪歪。

    Tip:预发指的是,代码跟线上一样,数据库一样,环境配置不一样。

    我把代码看了一遍又一遍,还是没发现问题。

    在当天那个饱暖思淫欲的下午饭之后我,突然灵光一闪发现了问题的核心,预发是好的因为他是一台机器。

    而我们线上的机器是负载均衡的,有两台机器,我修改一次只改了一台机器的值,另外一台没修改到。

    那么问题就简单了,我们看下图:

    预发情况,是单机,不管我怎么读怎么修改,每次数据都是准确的(这里我还没意识到其实每次去取变量是不对的)。

    但是线上不一样,服务器启动的时候给每台机器赋值了,这样的情况如果只是读是没问题的(怪不得静态常量都是private的,能修改的话基本上都有这个问题)。

    但是如果修改,你修改的请求只是打到了一台机器上,如果下次负载均衡请求到了这个机器,那么你很幸运,结果是对的,但是往往负载均衡算法就是那么公平,雨露均沾这样的情况 1/2的请求,都会拿到错误的结果。

    而且这个地方的问题还有一个就是,应该是修改KV之后,修改变量,我有的地方取的是变量,因为我想每次反正都改了,取也没事。

    其实正确的做法是我每次去都读KV就好了,只有KV为空的时候才去读静态变量,作为一种兜底方案,不应该去改变常量的值。

    而且大家要知道,我修改KV成功万一修改常量的时候出错了呢?你取常量的值就不对了。

    所以查询,修改应该这样做:

    主要是想提醒大家,谨慎操作静态常量,能不变就不变,不要写这么骚的操作了,我这算少的很多 40、50台线上机器的服务,这种问题是真的难发现。

    我是万万没想到,我居然写出这种代码,下次再写出来,只能让歪歪不要乱点了,免得又点坏了哈哈。

    絮叨

    另外,敖丙把自己的面试文章整理成了一本电子书,共 1630页!目录如下

    现在免费送给大家,在我的公众号三太子敖丙回复 【888】 即可获取。

    我是敖丙,一个在互联网苟且偷生的程序员。

    你知道的越多,你不知道的越多人才们的 【三连】 就是丙丙创作的最大动力,我们下期见!

    注:如果本篇博客有任何错误和建议,欢迎人才们留言!


    文章持续更新,可以微信搜索「 三太子敖丙 」第一时间阅读,回复【资料】有我准备的一线大厂面试资料和简历模板,本文 GitHub https://github.com/JavaFamily 已经收录,有大厂面试完整考点,欢迎Star。

    展开全文
  • spark创建一个空的RDD

    千次阅读 2018-07-06 17:20:51
    现有需求要创建一个空的RDD不含任何元素和分区首先想到的是:val emptyRDD = sc.makeRDD(Array())可是这么创建居然会报错!!!然后想着自己继承RDD抽象,可以实现。不过这两天发现居然spark其实已经为我们写好...

    现有需求要创建一个空的RDD不含任何元素和分区
    首先想到的是:

    val emptyRDD = sc.makeRDD(Array())

    可是这么创建居然会报错!!!
    然后想着自己写个类继承RDD抽象类,可以实现。
    不过这两天发现居然spark其实已经为我们写好了EmptyRDD,源码如下

    package org.apache.spark.rdd
    
    import scala.reflect.ClassTag
    
    import org.apache.spark.{Partition, SparkContext, TaskContext}
    
    /**
     * An RDD that has no partitions and no elements.
     */
    private[spark] class EmptyRDD[T: ClassTag](sc: SparkContext) extends RDD[T](sc, Nil) {
    
      override def getPartitions: Array[Partition] = Array.empty
    
      override def compute(split: Partition, context: TaskContext): Iterator[T] = {
        throw new UnsupportedOperationException("empty RDD")
      }
    }
    

    我们可以使用SparkContext对象来创建

    val emptyRDD = new SparkContext(new SparkConf()).emptyRDD[T]

    展开全文
  • 自己PHP扩展之创建一个类

    万次阅读 2012-04-25 21:48:45
    声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方...我们创建一个类.然后在php里面去调用这个.生成扩展及修改 不知道的请点击这里 http://imsiren.com/archives/568这里就不谈了.比如我们要创建一个类..P

    声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
    欢迎转载,转载请注明出处 。
    本文地址:http://imsiren.com/archives/572

    上一章用扩展创建了一个变量..

    这次来个大的..我们创建一个类.
    然后在php里面去调用这个类.
    生成扩展及修改 不知道的请点击这里    http://imsiren.com/archives/568
    这里就不谈了.
    比如我们要创建一个类..PHP代码如下
    class Person {
        public $name;
        public $age;
        public function __construct() {
            echo "construct is running!
    ";
        }
        public function __destruct() {
            echo "
    destruct is running!";
        }
        public function getproperty($key) {
            echo $this->$key;
        }
        public function setproperty($key,$val) {
            $this->$key = $val;
        }
    }
    用PHP来做,很简单..
    那么用PHP扩展来写该怎么做?
    OK.

    1.在php_siren.h里面声明类


    PHP_METHOD(Person,__construct);
    PHP_METHOD(Person,__destruct);
    PHP_METHOD(Person,setproperty);
    PHP_METHOD(Person,getproperty);

    PHP_METHOD宏.
    PHP_METHOD 等于ZEND_METHOD
    这个宏接受两个参数,第一个是类名,第二个是类的方法

    #define ZEND_METHOD(classname, name)    ZEND_NAMED_FUNCTION(ZEND_MN(classname##_##name))
    #define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_v    alue_used TSRMLS_DC
    //最后等于
    void name(int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_v    alue_used TSRMLS_DC )

    这个宏是用来声明我们的方法...
    2.设置接收的参数
    我们的方法如果需要接受参数.那么就要执行 

    ZEND_BEGIN_ARG_INFO_EX(arg_person_info,0,0,2) 
            ZEND_ARG_INFO(0,name)
    ZEND_END_ARG_INFO()

    详细讲这几个宏之前先看看zend_arg_info

    typedef struct _zend_arg_info {
            const char *name; //参数名称
            zend_uint name_len;//长度
            const char *class_name;  //所属类名
            zend_uint class_name_len;  //类名长度
            zend_bool array_type_hint;
            zend_bool allow_null; //允许为空
            zend_bool pass_by_reference;  //引用传值
            zend_bool return_reference;   //引用返回
            int required_num_args;   //参数个数
    } zend_arg_info;

    ZEND_BEGIN_ARG_INFO_EX定义在Zend/zend_API.h 

    #define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args)       \
            static const zend_arg_info name[] = {                                                                                                                                           \
                    { NULL, 0, NULL, 0, 0, 0, pass_rest_by_reference, return_reference, required_num_args },

    很明显 声明一个zend_arg_info的数组name,然后初始化结构体的值
    ZEND_ARG_INFO(0,name)的定义如下

    #define ZEND_ARG_INFO(pass_by_ref, name)  { #name, sizeof(#name)-1, NULL, 0, 0, 0, pass_by_ref, 0, 0 },

    这三个宏 执行代码 等于

    static const zend_arg_info name[] = {                                                                                                                                                    { NULL, 0, NULL, 0, 0, 0, pass_rest_by_reference, return_reference, required_num_args },
    { #name, sizeof(#name)-1, NULL, 0, 0, 0, pass_by_ref, 0, 0 },
    };

    3.创建zend_function_entry结构数组

    const zend_function_entry person_functions[]={
            PHP_ME(Person,__construct,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
            PHP_ME(Person,__destruct,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_DTOR)
            PHP_ME(Person,getproperty,arg_person_info,ZEND_ACC_PUBLIC)
            PHP_ME(Person,setproperty,arg_person_info,ZEND_ACC_PUBLIC)
            PHP_FE_END
    };
    zend_function_entry定义如下

    typedef struct _zend_function_entry {
            const char *fname; //函数名称
            void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
            const struct _zend_arg_info *arg_info;//参数
            zend_uint num_args;//参数个数
            zend_uint flags;//标示PUBLIC ?PRIVATE ?PROTECTED
    } zend_function_entry;

    PHP_ME宏接收四个参数
    1 类名,
    2 方法名,
    3 zend_arg_info 的参数列表,


    ZEND_ACC_PUBLIC ZEND_ACC_PRIVATE ZEND_ACC_PROTECTED是我们类里面的三个访问权限
    ZEND_ACC_CTOR标示构造函数
    ZEND_ACC_DTOR标示析构函数

    4.修改PHP_MINIT_FUNCTION
    前面我们说过 PHP_MINIT_FUNCTION是在模块启动的时候执行的函数
    首先创建一个全局指针 zend_class_entry *person_ce;
    在PHP_MINIT_FUNCTION加入如下代码

    zend_class_entry person;
    INIT_CLASS_ENTRY(person,"Person",person_functions);
    person_ce=zend_register_internal_class_ex(&person,NULL,NULL TSRMLS_CC);
    zend_declare_property_null(person_ce,ZEND_STRL("name"),ZEND_ACC_PUBLIC TSRMLS_CC);

    1行创建一个zend_class_entry对象person.
    zend_class_entry这个结构体前面也讲过 PHP内核研究之类的实现 
    2行初始化zend_class_entry 它执行了如下代码

           {                                                                                                                       \
                    int _len = class_name_len;                                                              \
                    class_container.name = zend_strndup(class_name, _len);  \
                    class_container.name_length = _len;                                             \
                    class_container.builtin_functions = functions;                  \
                    class_container.constructor = NULL;                                             \
                    class_container.destructor = NULL;                                              \
                    class_container.clone = NULL;                                                   \
                    class_container.serialize = NULL;                                               \
                    class_container.unserialize = NULL;                                             \
                    class_container.create_object = NULL;                                   \
                    class_container.interface_gets_implemented = NULL;              \
                    class_container.get_static_method = NULL;                               \
                    class_container.__call = handle_fcall;                                  \
                    class_container.__callstatic = NULL;                                    \
                    class_container.__tostring = NULL;                                              \
                    class_container.__get = handle_propget;                                 \
                    class_container.__set = handle_propset;                                 \
                    class_container.__unset = handle_propunset;                             \
                    class_container.__isset = handle_propisset;                             \
                    class_container.serialize_func = NULL;                                  \
                    class_container.unserialize_func = NULL;                                \
                    class_container.serialize = NULL;                                               \
                    class_container.unserialize = NULL;                                             \
                    class_container.parent = NULL;                                                  \
                    class_container.num_interfaces = 0;                                             \
                    class_container.interfaces = NULL;                                              \
                    class_container.get_iterator = NULL;                                    \
                    class_container.iterator_funcs.funcs = NULL;                    \
                    class_container.module = NULL;                                                  \
            }

    可以对应  PHP内核研究之类的实现 来分析

    5.创建 php_siren.h头文件中的方法体

    PHP_METHOD(Person,__construct){
            php_printf("construct is running<br>");
    }
    PHP_METHOD(Person,__destruct){
            php_printf("destruct is running<br>");
    }
    PHP_METHOD(Person,setproperty){
    
    }
    PHP_METHOD(Person,getproperty){
    
    }

    6.最后make&& make install

    编译我们的扩展,
    重新启动apache.
    <?php
    $p=new Person();
    ?>
    我们就能在浏览器里看到输出的内容


    construct is running
    destruct is running


    这样 ..我们用扩展创建的一个基本类就完成了.

    展开全文
  • Java 判断一个对象中某一个属性是否为 每次博客都不知道咋开头…算了^_^ 直接说问题吧。就是验证一个对象中的一个属性的值是否为。 自己在网上也找到了很多大神给的答案,有看到利用反射机制 public ...
  • 4主要的map实现介绍

    万次阅读 多人点赞 2019-07-31 18:36:57
    、简单介绍 map是键值对的集合接口,它的实现主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map,HashMap的值是没有顺序的,他是按照...
  • 项目中遇到这样一个问题,当时是要写一个工具,里面有这样的一段话, MsgTools是工具,里面有一个属性applicationContext MsgTools.applicationContext .getBean...
  • 问题描述:想要建一个工具进行数据同步,其中要用到service层或dao层的数据查询接口,正常构建工具,用@Autowired注解导入service层。在项目测试时报指针异常,发现是service层接口注入失败。   解决方法:...
  • 2.1 定义一个汽车Vehicle, 2.1.1 属性包括:汽车品牌brand(String类型)、颜色color(String类型)和速度speed(double类型)。 2.1.2 至少提供一个有参的构造方法(要求品牌和颜色可以初始化为任意值,但速度的...
  • 用java写一个简单的画图板

    万次阅读 多人点赞 2018-11-10 00:19:54
    Hello,大家好,这是我的第二篇博客,的是如何创作一个画图板;因为我以前的代码都是用dev-C++的控制台程序,这次学习了JFrame等容器,就想个画图工具...首先我们要做一个可视化界面,用JFrame即可, ...
  • 【教她代码】使用Intellij创建第一个Springboot程序

    万次阅读 多人点赞 2016-05-20 19:24:53
    首先先介绍一下Springboot:Spring是Java开发中,十分著名的一个框架。但是该框架的使用必须结合大量的XML配置文件,这一点让开发人员痛苦无比。Springboot是Spring官方重新构造的一个框架,将Spring的配置简化了很...
  • c++一个简单的2048小游戏

    万次阅读 多人点赞 2016-08-12 21:27:25
    嗯,上周进行培训的时候老师布置了一个小作业,让写一个2048的小游戏。 于是就开始瞎捣鼓这玩意儿了,用C++的。其实也挺简单的。 但是我比较菜,不会做图形界面,只有黑框。。。 这个游戏需要实现的主要功能如下:...
  • 创建一个名为MainClass的,代码如下。目前不需要看懂,之后我会详细解释: 1、声明我这个是存放在net.csdn.mymod这个包下 3-7、导入包,不需要刻意去,输入代码时他会自动帮你补上 9、这是重点,它会告诉...
  • 前两天为了敏感词过滤,用了multimap数据结构来存敏感词,结果发现效率上面其实不是很理想。 后来简单测了一下,发现主要是multimap的find和count的效率是相当的低,(一直以为对于map来说,find和count的效率...
  • 一个空的class在C++编译器处理过后就不再为,编译器会自动地为我们声明一些member function,如果你  class Empty{};  就相当于:  class Empty  {  public:  Empty();  Empty(const Empty&);  ~...
  • Python中文件操作先后读输出为的问题解决方案 在Python中初次操作文件可能会尝试先读file.white()后file.read(),结果会发现明明已经写入数据,但读出内容依然为的问题。 如下例: file = open('./a.txt',...
  • java swing最简单实例(1) 一个空的JFrame

    万次阅读 2014-08-26 14:57:09
    我准备写一个系列的java图形化界面的教程。每个程序都尽量只维持运行所需的最简化程度的代码,好让大家都看懂。   使用java图形界面只需要jdk,eclipse即可。如果布局抽象能力不够强大,建议装jigloo先用它布局...
  • Junit测试无法注入Service、Controller,报指针异常 添加如下注解: @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) 如图
  • Springboot 被@Component注解的调用@Autowired注解的的元素报指针异常 解决: 加入@PostConstruct注解,在init()方法里完成初始化 @Autowired private AppProperty appProperty; private int initialCapacity...
  • 具体题目如下: 有四个线程1、2、3、4, 线程1的功能就是输出1,线程2的功能就是输出2, 以此类推............ 现在有四个文件A B C D, ...初始都为。现要让四个文件呈如下...以上就是我看到的一个多线程相关的面试题,
  • 写一个框架的详细步骤

    万次阅读 多人点赞 2016-05-31 10:44:15
    如果你打算框架,那么肯定心里已经有一个初步的定位,比如它是一个缓存框架、Web MVC框架、IOC框架、ORM/数据访问框架、RPC框架或是一个用于Web开发的全栈式框架。 是 否要重复造轮子?除非是练手项
  •  当我们使用一个对象来初始化另一个对象时,编译器将自动生成上述构造函数(称为复制构造函数,因为它创建对象的一个副本)。  现在我们来看看我们没有定义复制构造函数的情况下调用隐式复制构造函数将会出现...
  • 错equals方法引起的指针异常

    千次阅读 2009-01-16 08:56:00
    首发原文:http://www.laozizhu.com/view.jsp?articleId=60 情景上这样的:我有一个重写了equals方法的,该源码如下。然后用一程序将此类多次循环put到HashMap中去,但每次put到1500次左右时,就会出现...
  • 用C++写一个链表

    万次阅读 2016-03-14 15:14:09
    线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表有两种存储方式,一种是顺序存储结构,另一种是链式存储结构。 顺序存储结构就是两个相邻的...
  • 今天在看开源中国时看到别人一个demo很帅啊,是一个垂直方向展示的弹出菜单,链接地址为:IOS弹出式菜单KxMenu 同时文中也附上了github的地址,在此热泪感谢原作者,我们来试用一下。 因为学习了也有一段日子...
  • 众所周知,抽象出来一个BaseDao的好处是巨大的,可以减少很多后续的DAO的工程量,只需让其他的dao继承这个baseDAO即可,然额问题来了,这个baseDAO,我们要用到HibernateTemplate。 我们把HibernateTemplate注入后...
  • 字符串一种在程序中经常要使用到的数据结构,然而在C中却没有字符串...试想一下,如果我们要自己实现一个string,最简单的方式是什么?就是让每一个string的实例维护一个在内存中独立的字符数组,每个string对象
  • 写一个线程安全的单例模式

    千次阅读 2017-09-18 22:25:21
    在应用这个模式时,单例对象的必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置...
  • springboot 写一个用户登录注册的demo

    万次阅读 2018-07-21 12:45:52
    首先,在数据库中创建一个数据表,然后使用idea自动生成持久化, 点击file,选择项目结构,然后加入jpa到项目中 点击左下角的Persistence窗口,右键项目 选择之后看到 填写完之...
  • 深入理解Java加载器(ClassLoader)

    万次阅读 多人点赞 2017-06-26 09:34:08
    从图可以看出顶层的加载器是ClassLoader,它是一个抽象,其后所有的加载器都继承自ClassLoader(不包括启动加载器),这里我们主要介绍ClassLoader中几个比较重要的方法。 loadClass(String) 该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 552,454
精华内容 220,981
关键字:

当我们写了如下的一个空类