- 浏览: 546443 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
wa114d:
楼主工作几年了,好厉害
一个面试官对面试问题的分析 -
wobuxiaole:
Good,非常好
30岁前男人需要完成的事 -
小逗逗:
Good,非常好
30岁前男人需要完成的事 -
invincibleLiu:
好帖,要顶!(别投我隐藏啊,这是对BBS最原始一种支持)
Java:synchronized修饰符在静态方法与非静态方法上的区别 -
fayedShih:
第三题,不知道对不对
import java.util.con ...
企业牛逼面试题目 高手进来讨论答题
对象的创建(即内存的分配 )
Thinking in Java中详细介绍了当程序运行的时候,具体的内存分配。
可以分为寄存器、堆栈、堆、常量存储、非RAM存储。
下面具体分析一下java中的堆和栈(参考:http://blog.csdn.net/tanghw/archive/2005/02/18/291811.aspx)。
1. 两者比较
1). 栈(stack)与堆(heap)都是Java用来在RAM中存放数据的地方。
栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共 享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。
2). Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.
2. String处理
String str = "abc";和String str = new String("abc");和char[] c = {'a','b','c'};String str=new String(c);都采用堆存储
String str = "abc";在栈中如果没有存放值为"abc"的地址,等同于:
String temp=new String("abc");
String str=temp;
1). 关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:先定义一个名为str的对String类的对象引用变量:String str;
2). 在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o的字符 串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。
3). 将str指向对象o的地址。
使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
char[] c = {'a','b','c'};String str=new String(c);
等同于
String str = new String('a'+'b'+'c');
1.
class Test {
public static void main(String[] args) {
String s = "123";
}
}
Runtime Heap Summary: Test
==========================
Runtime Instance List
---------------------
Packag Class Count Cumulative Count Memory Cumulative Memory
Total 2 (100.0%) 2 (100.0%) 48 (100.0%) 48 (100.0%)
String 1 (50.0%) 1 (50.0%) 24 (50.0%) 24 (50.0%)
char[ ] 1 (50.0%) 1 (50.0%) 24 (50.0%) 24 (50.0%)
结论:String s = "123",会创建一个"123"字符数组和一个String对象。
2.
class Test {
public static void main(String[] args) {
String s = new String("123");
}
}
Runtime Heap Summary: Test
==========================
Runtime Instance List
---------------------
Package Class Count Cumulative Count Memory Cumulative Memory
------- ----- ----- ---------------- ------ -----------------
Total 3 (100.0%) 3 (100.0%) 72 (100.0%) 72 (100.0%)
java.lang String 2 (66.7%) 2 (66.7%) 48 (66.7%) 48 (66.7%)
char[ ] 1 (33.3%) 1 (33.3%) 24 (33.3%) 24 (33.3%)
结论:String s = new String("123");根据上面的测试可以看出,"123"创建了一个数组,一个String对象,而new String()又根据"123"对象作为参数,重新生成了一个新的String对象,此对象被s变量引用。
3.
class Test {
public static void main(String[] args) {
String s1 = "123";
String s2 = "123";
if (s1 == s2) {
System.out.println("s1==s2");
} else {
System.out.println("s1!=s2");
}
}
}
输出结果:s1==s2
4.
class Test {
public static void main(String[] args) {
String s1 = new String("123");
String s2 = new String("123");
if (s1 == s2) {
System.out.println("s1==s2");
} else {
System.out.println("s1!=s2");
}
}
}
结果:s1!=s2
5.
class Test {
public static void main(String[] args) {
String s1 = new String("123");
String s2 = new String("123");
}
}
Runtime Heap Summary: Test
==========================
Runtime Instance List
---------------------
Package Class Count Cumulative Count Memory Cumulative Memory
------- ----- ----- ---------------- ------ -----------------
Total 4 (100.0%) 4 (100.0%) 96 (100.0%) 96 (100.0%)
java.lang String 3 (75.0%) 3 (75.0%) 72 (75.0%) 72 (75.0%)
char[ ] 1 (25.0%) 1 (25.0%) 24 (25.0%) 24 (25.0%)
结论:相同字符串常量,即使在不同语句中被引用,其内存是共用的,"123"只生成一个字符数据和一个
String对象,两个new String()分别生成了一个对象。
6.
class Test
{
public static void main(String[] args)
{
String s1 = new String("123");
String s2 = new String("1234");
}
}
Runtime Heap Summary: Test
==========================
Runtime Instance List
---------------------
Package Class Count Cumulative Count Memory Cumulative Memory
------- ----- ----- ---------------- ------ -----------------
Total 6 (100.0%) 6 (100.0%) 144 (100.0%) 144 (100.0%)
java.lang String 4 (66.7%) 4 (66.7%) 96 (66.7%) 96 (66.7%)
char[ ] 2 (33.3%) 2 (33.3%) 48 (33.3%) 48 (33.3%)
结论:"123"和"1234"分别生成了各自的字符数组和String对象。两个new String()分别创建一个String对象。
做了一个测试,
long begin = System.nanoTime();
//String str = "abcdefghijklmnopqrstuvwxyz";
String str1 = new String("abcdefghijklmnopqrstuvwxyz");
long end = System.nanoTime();
System.out.println(end - begin);
创建str对象的时间是: 6426纳秒,创建str1的时间是:29334纳秒
采用new String()方式比直接赋值,效率上比第一个慢5~10倍(视机器配置)。从而验证了上面的结论。
字符串连接效率比较
/**
* 验证 + 和 StringBuffer还有StringBuilder的效率
*/
int count = 50;
String s = "t";
long begin = System.nanoTime();
for (int i = 0; i < count; i++) {
s += "t"+i;
}
long end = System.nanoTime();
System.out.println(end - begin);
StringBuffer sb = new StringBuffer();
begin = System.nanoTime();
for (int i = 0; i < count; i++) {
sb.append("t"+i);
}
end = System.nanoTime();
System.out.println(end - begin);
StringBuilder sbuild = new StringBuilder();
begin = System.nanoTime();
for (int i = 0; i < count; i++) {
sbuild.append("t"+i);
}
end = System.nanoTime();
System.out.println(end - begin);
/* Output:
233828
131022
120686
可以看到当每次连接的字符串不一样的时候,StringBuilder的效率最高,而+操作的效率最低,
如果每次连接的字符串相同的话,也是+操作最耗时。
/**
* 验证 + 和 StringBuffer还有StringBuilder的效率
*/
int count = 20;
String s = "test";
long begin = System.nanoTime();
for (int i = 0; i < count; i++) {
s += "test";
}
long end = System.nanoTime();
System.out.println(end - begin);
StringBuffer sb = new StringBuffer();
begin = System.nanoTime();
for (int i = 0; i < count; i++) {
sb.append("test");
}
end = System.nanoTime();
System.out.println(end - begin);
StringBuilder sbuild = new StringBuilder();
begin = System.nanoTime();
for (int i = 0; i < count; i++) {
sbuild.append("test");
}
end = System.nanoTime();
System.out.println(end - begin);
/* Output:
116495
20394
19276
发表评论
-
ConcurrentHashMap在jdk1.7和jdk1.8中的不同
2021-12-02 17:30 0https://blog.csdn.net/qq_418849 ... -
CallableAndFuture
2012-07-24 11:31 1175import java.util.concurrent.Cal ... -
CountDownLatch
2012-07-24 11:00 1175concurrent包里面的CountDownLatch其实可 ... -
认识理解Java中native方法
2011-11-02 16:35 2358Java不是完美的,Java的不足除了体现在运行速度 ... -
java 数组复制:System.arrayCopy 深入解析
2011-11-02 10:02 4169转载:http://happyjin2010.it ... -
equals hashcode 深度分析
2011-07-14 13:17 11471.hashcode是用来查找的,如果你学过数据结构就应该知道 ... -
java proxy
2011-07-12 16:31 938代理?就是别人帮你管理叫代理. 举个例子 你是家里的主人, ... -
关于 JVM 命令行标志您不知道的 5 件事(来自IBM)
2010-11-29 17:10 965JVM 是多数开发人员视为理所当然的 Java 功能和性能背后 ... -
关于 Java Collections API 您不知道的 5 件事,第 1 部分(转自IBM)
2010-11-29 16:58 983对于很多 Java 开发人员 ... -
java线程安全总结(转载jameswxx)
2010-11-29 12:50 1365最近想将java基础的一些 ... -
说说new Integer和Integer.valueOf(转载jameswxx)
2010-11-29 12:23 1640看看这两个语句 Integer a=new Integer ... -
优化JVM参数提高eclipse运行速度
2010-11-26 16:13 884性能优化从身边做起。 首先建立评估体系,将workspac ... -
主题:一次Java垃圾收集调优实战
2010-11-26 15:29 11281 资料 •JDK5.0垃圾收集优化之--Don't Paus ... -
通过GC输出分析内存泄露问题
2010-11-26 15:13 1023SIP5.0以后服务的请求量爆发性增长,因此也暴露了原来没有暴 ... -
15种提高系统伸缩性和性能的最佳实践
2010-11-25 16:00 9941, 提高系统性能, 需要尽早做性能剖析, 而且要经常做.当项 ... -
JVM调优总结(一)-- 一些概念
2010-11-25 15:00 891数据类型 Java虚拟机中,数据类型可以分为两类:基本 ... -
DCL,双重检查(来自annegu)
2010-09-05 16:25 928对于多线程编程来说, ... -
JVM原理学习笔记一
2010-06-11 16:22 905最近在阅读 《Inside the J ... -
ImportDataFromMySQLToOracle
2009-12-10 10:42 1342import java.sql.Connection; im ... -
Merge two Hashtable<String, Integer>
2009-12-03 14:50 1361private static Hashtable< ...
相关推荐
在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、StringBuffer和StringBuilder进行深入分析,了解它们之间...
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自有特定的使用场景和特性。理解这三个类的区别对于任何Java开发者,无论是初学者还是经验丰富的程序员,都是非常重要的...
String:字符串常量 StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...
在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...
String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的类,但它们之间存在显著的性能和功能差异。下面我们将深入探讨这三个类的区别。 首先,`String`类是Java中最基本的字符串类型,它表示...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...
最后,让我们总结一下 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别和用法。String 类型是不可变的对象,性能不好,适合不需要修改的字符串对象。StringBuffer 类型是可变的对象,性能好,...
Java中的字符串处理是编程中常见的任务,涉及到三个关键类:String、StringBuffer和StringBuilder。它们在功能上相似,但有着重要的区别,主要体现在字符串的可变性、线程安全性和性能方面。 1. 可变性 - String类...
"Java 中 String、StringBuffer 和 StringBuilder 的区别及用法" Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,了解它们之间的区别对 Java 开发者来说非常重要。本文将详细介绍这三者...
"Java 堆和栈的区别" Java 堆和栈是 Java 中的两种内存管理机制,它们都是 Java 用来在 RAM 中存放数据的地方。但是,它们有很多不同之处。 Java 堆是一个运行时数据区,类的对象从中分配空间。这些对象通过 new、...
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
在Java编程语言中,`CharSequence`是一个接口,它是字符序列的抽象基类,包括`String`、`StringBuffer`和`StringBuilder`等类。理解这些类的特点和用途是优化程序性能的关键。以下是对这些概念的详细解释: 1. `...
在Java编程语言中,`String`和`StringBuilder`都是用于处理字符串的重要类,但它们在处理方式和效率上有显著的区别。本资源中的代码是针对这两种类的效率进行测试的实例,旨在帮助开发者理解它们在不同场景下的性能...
在Java编程语言中,`StringBuffer` 和 `StringBuilder` 是两个重要的类,它们主要用于处理可变的字符串。这两个类在很多方面都非常相似,但存在一些关键的区别。 **一、StringBuffer和StringBuilder的区别** 1. **...
Java中的String、StringBuilder和StringBuffer类都是用于处理字符串的,但在不同的场景下,它们各有优缺点。本篇文章将深入分析这三个类的区别。 首先,我们来看它们的值可变性。String类是不可变的,这意味着一旦...
Java 中 String 和 StringBuffer 与 StringBuilder 的区别及使用方法 Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,每个类都有其特点和使用场景。在开发过程中,正确选择合适的字符串...