精华内容
下载资源
问答
  • 为什么String要设计成不可变的?
    万次阅读 多人点赞
    2013-11-18 20:30:03

    翻译人员: 铁锚

    翻译日期: 2013年11月18日

    原文链接: Why string is immutable in Java ?


    这是一个老生常谈的话题(This is an old yet still popular question). 在Java中将String设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑. 在下文中,我将为各种原因做一个小结。

    1. 字符串常量池的需要

    字符串常量池(String pool, String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。

    如下面的代码所示,将会在堆内存中只创建一个实际String对象.

    String s1 = "abcd";
    String s2 = "abcd";
    示意图如下所示:

    图1

    假若字符串对象允许改变,那么将会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象. 严格来说,这种常量池的思想,是一种优化手段.

    思考: 假若代码如下所示,s1和s2还会指向同一个实际的String对象吗?

    String s1= "ab" + "cd";
    String s2= "abc" + "d";
    也许这个问题违反新手的直觉, 但是考虑到现代编译器会进行常规的优化, 所以他们都会指向常量池中的同一个对象. 或者,你可以用 jd-gui 之类的工具查看一下编译后的class文件.

    2. 允许String对象缓存HashCode
    Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中。

    字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存.这也是一种性能优化手段,意味着不必每次都去计算新的哈希码. 在String类的定义中有如下代码:

    private int hash;//用来缓存HashCode
    3. 安全性
    String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。

    假如有如下的代码:

    boolean connect(string s){
        if (!isSecure(s)) { 
    throw new SecurityException(); 
    }
        // 如果在其他地方可以修改String,那么此处就会引起各种预料不到的问题/错误 
        causeProblem(s);
    }


    总体来说, String不可变的原因包括 设计考虑,效率优化问题,以及安全性这三大方面. 事实上,这也是Java面试中的许多 "为什么" 的答案。
    相关文章 :

    1. String对象不可改变的特性
    2. String is passed by “reference” in Java
    3. 十大常见Java String问题
    4. Java中Set的contains()方法

    更多相关内容
  • java使用ZipOutputStream时出现的“不可预料的压缩文件末端”问题1. 问题2. 过程3. 原因表象深究本质4. 结论 上面有目录,嫌麻烦的可以直接看结论 1. 问题   之前使用java自带的压缩工具,ZipOutputStream写了一...

    java使用ZipOutputStream时出现的“不可预料的压缩文件末端”问题

    上面有目录,嫌麻烦的可以直接看结论

    1. 问题

      之前使用java自带的压缩工具,ZipOutputStream写了一个压缩文件的方法。前几天整理代码的时候,更改了关流方式,同时整理了一下代码结构。当时没有注意重新测试这个方法,今天使用调用这个工具方法的接口时,发现生成的压缩文件不可读,出现 不可预料的压缩文件末端 的问题。
    压缩文件打开时出现的错误

      问题在于,这个压缩方法在许久之前是可以用的,于是我找出了git提交的历史记录。
    这是历史记录中的代码逻辑:

    	public static byte[] goZip(Map<String, byte[]> fileMap) throws IOException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ZipOutputStream zip = new ZipOutputStream(bos);
            try {
                for (Map.Entry<String, byte[]> file : fileMap.entrySet()) {
                    ZipEntry entry = new ZipEntry(file.getKey());
                    entry.setSize(file.getValue().length);
                    zip.putNextEntry(entry);
                    zip.write(file.getValue());
                }
            } finally {
                zip.closeEntry();
                zip.close();
            }
            return bos.toByteArray();
        }
    

    这是改动之后的代码逻辑:

        public static byte[] goZip(Map<String, byte[]> fileMap) throws IOException {
            try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
                 ZipOutputStream zip = new ZipOutputStream(bos)) {
                for (Map.Entry<String, byte[]> file : fileMap.entrySet()) {
                    ZipEntry entry = new ZipEntry(file.getKey());
                    entry.setSize(file.getValue().length);
                    zip.putNextEntry(entry);
                    zip.write(file.getValue());
                }
                zip.closeEntry();
                return bos.toByteArray();
            }
        }
    

      对比一下,改动的地方有两处,一是将两个流挪到了try()中改成了更优雅的写法,二是把return挪到了try块里面。

    2. 过程

    长话短说——

    1. 先把try()中new的两个流拿出来,放在try块前面初始化,改为在finally中关流 —— 结果没变;
    2. 又把 return bos.toByteArray(); 代码放到try块后面执行 —— OK;
    3. 再尝试重新把两个流放回到try()中初始化,省去finally关流步骤 —— 仍然OK;

    问题找到了——

    3. 原因

    表象

      就是ruturn的锅,return bos.toByteArray(); 的执行是在try块里还是在外面直接影响了压缩文件的完整性;

    深究

      代码中,bos.toByteArray();的作用就是最终,将整个一点一点写进缓冲流的压缩文件的字节码,转换成 byte[] 数组的形式。我们知道finally块中的代码,是在try块中的 return 之前执行,但要知道,return bos.toByteArray(); 虽然再同一行,但其实是在执行 bos.toByteArray(); 之后,把对应的值缓存起来,等finally块执行之后再return,相当于还是在关流之前执行了 bos.toByteArray();
      经测试,当选择一个文件内容压缩,压缩逻辑为:先关压缩流,然后将缓冲流的内容输出,此时得到的的结果是正常的压缩文件,压缩文件字节码长度是139
    正常的压缩文件长度
    当将压缩代码逻辑改为:先将缓冲流的内容输出,然后关压缩流,此时得到的的结果是异常的压缩文件,压缩文件字节码长度是66
    末端损坏的压缩文件长度
      可见,异常的压缩文件丢失了一段长度。
      还记得WinRAR软件报出的错误吗?“不可预料的压缩文件末端”,我们能猜测到,是结尾的某一部分丢失了。

    本质

      看一下 ZipOutputStream 相关的代码:

    1. 这是压缩输出流的构造方法,传入的是我们用于接收压缩文件内容的缓冲输出流
    	public ZipOutputStream(OutputStream out) {
            this(out, StandardCharsets.UTF_8);
        }
    
    1. 其中的 this 的构造方法就是这
        public ZipOutputStream(OutputStream out, Charset charset) {
            super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
            if (charset == null)
                throw new NullPointerException("charset is null");
            this.zc = ZipCoder.get(charset);
            usesDefaultDeflater = true;
        }
    
    1. 但是我们仍然不清楚最开始的入参的缓冲输出流去哪了,一直追溯到最终的地方,其实把入参赋给了它的超类成员变量 this.out
      ……
        public FilterOutputStream(OutputStream out) {
            this.out = out;
        }
    
    1. 我们再看一下 close(); 方法对我们的缓冲输出流做了什么
        public void close() throws IOException {
            if (!closed) {
                super.close();
                closed = true;
            }
        }
    

    ……最终在这样一段代码里找到了它:

        protected void deflate() throws IOException {
            int len = def.deflate(buf, 0, buf.length);
            if (len > 0) {
                out.write(buf, 0, len);
            }
        }
    

    其中 out.write(buf, 0, len); 的方法往我们的缓冲输出流中写入了最后一段字节。代码中的 buf 就是压缩流中的缓冲区,当缓冲区没有满的时候,最后一段内容,还没有同步到用于接收的流中,当调用 close(); 方法时,压缩流意识到马上就要结束了,需要把最后的一段内容赶快写到接收的流中。
      于是我们发现了,原来关流之前,还有一段文件内容没有输出,此时我们就将缓冲流转换成字节数组就为时过早了
      但是还有一个问题,WinRAR怎么知道压缩文件末端损坏了呢?我猜测,压缩文件之所以被识别成压缩文件,一定是有一个头标识和尾标识,当 close(); 方法执行是,同时也将尾部标识写进了流中,当压缩文件字节码缺失最后一段内容的同时,也缺失了压缩文件的尾部标识。由于时间限制,我就不做对应的验证了,后续有时间想起来再验证一下我的想法。如果有哪位大佬清楚其中的原理,希望再评论中指正!十分感谢

    4. 结论

    1. 使用ZipOutputStream时,调用过 close(); 方法之后才算结束,在此之前,得到的内容是不完整的;
    2. finally块在return之前执行,但并非在return行之前执行,finally只会在得到return的值之前执行;
    3. ZipOutputStream的 close(); 方法中对流进行了最后一段内容的输出;
    4. 遇到问题要分析每个影响因素,并写多个样例做对照样本;
    5. 遇到问题看源码很多时候能出奇制胜。
    展开全文
  • 据悉密码管理工具的设计与实现是基于实际电脑软件应用需求的,所以可以彻底杜绝由于系统重装、病毒感染以及其它不可预料因素导致的密码丢失问题,威航软件园通过多种密码管理工具对比发现,Advanced Password ...
  • 可能因为硬体故障,电源中断,或其他不可预料的问题。更常见的这些问题是来自人为的错误,不当的变动,甚至因为删除重要的档案。如果您负责管理系统上的用户,一定可能常被要求重建因为不小心误删的档案。  如果...
  • 为什么spring要设计为不可变对象

    千次阅读 2015-05-05 23:17:29
    在Java中将String设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑. 在下文中,我将为各种原因做一个小结。 1. 字符串常量池的需要    只有当...

    这是一个老生常谈的话题(This is an old yet still popular question). 在Java中将String设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑. 在下文中,我将为各种原因做一个小结。

    1. 字符串常量池的需要

         只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。

    字符串常量池(String pool, String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。

    如下面的代码所示,将会在堆内存中只创建一个实际String对象.

    String s1 = "abcd";  
    String s2 = "abcd"; 

    示意图如下所示:


    假若字符串对象允许改变,那么将会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象. 严格来说,这种常量池的思想,是一种优化手段.

    思考: 假若代码如下所示,s1和s2还会指向同一个实际的String对象吗?

    String s1= "ab" + "cd";  
    String s2= "abc" + "d"; 

    2. 允许String对象缓存HashCode
    Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中。

    因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。

    字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存.这也是一种性能优化手段,意味着不必每次都去计算新的哈希码. 在String类的定义中有如下代码:

    [javascript]  view plain copy
    1. private int hash;//用来缓存HashCode  
    3. 安全性

    如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。

    String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。

    假如有如下的代码:

    [javascript]  view plain copy
    1. boolean connect(string s){  
    2.     if (!isSecure(s)) {   
    3. throw new SecurityException();   
    4. }  
    5.     // 如果在其他地方可以修改String,那么此处就会引起各种预料不到的问题/错误   
    6.     causeProblem(s);  
    7. }  

    4、因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的

    5、类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。


    展开全文
  • 一边是企业纷纷把数字化转型当作未来发展规划中的标配,另一边是尽如人意的成功率,一个问题不得不问:在大谈各种技术和产品的同时,究竟什么才是提升数字化转型成功率的关键所在,让企业或组织能够达到预期成果、...

    文 | 曾响铃

    来源 | 科技向令说

    数字化如火如荼,但随着企业数字化进程的加快,一个“难言之隐”也显露出来:真正意义上达到数字化转型预期目标的“成功率”并不算高。在埃森哲与国家工业信息安全发展研究中心推出的《2020中国企业数字转型指数研究》中,2020年我国数字化转型效果显著的企业才只有11%。

    一边是企业纷纷把数字化转型当作未来发展规划中的标配,另一边是不尽如人意的成功率,一个问题不得不问:在大谈各种技术和产品的同时,究竟什么才是提升数字化转型成功率的关键所在,让企业或组织能够达到预期成果、“不花冤枉钱”?

    答案,可能要从那些已经成功的实践中去找寻。

    最近,《互联网周刊》、中国社会科学院信息化研究中心、eNet研究院、德本咨询联合发布了互联网经济论坛的最高荣誉“金i奖”,其中,与数字化转型直接相关的ICT服务类大奖“2021智慧服务领军企业奖”颁发给了从事政企数字化转型的联想智慧服务。

    无独有偶,在《互联网周刊》评选的2021年度数字化转型推动企业100强中,联想名列前茅(排名第十五位),而联想智慧服务的“颐和园-智慧园区解决方案”同样在《互联网周刊》评选的2021企业服务、科技互联网案例TOP100中排名第十八位。

    联想智慧服务正得到业界的普遍认可,而从整个数字化发展的行业角度,这里更关心的是,从联想身上,我们或可以窥见数字化转型如何提升成功率的密码。

    “不可控性”——数字化转型低成功率的本质原因?

    要分析为什么能够成功,要先来看看为什么会失败。

    通常,数字化转型未达预期,其原因往往包括没有解决实际问题、在一些环节上掉了链子、上下认知不统一、人才缺失、项目预算“超支”甚至未考虑合规需求等等。

    牵一发而动全身的数字化转型,说到底是一个“复杂系统”,牵扯技术、人员、流程、运营等多方面的因素,任何一个地方的出现纰漏都可能造成整体效果的不佳。

    而如同数学、物理学上的“复杂系统”,运行出现预期的偏差归根结底都指向其过程的“不可控性”——从技术到方案到执行总是有一些不在预料之中的情况出现,影响了整个数字化转型的进程:

    方案与企业做数字化转型的核心目标没有完全对齐,临落地了才发现有些地方显得很鸡肋,但已经改不了了;

    做了一大半才发现有些重要的业务环节漏掉了,传统流程环节和数字化环节对不上;

    信心满满落地执行才发现很多员工甚至领导层意愿不强,打了折扣;

    还有,最基本的ICT技术支撑在运行时才发现很多薄弱项,硬件强、软件不行,软件好但硬件支撑不够,等等。

    没有谁可以做到在推进数字化转型过程中不出现令人措手不及的意外状况,因为谁也不是全知全能,但起码,这种不可控情况的出现频率一定是与数字化转型成功率成反比的。

    所以,数字化转型要提升成功率,最底层的任务之一,一定是要避免任何可能出现的“不可控”状况,尽可能让数字化不偏离预设的航道、完成既定目标。而这,恰恰是对从事数字化转型服务的企业的最大考验。

    提升“胜算”,数字化转型的“可控性”已有答案?

    联想智慧服务之所以能够得到业界的普遍认可,原因可能有很多,但从提升数字化转型成功率的角度看,是其能够最大限度地降低转型过程的“不可控性”。

    具体而言,这种能力的实现离不开联想智慧服务在三个方面的做法,它们也能帮助我们更好地理解政企数字化转型“不可控性”的产生原因,以及借鉴如何才能实现更高的“可控性”。

    1、“过河先趟水”——经过大规模实践检验

    为什么偏偏在数字化转型过程中总是会有那么多“意外状况”,首要原因,是高度定制化的业务本身往往也意味着缺乏大规模实践的检验,没有经历过现实场景的迭代,总会有很多因素没有被考虑到,在实际方案和落地过程中“出岔子”。

    这也是很多大型政企组织在选择合作方时首先考虑的因素:到底有没有做过、有没有经验可以做好?

    而尴尬之处在于,目前所谓从事数字化转型服务的互联网、科技企业,很多都有点像“空手套白狼”,缺乏特定行业和场景的实践经验,光有技术没有对业务的理解,做起数字化转型来连自己都是“摸着石头过河”,客户某种程度上更像是一个实验品。

    但是,在联想智慧服务这里,情况变得不太一样了。

    2021年的联想集团创新科技大会上,“擎天”被明确为其新IT架构的内核,而这个内核也成为联想智慧服务推动政企数字化转型的重要依托,它最大的特点,是以引擎的方式实现了联想自身能力的“内生外化”,也即将联想多年来在业务转型过程中积累的IT创新和IT实践沉淀转化成为数字化转型的能力,在内部落地应用、推广并不断迭代,在成熟后以产品化的方式在客户处应用落地与迭代。

    本质上,“擎天”让联想以“数字化管理运营行业标杆”身份,把自己当作了客户数字化转型的最大实践检验场、成功案例,联想自己趟过的水、遇见过的任何问题在客户那里不会再来一遍,数字化转型的不可控性也就大大降低。

    于此同时,随着联想合作的灯塔客户越来越多,在“好的开头”以及不断涌现的合作成果基础上,迭代还在继续,数字化转型的“可控性”也将变得越来越强。

    2、“全频道对齐”——系统化布局避免遗漏

    考虑到这个没有考虑到那个,总有漏掉的,而一不小心漏掉的地方就变成数字化转型最大的掣肘,像木桶短板一样影响着整个木桶的盛水量。在数字化转型过程中,“复杂系统”意味着众多要素在一开始就要被考虑进来,一个尽可能全的“路线图”要在一开始被设计好,否则不知道从什么地方冒出来的问题会让整个数字化转型的过程措手不及。

    这就需要在多个维度上完成数字化转型的“全频道对齐”,用尽可能系统化的动作来避免任何遗漏。

    从联想智慧服务的案例来看,这至少表现在三个方面:

    一是技术要素的对齐。基于联想自身的实践以新IT的创新探索,联想智慧服务提供的是一套“端—边—云—网—智”的技术架构,区别了很多数字化转型服务商只能提供云、端等某方面技术能力,只要是数字化转型有需要,这个体系都已经储备了能力在等待;

    二是服务要素的对齐。政企组织在寻求数字化转型合作时,越来越倾向于一揽子式的解决方案,什么环节都“包圆了”,避免那个环节的认知不足而误事。可以看到,联想智慧服务依托于“擎天”的技术积累,提供的是从评估、规划、设计,到交付、运维、服务质量提升的IT服务全生命周期服务,只要是数字化转型可能涉及到的,都纳入了进来;

    三是业务要素的对齐。政企数字化转型的涉及面往往十分广泛,需要全盘考虑,不能临了才想起还缺这个、少那个。

    以联想与颐和园的合作为例,双方合作搭建智慧云平台,而整体工程将包括智慧旅游、智慧管理和智慧园区三期。其中,智慧服务以游客服务中心为核心,为逐年递增的游客提供更优质的文化服务和数字体验,这里考虑了“游客”这个核心要素;智慧管理以提升景区管理效率和能力为目标,提供园区管理优化智能工具,这里考虑了“景区管理”这个核心要素;而智慧园区则以实现文化创新与文物保护、推动中国传统文化的全人类共享为目标,这里考虑了“产业”这个核心要素。

    由此可见,联想智慧服务做到的是“一个都不能少”,把数字化转型涉及到的技术元素、服务环节、业务利益各方全面兼顾,层层细化触达每个末梢,让每个触点都能做到可控。

    以与颐和园合作为例,如果观众来到这里的体验有纰漏,在某些环节不够方便、体验不佳,那么对颐和园这样的景区来说,数字化转型的意义可能就大为受限。也由此,联想与颐和园打造的“云端惠民”新样本,就在让每一位来到颐和园的观众能够享受到更高速的网络服务和高清视频内容,获得更优质的文化服务和数字体验。

    3、“降低落地风阻”——契合企业业务实际

    即便有实践的检验、有最全面的布局,如果数字化转型不能很好地贴合企业业务的实际,也容易出现执行时各种不到位的问题,“明明好好的,怎么到这里就搞不下去、到那里就不动了,有些功能好像根本就没用”。

    不贴合实际很容易导致各种磕磕绊绊的出现,让一个表面上看起来美好的数字化转型方案在执行时冒出各种料想不到的问题,举步维艰。要降低这方面的“不可控性”,就需要让数字化转型尽可能贴近企业业务实际,否则再优质的技术和服务,都成了无用处的炫技。

    联想帮助桐昆集团实现高效率管控的过程,就充分表达了从客户业务实际出发的重要性。

    桐昆集团是中国化纤龙头企业,在两年前面临着集团化管控上的挑战,该企业历经四十年发展,依靠收购迅速扩张,发展到旗下共21家工厂,分布在全国各地,最远的位于新疆,员工超过20000人。

    这时候,对桐昆集团而言,数字化转型的诉求显然不只是某个工厂、某个流水线的精细化管理能力(实际上桐昆已经在这方面自己努力了很久),如何在全局上进行统筹、实现集团化管控才是数字化转型最大的需求。而联想介入后,其以以工业物联网平台LeapIOT为核心,帮助桐昆打造了完整的企业级工业互联网平台,21家分厂车间的工业网络得到了改造和增强,971条生产线上的26820台设备得到连接,全量生产数据和信息系统数据得到了融合处理。

    而这样的统筹,才契合桐昆集团当下的数字化转型要求,才能让所有的技术和应用都跑在最需要的地方。

    最大的不可控是“未来”,数字化转型服务要准备好子弹了

    从企业视角到行业视角,在整个数字化发展的浪潮下,最大的不可控性始终是“未来”。

    新技术的发展、新业态的出现,总是不断对数字化提出各种各样的要求,如果不能紧紧跟上,很容易出现对新的需求不能把控的状况,硬着头皮上将出现各种因为能力对不齐而造成的问题。

    而联想智慧服务的另一个重要特点,是能够始终抓住前沿发展趋势。

    在技术层面,联想的擎天包括混合云(xCloud)、私有云(Jupiter)、公有云/专有云的IaaS层,技术中台和通用业务中台的GPaaS层以及面向不同行业领域的VPaaS层,同时具备云原生、中台化和AI智能这三大特征。

    而这些特征,与数字化下一步发展的趋势紧密贴合,例如在云计算深入发展后,当前“云原生”相比较“本地应用上云”已经越来越占据主导权,未来的多数与云计算有关的数字化都将以“云原生”的姿态出现,联想早已提前布局。

    在业务层面,联想智慧服务能够支撑智慧城市、智慧教育、智能制造、智慧能源、智慧农业、智慧办公等领域的智能化转型,但这还不够,在绿色低碳的叠加需求下,这些场景的转型本身也在发生变化。

    以智慧城市为例,联想的绿色智慧城市解决方案并不局限于市面上通常的“智慧城市”打法,而同时强调对低碳经济的融合,其以“新IT”+绿色能源为主线,聚焦绿色智慧园区、绿色智慧交通、绿色基础设施这三个关键场景,例如在打造绿色智慧园区方面,打造的是低碳产业园区、商业园区、生活社区、校园园区等。

    可以说,联想在这里发挥了“新IT”企业绿色科技创新优势以及在智慧城市领域深耕多年的技术与服务经验优势,来不断贴合未来的绿色、低碳转型发展需要。

    总而言之,“不可控性”造成了政企数字化转型成功率低迷的现实,对那些服务于政企的外部合作方来说,谁能最大程度降低不可控性,谁就有了更明显的行业竞争优势,会更加容易赢得理性的政企客户选择。而随着数字化进程的不断推进,政企的需求本身也会发生各种各样的变化,带来行业层面的“不可控性”,这时候,在已有坚实的技术和能力基础之上未雨绸缪,才能帮助从业者赢在未来。

    *本文图片均来源于网络

    *此内容为【科技向令说】原创,未经授权,任何人不得以任何方式使用,包括转载、摘编、复制或建立镜像。

    【完】

    曾响铃

    1钛媒体、品途、人人都是产品经理等多家创投、科技网站年度十大作者;

    2虎啸奖评委;

    3作家:【移动互联网+ 新常态下的商业机会】等畅销书作者;

    4《中国经营报》《商界》《商界评论》《销售与市场》等近十家报刊、杂志特约评论员;

    5钛媒体、36kr、虎嗅、界面、澎湃新闻等近80家专栏作者;

    6“脑艺人”(脑力手艺人)概念提出者,现演变为“自媒体”,成为一个行业;

    7腾讯全媒派荣誉导师、多家科技智能公司传播顾问。

    展开全文
  • Java的string类为什么是不可变的

    千次阅读 2018-02-01 21:56:46
    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型? 不可变对象,顾名思义就是创建后不可以...
  • Java的string类常量池及不可变性

    万次阅读 多人点赞 2016-03-10 10:48:49
    在Java中将String设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑. 在下文中,我将为各种原因做一个小结。 1. 字符串常量池的需要   字符串常量...
  • 由于企业自身及外部各种难以预料或控制因素的影响,使施工项目的财务收益具有确定性。依据施工项目财务风险形成的特征、因素及防范措施等方面,提出了有针对性的解决方案,以期降低财务风险,保证企业的持续发展。
  • 当这些信号的频率超过纳奎斯特频率时,数字信号中就会出现不可预料的干扰,即频率混叠。为了最大程度地抑制或消除混叠现象对动态测控系统数据采集的影响,就需要利用抗混叠滤波器将无用信号进行衰减和滤除[1]。 ...
  • 数据泄漏5大风险因素

    2021-03-10 16:07:44
    因为数据的真正价值体现在使用和分享,所以数据的价值与其动态性是不可分割的,即有价值的数据一定会处于动态之中。因此,数据风险防范的核心是对动态数据的保护(data in use or in motion)。对政企而言,绝大部分...
  • 由于垃圾品类、垃圾热值、垃圾比重等因素非常稳定,导致垃圾燃烧很稳定。虽然对垃圾进行了发酵等手段处理,但是燃烧时,依然存在难以预料的困难。 虽然在国外有很成功的垃圾焚烧控制技术,国内很多垃圾焚烧厂也...
  • 因实 际中影响生物系统的因素很多,氘代后所导致的代谢及药动学的改变一定程度具 有复杂与不可预测性,真实观察到的氘同位素效应既可能十分明显,也可能微不 足道,也可能导致预料之外的效应。找寻氘代效应明显的氘...
  • 第一部分,应对确定性 2 还原论的时代与全新的时代 3 从复杂到错综复杂 4 建立有效组织 第二部分:化繁为简 5 建立互信和目标共享的团队 6 突破“深井”,建立关系 第三部分:信息...
  • 高速高精度ADC的驱动电路 1前言 在数据采集过程中不可避免地会有高频干扰信号的存在 当这些信号的频率超过纳奎斯特频率时数字信号中就会出现不可预料的干扰即频率混叠为了最大程度地抑制或消除混叠现象对动态测控...
  • 日常Java练习题(每天进步一点点系列)

    千次阅读 多人点赞 2021-08-20 23:05:06
    提示:好多小伙伴反映,直接看到答案太好,那我把答案的颜色设置为透明,答案位置还是在题目后面,需要鼠标选中才能看见(操作如下图),同时为了手机端的小伙伴(手机端也可以长按选中查看),我还会把所有答案放...
  • 因为当电机电流过大,会造成电源大的压降,以至于稳压芯片不能正常工作,得不到想要的稳压电压,会导致微处理器自动复位,带来不可预料的危险。 2.经过查阅大量资料,最终确定采用底线性压差稳压的TPS7350、TPS7333 ...
  • 本内容是我从各处转载整理得来,是我的学习笔记,如有涉及到版权问题,请给我留言。 或者内容中有不正确的...由String创建的字符内容是不可改变的,而由StringBuffer和StringBuidler创建的字符内容是可以改变的。 2、S
  • 法规可能允许或允许使用新程序,并且可能会带来以前可能未曾预料到的新风险-另一个需要特别注意的领域。 银行正在通过组建端到端共同负责的多学科团队来实现数字化-从设计阶段到新流程的全面推广。 由于需要...
  • BMS算法中定义SOC需考虑哪些因素

    万次阅读 多人点赞 2018-10-30 17:12:22
    而关于SOC详尽的解释和定义却常被考虑,从而导致了SOC算法结果的参考价值大打折扣。显而易见若SOC的概念都是模糊的,又何来精确的SOC呢?因此作者希望通过本文分析几种维度下的SOC值,以及这些SOC值的作用。 粗率...
  • 在Java中将String设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑. 在下文中,我将为各种原因做一个小结。 1. 字符串常量池的需要 字符串常量...
  • 10.第十一章.风险管理

    千次阅读 2022-02-02 13:45:25
    文章目录11.1项目风险管理概述11.2规划风险管理...2、当事件、活动或项目有损失或收益与之相联系,涉及到某种或然性或确定性和涉及到某种选择时,才称为有风险。以上三条,每一个都是风险定义的必要条件,不是充分条
  • A:定量风险分析 B:根本原因分析 C:偏差分析 D:定性风险分析 4、在考虑一个新项目风险时,项目经理将风险矩阵应用于人为因素所做的贡献。项目经理发现,团队成员的态度在风险厌恶和风险追求之间存在很大差异。...
  • Canalys分析师Blake Murray表示,多个因素在共同推动原本发展中的市场进一步壮大,即政府计划、云服务提供商的投入承诺,以及新冠疫情后的经济对数字化转型和在线服务的需求不断增长,中国云基础设施服务市场的发展...
  • 我们的架构是基于PB级别以及本质上动态的假设,动态的定义:大系统不可避免地逐步建立,节点失败是常态,而非例外, 工作负载随时间不断变化。  Ceph分离数据和元数据操作,通过CRUSH生成代替传统文件系统的文件分布表...
  • 第二点是腾讯作为上市公司,计较商业经济上的投入产出比,通过技术开放、资源链接、资金扶持等运营形式助力公益向持续方向深度发展。 腾讯优图人脸比对 突破跨年龄人脸识别难题,让家庭找到失踪了19年的孩子...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,849
精华内容 5,139
关键字:

不可预料因素