精华内容
下载资源
问答
  • null和""区别 问题一: null和""区别 String s=null; string.trim()就会抛出为空exception ...""代表声明了一个对象实例,这个对象实例值是一个长度为0空字符串。 NULL代表声明了一个空对象,对
    null和""的区别
    
    问题一:
    
    null和""的区别
    
    String s=null;
    
    string.trim()就会抛出为空的exception
    
    String s="";
    
    string.trim()就不会抛,为什么?
    
    答:
    
    NULL代表声明了一个空对象,根本就不是一个字符串。
    
    ""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。
    
    NULL代表声明了一个空对象,对空对象做任何操作都不行的,除了=和==
    
    ""是一个字符串了,只是这个字符串里面没有内容了
    
    String s=null;只是定义了一个句柄,也就是说你有了个引用,但是这个引用未指向任何内存空间
    
    String s="";这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它操作,而不用担心什么了
    
    你说数字0和没有是不是一种概念啊??道理一样的
    
    而且,null可以赋值给任何对象.""就不行了.
    
    这里""和NULL绝对是两个概念
    
    ""代表一个字符串存在,它的值就是“”
    
    NULL代表字符串根本没有实际的值,你并不知道它是什么。。。
    
    哦,我明白了,意思就是String string = null 跟String string;是一回事儿
    
    null是空对象 ""是空字符串
    
    String s=null;//null是未分配堆内存空间
    
    String a;//分配了一个内存空间,没存入任何对象
    
    String a="";//分配了一个内存空间,存了一个字符串对象
    
    问题二:
    
    String s;和String s=null;和String s="a";有什么区别?
    
    针对这三种情况,使用out.println(s);的时候,第一个会出现异常,第二个会输出null.第三个则会输出a.
    
    这是为什么呢?这三句声明语句,各自作了什么呢?
    
    答:
    
    第一个只是定义了一个String类型变量s,并没有给它赋初值,在Java中,默认在使用一个变量的时候必须赋予它初值(降低风险)。
    
    第二个和第三个都定义了String类型变量s,并赋予它初值,只不过第二个赋予的值为null(空)罢了
    
    主要要理解的是String s; s为一个引用~~它不是对象
    
    第一个是没有初始化的引用;
    
    第二个为空引用;
    
    第三个是在字符串池里写入一个字符'a',然后用s指向它。
    
    另外,
    
    String s="a"和String s=new String("a");是有本质上的区别的
    
    前者是在字符串池里写入一个字符'a',然后用s指向它;
    
    后者是在堆上创建一个内容为"a"的字符串对象。
    
    String str="aaa"; //于栈上分配内存
    
    String str=new String("aaa"); //于堆上分配内存
    
    String s; 系统会自动赋值null
    
    String s;只是给s分配一个内存空间
    
    String s=null;是分配的空间中存储的值为空值
    
    String s="a";这句就不用我多说了分配的空间的值为字符a
    
    问题三:
    
    声明了一个string a;变量
    
    在以后的判断中,a==""和a==null有何不同?
    
    答:
    
    如果没有给a赋过值,a==""会导致异常。
    
    在实际处理时,往往认为""和null代表相同的含义,即都代表无值。
    
    此时建议用如下语法:
    
    if(a==null || a=="")
    
    {
    
    }
    
    如果a为null,就不会执行后面的判断,直接返回true。
    
    null是用来判断引用类型是否分配了存储空间
    
    ""是针对字符串的;
    
    string类型实际上是字符串指针,也即是一个引用类型
    
    所以如果没有给a赋过值,a==""会导致异常
    
    所以if(a==null || a==""){}这种写法也是正确的
    
    问题四:
    
    String abc=null;String abc="";String abc;三种写法有什么区别?
    
    答:
    
    1:创建一个空字符串对象,
    
    2:创建一个字符串为空的字符串对象。
    
    3:声明一个字符串对象,但并没有分配内存,而1,2已经分配了内存
    
    对于最后一种表示,你不能if(abc==null),或者int length = abc.length();编译的时候会提示可能没有初始化.
    
    String abc=null;
    
    String abc="";
    
    一般推荐使用第二种
    
    第一种abc指向null,很多时候要判断字符串是否为空时,容易漏掉这种情况,在调用String的相关方法的时候就会出错
    
    第二种则相对简单,String的方法都可以用,判断的时候也不会出错
    
    1) String abc=null;
    
    2) String abc;
    
    3)String a="";
    
    4) String b="";
    
    5) String c=new String("");
    
    6) String d=new String("");
    
    //1)等于2),和C语言不同,JAVA为安全原因不允许一个悬挂引用,没有赋值的引用地址一律自动赋值为NULL,以防止访问到任意内存
    
    //3)和4)中,变量a和b将会指向同一内存地址(""的地址)
    
    //5)和6)中,变量c和d不会指向同一地址,而是两个""内容的地址,并且和a,b不同,实际上,3)和4)相当于new String("").intern().
    
    //String类维护着一个字符串池,对于像3)和4)这样的赋值方法,String会在这个池中查找字符串是否已经在池中,如果在,就直接指向该地址,
    
    如果不在,生成一个实例放入池中再指向那个地址,可见对于同样内容的字符串多次引用时3)4)的方法要比5)6)的方法剩内存,之所以这样做,是
    
    因为String是一个内容不可变的量,运用的是设计模式GOF.FlyWeight
    
    但有个关键的一点,没有人说到,这就是:
    
    String s;在什么情况下可以等同于String s=null;而在什么情况下又不等同?!
    
    考虑下面的代码:
    
    //StringTest.java
    
    public class StringTest {
    
    static String s; //*
    
    public static void main(String[] args) {
    
    //String s; //**
    
    System.out.println(s);
    
    }
    
    }
    
    编译并运行上面的代码,将打印null。
    
    可见标有*号的行是自动初始化了的(s被自动初始化为null)。
    
    而如果把标有**号的行取消注释,代码将不能通过编译,这是因为这行定义的是本地变量,而本地变量是不会自动初始化的。
    
    由此得出结论:
    
    在成员变量的定义中,String s;等同于String s=null;
    
    而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值。
    
    这些虽然是小知识点,但在实际应用中很重要,也很容易被一些人忽视,特此提出。
    
    还有一点要说明的是:
    
    只要是在方法在中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器回自动赋初值。
    展开全文
  • 由于在这个过程中赋值操作会产生相同对象的多个引用,因此我们需要意识到“可变对象”在这里可能存在的问题:在原处修改可变对象是可能会影响程序中其他引用该对象的变量。如果你想看到这种情景,则你需要明确的...

    我从“可变对象的原处修改”这里引入,这是一个值得注意的问题。

    上一小节我们谈到,赋值操作总是存储对象的引用,而不是这些对象的拷贝。由于在这个过程中赋值操作会产生相同对象的多个引用,因此我们需要意识到“可变对象”在这里可能存在的问题:在原处修改可变对象是可能会影响程序中其他引用该对象的变量。如果你不想看到这种情景,则你需要明确的拷贝一个对象,而不是简单赋值。

    X = [1,2,3,4,5]

    L = ['a', X, 'b']

    D = {'x':X, 'y':2}

    print(L)

    print(D)

    ['a', [1, 2, 3, 4, 5], 'b']

    {'y': 2, 'x': [1, 2, 3, 4, 5]}

    在这个例子中,我们可以看到列表[1,2,3,4,5]有三个引用,被变量X引用、被列表L内部元素引用、被字典D内部元素引用,那么利用这三个引用中的任意一个去修改列表[1,2,3,4,5],也会同时改变另外两个引用的对象,例如我利用L来改变[1,2,3,4,5]的第二个元素,运行的结果就非常明显。

    X = [1,2,3,4,5]

    L = ['a', X, 'b']

    D = {'x':X, 'y':2}

    L[1][2] = 'changed'

    print(X)

    print(L)

    print(D)

    [1, 2, 'changed', 4, 5]

    ['a', [1, 2, 'changed', 4, 5], 'b']

    {'x': [1, 2, 'changed', 4, 5], 'y': 2}

    引用是其他语言中指针的更高层的模拟。他可以帮助你在程序范围内任何地方传递大型对象而不必在途中产生拷贝。

    可是如果我不想共享对象引用,而是想实实在在获取对象的一份独立的复制,该怎么办呢?

    能想到这一层确实很不错,其实这个很简单,常用的手法有以下几种:

    第一种方法:分片表达式能返回一个新的对象拷贝,没有限制条件的分片表达式能够完全复制列表

    L = [1,2,3,4,5]

    C = L[1:3]

    C[0] = 8

    print(C)

    print(L)

    [8, 3]

    [1, 2, 3, 4, 5]

    L = [1,2,3,4,5]

    C = L[:]

    C[0] = 8

    print(C)

    print(L)

    [8, 2, 3, 4, 5]

    [1, 2, 3, 4, 5]

    可以看出,用分片表达式得到了新的列表拷贝C,对这个列表进行修改,不会改变原始列表L的值。

    第二种方法:字典的copy方法也能够实现字典的完全复制:

    D = {'a':1, 'b':2}

    B = D.copy()

    B['a'] = 888

    print(B)

    print(D)

    {'a': 888, 'b': 2}

    {'a': 1, 'b': 2}

    第三种:内置函数list可以生成拷贝

    L = [1,2,3,4]

    C = list(L)

    C[0] = 888

    print(C)

    print(L)

    [888, 2, 3, 4]

    [1, 2, 3, 4]

    最后我们看一个复杂一些的例子

    B通过无限制条件的分片操作得到了A列表的拷贝,B对列表内元素本身的修改,不会影响到A,例如修改数值,例如把引用换成别的列表引用:

    L = [1,2,3,4]

    A = [1,2,3,L]

    B = A[:]

    B[1] = 333

    B[3] = ['888','999']

    print(B)

    print(A)

    print(L)

    [1, 333, 3, ['888', '999']]

    [1, 2, 3, [1, 2, 3, 4]]

    [1, 2, 3, 4]

    但是如果是这种场景呢?

    L = [1,2,3,4]

    A = [1,2,3,L]

    B = A[:]

    B[1] = 333

    B[3][1] = ['changed']

    print(B)

    print(A)

    print(L)

    [1, 333, 3, [1, ['changed'], 3, 4]]

    [1, 2, 3, [1, ['changed'], 3, 4]]

    [1, ['changed'], 3, 4]

    因为B的最后一个元素也是列表L的引用(可以看做获取了L的地址),因此通过这个引用对所含列表对象元素进行进一步的修改,也会影响到A,以及L本身

    所以说,无限制条件分片以及字典的copy方法只能进行顶层的赋值。就是在最顶层,如果是数值对象就复制数值,如果是对象引用就直接复制引用,所以仍然存在下一级潜藏的共享引用现象。

    如果想实现自顶向下,深层次的将每一个层次的引用都做完整独立的复制,那么就要使用copy模块的deepcopy方法。

    import copy

    L = [1,2,3,4]

    A = [1,2,3,L]

    B = copy.deepcopy(A)

    B[3][1] = ['changed']

    print(B)

    print(A)

    print(L)

    [1, 2, 3, [1, ['changed'], 3, 4]]

    [1, 2, 3, [1, 2, 3, 4]]

    [1, 2, 3, 4]

    这样,就实现了递归的遍历对象来复制他所有的组成成分,实现了完完全全的拷贝,彼此之间再无瓜葛。

    没想到简单的赋值还有这么多的坑!最后再来总结总结:普通的=赋值得到的其实仅仅是共享引用;无限条件的分片、字典copy方法和内置函数list这三种方法可以进行顶层对象的拷贝,而deepcopy可以彻底的实现自顶向下的完全拷贝。

    关于数据科学更系统、更深入的探讨可进入我们的专栏《Python数据科学之路》:酱油哥:来吧,一起踏上Python数据科学之路​zhuanlan.zhihu.com

    本专栏模仿美剧剧集编排分为五季,第一季:Python编程语言核心基础、第二季:Python数据分析基本工具、第三季:Python语言描述的数学基础、第四季:机器学习典型算法专题、第五季:实战热点深度应用。

    展开全文
  • 什么是注册器模式?注册器模式是一种基础常见设计模式,它主要意思是把多个类实例注册到一个注册器类中去,然后需要哪个类,由这个注册器类... //保存映射到注册器上的对象 protected static $object; //将...

    什么是注册器模式?

    1. 注册器模式是一种基础常见的设计模式,它的主要意思是把多个类的实例注册到一个注册器类中去,然后需要哪个类,由这个注册器类统一调取。

    下面实现一个简单的注册器类

    <?php
        //注册器模式
        class Register
        {
            //保存映射到注册器上的对象
            protected static $object;
            //将对象映射到注册器上
            public static function set($alias, $obj){
                self::$object[$alias] = $obj;
            }
            //从注册器上获取对象
            public static function get($name){
                if(!isset(self::$object[$name])){
                    return false;
                }
                return self::$object[$name];
            }
            //从注册器上删除对象
            public static function _unset($name){
                unset(self::$object[$name]);
            }
        }

    利用工厂模式配合注册器来使用

    <?php
    //创建一个工厂类
    class Factory
    {
        public static function getDb()
        {
            //实例化使用的类
            $db = new Database();
            //添加到注册器
            Register::set('Db',$db);
            return $db;
        }
    }

    如何通过工厂模式加注册器模式调用

    <?php
    //通过注册器模式来获取Db对象
    Register::get('Db');

    以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

    PHP进阶架构师>>>视频、面试文档免费获取docs.qq.com
    e3800ae5ebe5600e75b77ade4d6cbd6b.png

    或 者关注咱们下面的知乎专栏

    PHP大神进阶zhuanlan.zhihu.com
    277f18d224447cea50532aa3266159b9.png
    展开全文
  • 标题的意思是,对象之所以单独成为一个概念,而不是只是系统内部实现细节,那是因为很多人需要调用它。 因此,对象的存在是因为被需要,如果没有人调用它,他就可以作为实现细节,从外观上消失。 比如一个超市...

     

    标题的意思是,对象之所以单独成为一个概念,而不是只是系统内部的实现细节,那是因为很多人需要调用它。

    因此,对象的存在是因为被需要,如果没有人调用它,他就可以作为实现细节,从外观上消失。

     

    比如一个超市的管理系统,为什么要有商品,为什么要有收银员,是因为老板需要经常查看这些信息,所以他成为一个独立的概念,是有意义的。

     

    现实需求中,有很多实体对象,如果要一花一木都描述出来,那么就非常辛苦。有些人害怕自己不够面向对象,就迷恋不断的创建概念对象出来,这样会很累。如果你觉得自己很懒,觉得没必要对外开放一个独立的概念,就可以作为一个实现细节。虽然只有一个对象,而没有对象联系的系统是不可思议的,但是从理论角度,这也是面向对象,没必要说一定要很多对象,复杂的交互才是面向对象。

     

    对于一个系统来说,设计复杂的对象关系是一件很辛苦的事情,有时候比实现细节还要麻烦,细节大不了你不爽了就改一改,这个在原型开发的时候也是很容易的,但是对象关系,如果不仔细调整,他成为外部概念后,就对整个系统,乃至将来的设计产生深远的影响,要知道一个错误的设计,比一个没有设计更加烦人。

     

    对于原型开发来说,我认为除非你已经很了解业务,否则还是尽量先做好业务的算法,把整个系统了解一下,再来慢慢思考怎样的设计布局更加合理,更具扩展性。设计中的对象,并不一定等价于现实中的对象,现实中的对象你是按照重要性来排序的,而程序中的对象,你是按照他对其他对象的依赖性质来排序的,和系统其他对象越紧密的对象,越重要。现实生活中老板是你第一个要服侍好的对象,但是程序中可能就是收银机,因为顾客,收银员,商品都和他勾搭上了。我的意思是,生活中很重要的一些对象,在程序中也许只是一个字段就能表示的简单概念。

     

    一些简单的想法,泛泛而谈。请大家有空留言一下。

    转载于:https://www.cnblogs.com/Nobel/archive/2011/05/14/2046529.html

    展开全文
  • 栀子花花语是什么意思 栀子花又名栀子、黄栀子,为龙胆目、茜草科、栀子属常绿灌木,喜欢温暖湿润和阳光充足环境,那你知道栀子花花语吗?下面由小编给大家带来栀子花花语是什么意思,希望各位客官喜欢!...
  • 作者:zhantong来源:www.polarxiong.com/前言许多Java开发者都曾听说过“使用的...鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的意义,供君参考。本...
  • 写这个标题,有人看到了肯定立即会骂道:“不懂就不要乱发帖,居然敢说SEO不存在”。 呵呵,这样人真太糊涂! SEO全称是Search Engine Optimization,中文意思是搜索引擎优化。大部分站长获得SEO方面...
  • python中yield什么意思?可迭代对象mylist 是一个可迭代的对象。当你使用一个列表生成式来建立一个列表时候,就建立了一个可迭代的对象:>>> mylist = [x*x for x in range(3)]>>> for i in ...
  • 最近对OO的理解又有了一些新的认识,拿出来和大家分享一下。为了能让大家简单直观清晰的知道我想表达的主要意思,我不说废话了。...我所理解的真正的对象就是现实生活中客观存在或不存在的真正的对象。这...
  • 在JAVA里就是创建一个新的实例,或者说一个新的对象,一个普通类在没有实例化之前,就是new之前,它的属性,方法等等在内存中都是不存在的。只有使用new了以后,这个类的一些东西在内存中才会真的存在,也就是说只有new了...
  • 字典键字典中值没有任何限制, 可以是任意Python对象,即从标准对象到用户自定义对象皆可,但是字典中键是有类型限制。(1)允许一个键对应多个...Python并会因字典中存在冲突而产生一个错误,它不会...
  • 今天编码过程中遇到这个问题,在网上也查了一些所说方式方法,但我能使用,为什么这里面就表述了 说重点吧。 我这个是这么理解,出现这个问题应该是 ObjectContext 中被 attach 了几个相同的对象进去了。 ...
  • 到十九世纪中叶,出现一个哲学家叫孔德,他第一次把社会作为一个实体实证对象来处理,社会学“Sociology”这个词出现,孔德这个人在哲学其他方面贡献多,甚至有一些很荒唐主张,想搞一个新宗教之类被马克思大加...
  • sql 中exists代表什么意思

    千次阅读 2018-08-02 15:28:09
    Exists 方法 描述如果在 Dictionary 对象中指定关键字存在,返回 True,若不存在,返回 False。 举个例子吧: select * from a where exists(select * from b where a.id = b.id); a表和b表使用id关联,这条语句...
  • 由于对象和关系数据库中数据表示方式之间存在范式匹配,因此开发成本明显更高。是什么?Hibernate是针对Java环境的对象/关系映射(ORM)解决方案。术语“对象/关系映射”是指在对象模型表示与关系数据模型表示之间...
  • 最近对OO的理解又有了一些新的认识,拿出来和大家分享一下。为了能让大家简单直观清晰的知道我想表达的主要意思,我不说废话了。直接提出问题,然后回答。...所理解的真正的对象就是现实生活中客观存在或不存在的真...
  • 类变量:static关键字修饰变量,为什么叫类变量,意思就是他是属于这个类,可以用类名.变量名这样用,而不是这个类的对象的变量,当让这个类的对象也是可以调用,类变量是用类名.变量名直接用,而无须实例化...
  • 我们通常将之称为 Hibernate 一级缓存,当想使用 session 从数据库中查询出一个对象时,Session 也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询结果保存在自己内部。...
  • 看到Python中有个函数名比较奇特,__init__我知道加下划线的函数会自动运行,但是知道它存在的具体意义..Python中所有的类成员(包括数据成员)都是 公共的 ,所有的方法都是 有效的 。只有一个例外:如果你使用的数据...
  • 当类字节码文件被加载到内存时,类实例方法不会被...也就是说,方法入口地址被所有的对象共享,当所有的对象不存在时,方法入口地址才被取消。对于类中类方法,在该类被加载到内存时,就分配了相应...
  • 首先我们先来看一个基本的例子Python当中创建一个整形或者其他什么类型的对象的时候,都可以理解为创建了一个指针指向一个已经存在的对象, 就像这个例子:是不是可以理解为a指向了5这个对象我们再看一个例子这个...
  • 如果使用一个强引用话,只要该引用存在,那么被引用的对象能被回收。弱引用则没有这个问题。在垃圾回收器运行时候,如果一个对象的所有引用都是弱引用话,该对象会被回收。弱引用案例深度解析理想情况...
  • C#中未将对象引用设置到对象的实例

    千次阅读 2019-03-19 18:38:58
    C#中未将对象引用设置到对象的实例是什么意思? 意思是你使用这对象之前没有将之实例化 可能出现原因 一 1.ViewState对象为Null 2.Dateset空 3.sql语句或Datebase原因导致DataReader空 4.声明字符串变量是未赋...
  • 对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣​​redis缓存穿透​理解重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个不存在的key,在数据库查询为null。每次请求落在...
  • 在JAVA里就是创建一个新e69da5e6ba9062616964757a686964616f31333431373233的实例,或者说一个新的对象,一个普通类在没有实例化之前,就是new之前,它的属性,方法等等在内存中都是不存在的。只有使用new了以后,这个类的...
  • 内置对象什么意思? 就是指javascript本身就已经存在的对象,已经实例化好了的对象,不必再显式的去实例化它,直接就可以使用的。 javasctipt的内置对象有哪些?1. global全局对象。 *这个对象比较特殊,它并...
  • ECMA-262对内置对象的定义是:有ECMAScript实现提供依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。意思就是开发人员不必显式实例化内置对象因为它们已经实例化了。像Object、Array、...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 363
精华内容 145
关键字:

对象不存在的什么意思