由于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具有相同的散列码?
我正在开发一个设计模式,我想确保这里只是Java虚拟机中一个类的一个实例,通过一个点来汇集对某些资源的所有请求,但我不知道它是否可行.
我只能想到一种方法来计算类的实例并在创建第一个实例后销毁所有实例.
这是一种正确的方法吗?如果没有,还有其他方法吗?
我已经知道只有IntStream和LongStream.如何IntStream从字节数组中创建一个?
目前我打算这样做.
static int[] bytesToInts(final byte[] bytes) {
final int[] ints = new int[bytes.length];
for (int i = 0; i < ints.length; i++) {
ints[i] = bytes[i] & 0xFF;
}
return ints;
}
static IntStream bytesToIntStream(final byte[] bytes) {
return IntStream.of(bytesToInt(bytes));
}
Run Code Online (Sandbox Code Playgroud)
有没有更简单或更快的方法来做到这一点?
Google在Android版Lollipop中用Ahead-of-time(AOT)取代了JIT编译器.
Android运行时(ART),具有提前(AOT)编译和改进的垃圾收集(GC),取代使用即时(JIT)编译的Dalvik
根据维基百科,
Ahead-of-time(AOT)编译是编译高级编程语言(如C)或中间语言(如Java字节码,.NET公共中间语言(CIL),IBM System/38或IBM System i)的行为. "技术独立机器接口"代码,转换为本机(系统相关)机器代码.
我正在学习Java 8 Stream API的新手,
我想编写一个程序来查找整数数组中的偶数IntStream,所以我想出了这个解决方案,
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
IntStream.of(numbers).filter(i -> i%2 == 0).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
这对我来说是正常的.
但是如何修改filter以跳过某些数组索引numbers?
例如,
如果我想跳过numbers[1]检查,如果它是否均匀,那么我该怎么办?
因为i在过滤器中是数组元素的值而不是它们的索引.
有可能这样做吗?
我有一个二维数组,我想使用IntStream.
这是数组,
int[][] twoD = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
Run Code Online (Sandbox Code Playgroud)
现在,使用嵌套循环可以这样做,
for (int i = 0; i < twoD.length; i++) {
for (int j = 0; j < twoD[i].length; j++) {
System.out.println(twoD[i][j]);
}
}
Run Code Online (Sandbox Code Playgroud)
但我想使用IntStream. 我最近了解了flatMap我可以用来实现它的方法,所以我尝试了这个,
IntStream.range(0, twoD.length)
.flatMap(j -> IntStream.range(0, twoD[j].length))
.forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)
它输出010101.
在输出中的一个原因010101是,010101在指数值不是数组中的值,我必须使用类似这些值到数组值映射,i -> twoD[i]
所以我尝试了这个,
IntStream.range(0, twoD.length)
.map(i -> twoD[i])
.flatMap(j -> IntStream.range(0, twoD[j].length))
.forEach(System.out::print); …Run Code Online (Sandbox Code Playgroud) 我在Java 8和lambda表达式方面相对较新Stream,我可以使用for循环或递归计算阶乘.但有没有办法用来IntStream计算数字的阶乘?即使在整数范围内的阶乘也很好.
我IntStream在这里阅读了文档,http://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html,我可以看到很多方法,但不确定我可以用哪一个来计算阶乘.
例如,有rang方法说,
range(int startInclusive,int endExclusive)以1为增量步长,从startInclusive(包括)返回到endExclusive(不包含)的顺序有序IntStream.
所以我可以用它来提供IntStream的数字范围来乘以计算阶乘.
number = 5;
IntStream.range(1, number)
Run Code Online (Sandbox Code Playgroud)
但如何将这些数字相乘得到阶乘?
我使用java HttpURLConnection类连接到一个url,我想生成ConnectException来监视和记录一些数据.我只是想连接随机网站但我无法生产,ConnectionException即使我试图访问不存在的网址,但它正在捕捉MalformedURLException
来自Java Docs ConnectException,
http://docs.oracle.com/javase/7/docs/api/java/net/ConnectException.html#ConnectException()
表示尝试将套接字连接到远程地址和端口时发生错误.通常,远程拒绝连接(例如,没有进程正在侦听远程地址/端口).
这意味着需要从远程服务器拒绝连接,但我不知道这意味着什么以及如何从我的java代码生成它?
我正在尝试ArrayList用我的其他代码解决一些问题的简单示例,但这个简单的代码提供了错误的输出.
我创建了一个Hashmap的Arraylist,在该Hashmap中放入3个键/值对,然后将该Hashmap放在ArrayList中,就像这样,
public class SortData {
public static void main (String [] args){
ArrayList<HashMap<String, String>> myArrayList = new ArrayList<HashMap<String,String>>();
HashMap<String, String> myHashMap = new HashMap<String, String>();
myHashMap.put("title", "first Title");
myHashMap.put("date", "This is date");
myHashMap.put("number", "5");
myArrayList.add(0, myHashMap);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在数组列表中添加更多数据时
import java.util.ArrayList;
import java.util.HashMap;
public class SortData {
public static void main (String [] args){
ArrayList<HashMap<String, String>> myArrayList = new ArrayList<HashMap<String,String>>();
HashMap<String, String> myHashMap = new HashMap<String, String>();
myHashMap.put("title", "first Title");
myHashMap.put("date", "This is date");
myHashMap.put("number", "5");
myArrayList.add(0, myHashMap);
myHashMap.put("title", …Run Code Online (Sandbox Code Playgroud)