jWhy

https://isocpp.org/wiki/faq/ctors#overview-ctors

https://theboostcpplibraries.com/

为什么 Java 的 +=、-=、*=、/= 复合赋值运算符不需要强制转换?

形式的复合赋值表达式E1 op= E2等价于E1 = (T)((E1) op (E2)),其中T是 的类型E1,只是E1只计算一次。

Why can't your switch statement data type be long, Java?

切换本质上可以通过两种方式(或原则上,组合)实现:对于少数情况,或值广泛分散的情况,切换本质上相当于临时变量上的一系列 ifs(被打开的值只能被评估一次)。对于值或多或少连续的中等数量的情况,使用切换表(Java 中的 TABLESWITCH 指令),从而有效地在表中查找要跳转到的位置。

这些方法中的任何一种原则上都可以使用长值而不是整数。但我认为这可能只是一个实际的决定来平衡指令集和编译器的复杂性与实际需要:您真正需要切换 long 的情况很少见,以至于不得不重新编写为一系列 IF 语句,或以其他方式工作(如果有问题的 long 值靠近在一起,您可以在 Java 代码中切换减去最低值的 int 结果)。

Java 和 C++ 之间的主要区别是什么?

https://cs-fundamentals.com/tech-interview/java/differences-between-java-and-cpp.php

 为什么 String 在 Java 中是不可变的?

String在 Java 中是不可变的。不可变类只是一个实例不能修改的类。实例中的所有信息都是在创建实例时初始化的,不能修改。不可变类有很多优点。本文总结了为什么String被设计为不可变的这篇文章从内存、同步和数据结构的角度说明了不变性概念。

 

一、字符串池的要求

字符串池(String intern pool)是Method Area 中的一个特殊存储创建字符串时,如果字符串已存在于池中,则将返回现有字符串的引用,而不是创建新对象。

下面的代码将只在堆中创建一个字符串对象。

String string1 =  "abcd" ; 
String string2 =  "abcd" ;

这是它的外观:
java字符串池

如果字符串是可变的,使用一个引用更改字符串将导致其他引用的值错误。

2.缓存哈希码

字符串的哈希码在 Java 中经常使用。例如,在 HashMap 或 HashSet 中。不可变保证了 hashcode 始终相同,这样就可以兑现而不必担心更改。这意味着每次使用时都不需要计算 hashcode。这样效率更高。

在 String 类中,它具有以下代码:

私有 整数哈希;//这是用来缓存哈希码的。

3. 促进其他对象的使用

为了具体说明这一点,请考虑以下程序:

HashSet < String > set =  new HashSet < String > ( ) ; 
放。添加(新 字符串(“a” ));
放。添加(新 字符串(“b” ));
放。添加(新 字符串(“c” ));
 
for ( String a : set ) 
	a. 值 =  "a" ;

在此示例中,如果 String 是可变的,则可以更改其值,这将违反 set 的设计(set 包含不重复的元素)。当然,上面的例子只是为了演示目的,value真正的字符串类中没有字段。

4. 安全

String 被广泛用作许多 java 类的参数,例如网络连接、打开文件等。如果 String 不是不可变的,连接或文件将被更改,这可能会导致严重的安全威胁。该方法认为它连接到一台机器,但事实并非如此。可变字符串也可能导致反射中的安全问题,因为参数是字符串。

这是一个代码示例:

布尔连接字符串 s ){
    如果 (! isSecure  s )) { 
抛出 新的 SecurityException (); 
} 
    //这里会导致问题,如果在此之前使用其他引用更改了s。    
    原因问题 s );
}

5.不可变对象自然是线程安全的

因为不可变对象不能改变,所以它们可以在多个线程之间自由共享。这消除了进行同步的要求。

总之,String出于效率和安全原因,它被设计为不可变的。这也是为什么通常在许多情况下首选不可变类的原因。

String, StringBuffer, and StringBuilder

String is immutable, if you try to alter their values, another object gets created, whereas StringBuffer and StringBuilder are mutable so they can change their values.

Thread-Safety Difference:

之间的区别 StringBuffer ,并 StringBuilder 是 StringBuffer 是线程安全的。因此,当应用程序只需要在单个线程中运行时,最好使用 StringBuilderStringBuilder 比 更有效率 StringBuffer

情况:

  • 如果您的字符串不会更改,请使用 String 类,因为 String 对象是不可变的。
  • 如果您的字符串可以更改(例如:字符串构造中的许多逻辑和操作)并且只能从单个线程访问,则使用 a StringBuilder 就足够了。
  • 如果您的字符串可以更改,并且可以从多个线程访问,请使用 a StringBuffer 因为 StringBuffer 是同步的,因此您具有线程安全性。

 

什么是 Java 字符串实习?

基本上对一系列字符串执行 String.intern() 将确保所有具有相同内容的字符串共享相同的内存。因此,如果您有 'john' 出现 1000 次的名字列表,通过实习,您可以确保只有一个 'john' 实际分配了内存。

这对于减少程序的内存需求很有用。但请注意,缓存由 JVM 在永久内存池中维护,与堆相比,永久内存池的大小通常有限,因此如果没有太多重复值,则不应使用实习生。

深入解析String#intern

Is Java “pass-by-reference” or “pass-by-value”?

Java 总是按值传递不幸的是,当我们处理对象时,我们实际上是在处理称为引用的对象句柄,这些句柄也是按值传递的。这种术语和语义很容易混淆许多初学者。

https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

何时使用抽象类和接口

 

 https://stackoverflow.com/questions/802050/what-is-opinionated-software

 https://github.com/mitodl/handbook/blob/master/production-ready.md

Production Ready

本文档从操作的角度定义了我们用于生产就绪应用程序和更改的标准产品准备就绪的时间点可能因项目而异。

Overview

Applications

在应用程序范围内,我们严格遵守 Heroku 的 十二要素应用程序指南作为生产准备的基线。“生产清单”列出了使应用程序做好生产准备的具体实施指南。

New code changes

任何时候发现新的变更集阻碍了生产准备(例如,变更集可能会引入一些功能,这些功能在设计上会掩盖日志记录或在生产设置中静默失败),它不是生产就绪的变更,不应在生产环境中推广释放管道。此外,要使任何代码更改成为“生产就绪”,都必须在与生产相同的受控预生产环境的上下文中进行验证。

"Production readiness" checklists

Required features:

  •  它是否支持通过环境变量进行配置?
  •  它是否支持通过平面文件(例如 YAML)进行配置?
  •  它是否具有合理的默认配置(例如,尽可能接近现实的生产配置)?
  • 它是否在并行 HTTP 工作线程上运行?(例如 uWSGI、Gunicorn)?
  •  它是否记录到标准输出/错误?
  •  它是否记录到系统日志?
  •  它可以将堆栈跟踪电子邮件发送到可配置的电子邮件列表吗?
  •  它是否具有可配置的日志级别(例如调试、错误、警告、信息)?
  •  它是否有测量代码覆盖率的测试套件?
  •  它是否具有可用于监控服务的健康检查的状态路由(需要一个秘密令牌)?
  •  运行状况检查是否验证应用程序所依赖的每项服务是否可访问(例如,数据库、缓存、必要时的外部 API)?
  •  运行状况检查是否在所有情况下都以机器可读格式返回包含上述可用性信息的响应正文?
  •  当检测到健康检查中的任何组件失败时,健康检查是否返回 500 状态代码?

Required documentation/service infrastructure:

  •  它是否具有运行完整测试套件的持续集成构建?
  •  它是否具有对开发环境的自动化持续交付?
  •  是否有文件化的发布流程?
  •  它的发布过程是否包括暂存和生产构建,其中暂存构建被提升到生产?
  •  它的发布过程是否要求代码更改在升级到生产之前“签署”作为暂存工作?
  •  它在生产中是否有应用程序/资源监控(例如 New Relic 代理、Zenoss SNMP)?
  •  它在生产中是否有服务可用性监控(例如使用 Zenoss 或 New Relic 进行定期健康检查)?
  •  它是否为生产中的每个非临时数据存储提供自动的、定期生成的、完全可恢复的备份?

https://www.quora.com/What-does-it-mean-when-code-is-production-ready

“生产就绪”意味着代码的作者认为它已准备好在生产环境中运行。对于生产就绪意味着什么,没有一套单一的标准,不同的工程师可能对生产就绪意味着什么有不同的看法。

例如,在 Google,所有代码都必须在签入之前编译、通过单元、集成和性能测试,并通过另一位工程师的代码审查。取决于可能足以“生产就绪”的团队。但是,影响搜索质量的更改必须经过特殊的启动过程。代码更改的结果必须显示给人类评估者。启动委员会必须批准更改。通常必须编写代码以同时支持新旧行为,以便可以逐渐启用该功能。因此,“生产就绪”对于新的搜索功能来说是一个相当高的标准。

在库包的上下文中(如问题详细信息中所述)“生产就绪”意味着库的所有者认为在生产环境中使用他们的库是安全的。作为标签,它比“实验性”或“测试版”更上一层楼。这并不意味着该软件包没有错误,或者它实际上可以用于您的核潜艇。库的消费者应该自己研究软件库的健全性,并在他们的生产环境中启动它之前运行他们自己的测试。公司可能有与正常代码提交过程不同的用于合并第三方库的过程。

posted @ 2021-07-09 16:00  CharyGao  阅读(8)  评论(0)    收藏  举报