StackOverflow上多次询问过这个问题,但没有一个是基于性能的.
在Effective Java书中给出了它
如果
String s = new String("stringette");在循环或频繁调用的方法中发生,则可以不必要地创建数百万个String实例.改进版本只是以下内容:
String s = "stringette";此版本使用单个String实例,而不是每次执行时都创建一个新实例.
所以,我尝试了两者,发现性能有了显着提高:
for (int j = 0; j < 1000; j++) {
String s = new String("hello World");
}
Run Code Online (Sandbox Code Playgroud)
需要大约399 372纳秒.
for (int j = 0; j < 1000; j++) {
String s = "hello World";
}
Run Code Online (Sandbox Code Playgroud)
大约需要23 000纳秒.
为什么会有这么多的性能提升?内部是否有任何编译器优化?
使用共享内存时,我们为什么要关心创建密钥
key_t ftok(const char *path, int id);
Run Code Online (Sandbox Code Playgroud)
在下面的代码中?
key_t key;
int shmid;
key = ftok("/home/beej/somefile3", 'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
Run Code Online (Sandbox Code Playgroud)
根据我的理解,访问给定共享内存所需的是shmid,而不是密钥.还是我错了?如果我们需要的是shmid,每次不仅仅创建一个随机密钥有什么意义呢?
@ Beej的Unix IPC指南可以阅读:
那
key废话怎么样?我们如何创建一个?好吧,因为类型key_t实际上只是一个long,你可以使用你想要的任何数字.但是如果你硬编码数字和其他一些不相关的程序硬编码相同的数字但想要另一个队列呢?解决方案是使用ftok()从两个参数生成密钥的函数.
读到这一点,它给我的印象是,需要附加到共享内存块的关键是什么.但事实并非如此,是吗?
当尝试使用lambda表达式时,我得到了一些Gradle构建错误:
错误:(41,100)错误:-source 1.7不支持lambda表达式(使用-source 8或更高版本启用lambda表达式)
错误:任务':app:compileDebugJava'的执行失败.编译失败; 请参阅编译器错误输出以获取详细信
快速搜索帮助我理解lambda表达式仅支持JDK 1.8,显然我没有使用它.
我的问题是我的计算机上安装了JDK 1.8(我使用Yosemite),在模块设置→SDK位置→JDK位置它说:

但是在设置模块→应用程序→源/目标兼容性中,没有诸如"1.8"之类的选项,只有Java 1.6或1.7的选项.

我知道我可以管理没有匿名功能,但我仍然想解决这个问题.
以下命令输出不同的结果,具体取决于它是在bash还是zsh中运行:
ls -l > x | wc -l
Run Code Online (Sandbox Code Playgroud)
如果在非空目录中执行,bash总是给出0,而zsh给出正确数量的文件.x包含ls -l预期的输出.
为什么它不能用于bash?
我使用了HERE Maps API 的高级 Android SDK并实现了演示应用程序。但是我的应用程序大小是65 MB。
我还按如下方式shrinkResources在应用程序build.gradle文件中启用,但这对我不起作用。
android {
// Other settings
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是我们如何减少 HERE Maps API 上 Android SDK 中使用的 APK 大小。