做的有什么区别:
ptr = (char **) malloc (MAXELEMS * sizeof(char *));
Run Code Online (Sandbox Code Playgroud)
要么:
ptr = (char **) calloc (MAXELEMS, sizeof(char*));
Run Code Online (Sandbox Code Playgroud)
什么时候使用calloc而不是malloc是一个好主意,反之亦然?
==到目前为止,我一直在我的程序中使用运算符来比较我的所有字符串.但是,我遇到了一个错误,将其中一个更改为了.equals(),并修复了该错误.
是==坏?什么时候应该不应该使用它?有什么不同?
如果我的假设在这里错了,请随意纠正我,但让我解释一下我为什么要问.
摘自MSDN,a SecureString:
代表应保密的文本.文本在使用时加密以保护隐私,并在不再需要时从计算机内存中删除.
我明白了,将密码或其他私人信息存储在a中是完全合理SecureString的System.String,因为你可以控制它实际存储在内存中的方式和时间,因为System.String:
是不可变的,当不再需要时,不能以编程方式安排垃圾收集; 也就是说,实例在创建后是只读的,并且无法预测实例何时从计算机内存中删除.因此,如果String对象包含敏感信息(如密码,信用卡号或个人数据),则使用该信息后可能会显示该信息,因为您的应用程序无法从计算机内存中删除该数据.
但是,在GUI应用程序(例如,ssh客户端)的SecureString 情况下,必须从a构建 System.String.所有文本控件都使用字符串作为其基础数据类型.
因此,这意味着每次用户按下某个键时,就会丢弃那里的旧字符串,并构建一个新字符串来表示文本框内的值,即使使用密码掩码.并且我们无法控制何时或是否从内存中丢弃任何这些值.
现在是时候登录服务器了.你猜怎么着?您需要在连接上传递一个字符串以进行身份验证.所以让我们将我们SecureString转换为System.String....现在我们在堆上有一个字符串,无法强制它通过垃圾收集(或将0写入其缓冲区).
我的观点是:无论你做什么,沿线某处,那SecureString是会被转换成一个System.String,这意味着它至少会在某些点上堆存在(没有垃圾收集的任何保证).
我的观点不是:是否存在绕过将字符串发送到ssh连接或绕过控件存储字符串(制作自定义控件)的方法.对于这个问题,您可以将"ssh connection"替换为"登录表单","注册表单","付款表单","食物 - 你愿意喂你的小狗但不是你孩子的表格",等等
SecureString实际变得实用?System.String对象的使用?SecureString减少System.String堆上的时间(降低转移到物理交换文件的风险)?SecureString阻止他进入数据呢?对不起,如果我把问题放得太厚,好奇心就好了.随意回答我的任何或所有问题(或告诉我,我的假设是完全错误的).:)
请考虑以下示例.
String str = new String();
str = "Hello";
System.out.println(str); //Prints Hello
str = "Help!";
System.out.println(str); //Prints Help!
Run Code Online (Sandbox Code Playgroud)
现在,在Java中,String对象是不可变的.那么为什么对象str可以赋值"帮助!".这与Java中字符串的不变性相矛盾吗?任何人都可以向我解释一下不变性的确切概念吗?
编辑:
好.我现在得到它,但只是一个后续问题.以下代码如何:
String str = "Mississippi";
System.out.println(str); // prints Mississippi
str = str.replace("i", "!");
System.out.println(str); // prints M!ss!ss!pp!
Run Code Online (Sandbox Code Playgroud)
这是否意味着再次创建了两个对象("Mississippi"和"M!ss!ss!pp!"),并且引用str指向replace()方法之后的另一个对象?
我需要哈希密码以存储在数据库中.我怎么能用Java做到这一点?
我希望获取纯文本密码,添加随机盐,然后将salt和散列密码存储在数据库中.
然后,当用户想要登录时,我可以获取他们提交的密码,从他们的帐户信息中添加随机盐,哈希并查看它是否等于存储的哈希密码及其帐户信息.
我在接受采访时被问到为什么String是不可变的
我这样回答:
当我们在java中创建一个字符串时,
String s1="hello";就会在字符串池(hello)中创建一个对象,而s1将指向hello.如果我们再这样做,String s2="hello";那么将不会创建另一个对象但s2将指向,hello因为JVM将首先检查如果字符串池中存在相同的对象. 如果不存在则只创建一个新对象,否则不创建.
现在,如果假设Java允许串可变那么如果我们改变S1到hello world那么S2价值也将hello world因此Java字符串是不可改变的.
如果我的答案是对还是错,请问任何人可以告诉我吗?
如何连接到需要身份验证的Java远程URL.我试图找到一种方法来修改以下代码,以便能够以编程方式提供用户名/密码,因此它不会抛出401.
URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
Run Code Online (Sandbox Code Playgroud) 我想在Java中将字符数组转换为字节数组.有哪些方法可以进行此转换?
我char[]早在Usenet时代就学会了如何使用comp.lang.java.*.
搜索 Stack Overflow,你还可以轻松找到像这样高票数的问题: Why is char[] Preferred over String for passwords? 这与我很久很久以前学到的一致。
我仍然编写 API 以用于char[]密码。但现在这只是空洞的理想吗?
例如,查看Atlassian Jira的 Java API: LoginManager.authenticate,它将您的密码作为字符串。
或者Thales的 Luna Java API:
LunaSlotManager 中的 login() 方法。其中,HSM供应商使用StringHSM 插槽密码。
我想我还在某处读到 URLConnection (和许多其他类)的内部结构String在内部使用来处理数据。因此,如果您发送密码(尽管密码通过网络通过TLS加密),它将以字符串形式保存在服务器内存中。
访问服务器内存是否是一个很难实现的攻击因素,以至于可以像String现在一样存储密码?或者泰勒斯这样做是因为你的密码最终会String由于其他人编写的类而最终被泄露?
由于String在Java中(像其他语言一样)消耗大量内存,因为每个字符占用两个字节,Java 8引入了一个名为String Deduplication的新功能,它利用了char数组是字符串内部的最终事实,因此JVM可以搞砸他们.
到目前为止,我已经阅读了这个例子,但由于我不是一个专业的java编码器,我很难掌握这个概念.
这是它说的,
已经考虑了各种字符串复制策略,但现在实现的策略遵循以下方法:每当垃圾收集器访问String对象时,它会记录char数组.它接受它们的哈希值并将其与对数组的弱引用一起存储.一旦找到另一个具有相同哈希码的String,就会将它们与char进行比较.如果它们匹配,则将修改一个String并指向第二个String的char数组.然后不再引用第一个char数组,并且可以进行垃圾回收.
整个过程当然会带来一些开销,但是受到严格的限制.例如,如果找不到字符串有一段时间的重复项,则不再检查它.
我的第一个问题,
由于最近在Java 8更新20中添加了这个主题,因此仍然缺乏资源,这里是否有人可以分享一些关于如何帮助减少StringJava 消耗内存的实际示例?
编辑:
上面的链接说,
一旦找到另一个具有相同哈希码的String,就会将它们与char进行比较
我的第二个问题,
如果两个哈希码String相同,则Strings已经是相同的,那么为什么对它们进行比较char的char,一旦发现,这两个String具有相同的散列码?