- 浏览: 663238 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
平时 .NET 写多了, Java 很多东西都忘记了,前两天和同事聊天说到 equals 时谈到 Java 中的 String 时自己没能理清楚,唉,以前都研究过了,但还是忘了(头脑不行了),所以决定记在这里给自己长长脑子。
做 Java 时,我们可以发现对于 String 类型的实例化方式有以下两种:
· String str = “abc”;// 通过直接赋值的方式
· String str = new String(“abc”);// 通过构造方法完成
那么我们来看看这两种方式 Java 内部是如何处理的呢?
1 、直接赋值方式( String str = “abc” ):
2、通过构造方式(String str = new String(“abc”)):
通过上面的内存关系图可以发现通过构造方法实例化时程序开辟了两个空间,与直接赋值的方式相比,要浪费内存空间,所以可以总结出String实例化优先考虑使用直接赋值的方式。
那么通过上面的String堆栈我们又可以引伸出String的比较方式“==”和“equals”,我们以下面的一个简单的范例来说明问题:
public static void main(String[] args) { String str1 = "hello"; // 使用直接赋值的方式完成 String str2 = new String("hello"); // 通过构造方法完成 String str3 = str2; // 通过构造方法完成 System.out.println("str1 == str2 --> " + (str1 == str2)); // false System.out.println("str1 == str3 --> " + (str1 == str3)); // false System.out.println("str2 == str3 --> " + (str2 == str3)); // true System.out.println("str1.equals(str2)-->" + str1.equals(str2));// true System.out.println("str1.equals(str3)-->" + str1.equals(str3));// true System.out.println("str2.equals(str3)-->" + str2.equals(str3));// true }
分析:对上面程序进行内存划分
说明:
我们来看看“ == ”与“ equals ”分别指的是什么?
·“ == ”:比较的是两个对象的地址是否相等,具体的来说就是比较地址的值,因地址是以数值的形式存在的;
·“ equals ”:比较的是两个字符串的内容;
以下是很早以前从网上找的关于 Java 内存划分的说明
1、 寄存器:最快的存储区,由编译器根据需求进行分配,而我们在程序中是无法控的;
2 、栈:存放基本类型的变量数据和对象引用,但对象本身不存放在栈中,而是存放在堆中( new 出来的对象)或者常量池中(字符串常量对象存放在常量池中);
栈的说明:
当在一段代码块定义一个变量时, Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后, Java 会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用;
栈的优缺点:
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量( ,int, short, long, byte, float, double, boolean, char )和对象句柄。
范例:关于存在栈中的数据可以共享
假设我们同时定义:
int a = 3;
int b = 3 ;
编译器先处理 int a = 3 ;首先它会在栈中创建一个变量为 a 的引用,然后查找栈中是否有 3 这个值,如果没找到,就将 3 存放进来,然后将 a 指向 3 。接着处理 int b = 3 ;在创建完 b 的引用变量后,因为在栈中已经有 3 这个值,便将 b 直接指向 3 。这样,就出现了 a 与 b 同时均指向 3 的情况。这时,如果再令 a=4 ;那么编译器会重新搜索栈中是否有 4 值,如果没有,则将 4 存放进来,并令 a 指向 4 ;如果已经有了,则直接将 a 指向这个地址。因此 a 值的改变不会影响到 b 的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况 a 的修改并不会影响到 b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
3 、堆:存放所有 new 出来的对象和数组
堆的说明:
在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量 , 这里引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象;
堆的优缺点:
Java 的堆是一个运行时数据区 , 类的对象从中分配空间。这些对象通过 new 、 newarray 、 anewarray 和 multianewarray 等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的, Java 的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
4 、静态域:存放静态成员( Static 定义的);
5 、常量池:存放字符串常量(注:此处本人只能确定肯定有字符串常量,对于其他本人不确定,待定中… . ,网上也有说可以存放基本类型常量 public static final );
常量池的说明:
当然常量池中的对象可以共享,对于堆中的对象不可以共享,还有一点就是对于 equals 相等的字符串,在常量池中永远只有一份,而在堆中是有多份的;
6 、非 RAM 存储:硬盘等永久存储空间;
补充:
栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性
int i1 = 9; int i2 = 9; int i3 = 9; public static final int INT1 = 9; public static final int INT2 = 9; public static final int INT3 = 9;
package org.lxh.test; class BirthDate { private int day; private int month; private int year; public BirthDate(int d, int m, int y) { day = d; month = m; year = y; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } } public class Test{ public static void main(String args[]) { int date = 9; Testtest = new Test (); test.change(date); BirthDate bd = new BirthDate(7, 8, 98); System.out.println(bd.getDay() + "、" + bd.getMonth() + "、" + bd.getYear()); } public void change(int i) { i = 1234; } }
1). main方法开始执行:int date = 9;
date局部变量,基础类型,引用和值都存在栈中。
2). Test test = new Test();
test为对象引用,存在栈中,对象(new Test())存在堆中。
3). test.change(date);
i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。
4). BirthDate d1= new BirthDate(7,7,1970);
d1为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
5).main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。
发表评论
-
log4j xml配置详解
2014-06-18 10:37 1099<?xml version="1.0&qu ... -
test
2013-07-29 09:16 0private static CacheImpl insta ... -
多文件上传 by MultipartFile and Multiple
2012-12-03 09:13 14297最近的一个项目中,需要用到 ... -
布局框架-SiteMesh
2012-11-30 08:57 2545最近在一个项目中使用 ... -
Servlet
2012-12-07 08:36 1499一、认识 Servlet : ... -
连接池
2012-12-10 08:42 1396... -
Eclipse中右键快速定位文件资源的工具
2012-11-09 08:43 1951当你开发.NET项目后,使用VS习惯了再来使用Java和Ecl ... -
Java中MessageFormat对象实现格式化字符串输出,类似C#中的string.format方法
2012-09-29 11:39 3624平时.NET做多了,再做Java时,总会进行一些比较,比如说J ... -
byte[]与InputStream互转
2012-09-29 11:39 1529InputStream转byte[] private ... -
统一中英文长度问题
2012-07-20 00:17 1894最近因为在做一个项目要求很多都是英文,所以这就涉及到在页 ... -
Java中Process的waitFor()阻塞问题
2012-07-21 01:00 8845在做视频转换时,调用外部的 exe 去进行一些视频 ... -
Tomcat注册成系统服务
2012-07-17 00:00 1514为了部署项目后不出现黑色的 doc 命令框,所以很 ... -
urlrewrite实现伪静态化
2012-07-25 00:41 3174产生背景 静态网页与动态网页比较: ... -
Java中java.util.Date时间和java.sql.Date时间的相互转化
2012-01-30 22:49 2908刚刚写用 JS 禁用退格键时( http ... -
使用BeanUtils类简化request和resultset转换
2012-01-21 20:23 2888当提交表单时,如果没有使用Struts等框架的话,你的代 ... -
JDBC的多条件动态查询
2012-01-19 11:05 7101前面我已经提到了现在的项目无非就是列表里的分页加多条件查 ... -
JDBC分页
2012-01-19 10:15 5473不知道大家做项目做到最后有什么感觉没有,其实大家做来做去 ... -
Java农历(阴历)工具类
2012-01-20 11:30 2302在真实的项目开发中会可能会遇到项目需要对阴历即我们所说的农历节 ... -
Eclipse中java项目引用dll库的路径设置(System.loadLibrary()调用Dll路径问题)
2012-01-16 14:13 4202右击项目名|选择属性properties|在左边列表内选择“J ... -
联系人导出(msn、邮箱)
2012-01-16 11:48 8308在项目开发中,不知道大家有没有涉及到导出邮箱或msn的联系人( ...
相关推荐
5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5....
java String 使用详解,看完对String 的用法完全掌握
java中String类型转换方法.pdf
Java String与Byte类型转换;用到网络编程.
java String 编写的数据结构,一些基本的函数应用,适合初学者
java基础String类选择题练习题,文档包含了答案与分析,适合学习用,本文档仅仅用于学习分享,不得用于商业用途
java编程中对字符串的各种方式的处理,包括(空字符串处理、判断是否是空字符串 null和"" 都返回 true、 把string array or list用给定的符号symbol连接成一个字符串、 判定第一个字符串是否等于的第二个字符串中的某...
java字符串转String数组简单实例,简单但很实用
在JDK1.5中,String类增加了一个非常有用的静态函数format(String format, Objece... argues),可以将各类数据格式化为字符串并输出。其中format参数指定了输出的格式,是最复杂也是最难掌握的一点,而argues则是一...
java String 与各种进制字符之间的转换
Java String对象的经典问题,有关String类的介绍
Java 之 String 类型Java 之 String 类型
Java中经常用到的String类方法。这些都是比较常用的。欢迎下载!
Java技术:Java String常见问题解析
本文主要介绍了java String类常用方法的例子,具有很好的参考价值,下面跟着小编一起来看下吧
java jdk中string类的源码 ,了解string类的书写,定义和声明
83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中...
85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中...
内含简单的java String 类方法,简单的继承 接口以及Scanner类的使用实例
讲解java中的String和StringBuffer的基本应用