- 浏览: 185199 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (103)
- Java综合 (19)
- java模式 (1)
- java 包详解 (8)
- 需要阅读的书目 (1)
- Json (1)
- MySQL (2)
- zkoss (2)
- svn (1)
- JavaScript (1)
- html (1)
- 试题集锦 (6)
- 试题集锦_poj (1)
- Vim 操作 (2)
- Linux 操作 (5)
- NS2 学习 (2)
- 网络 (4)
- c/c++ (7)
- WNS - Wired Network Simulator (1)
- 网络信息体系结构 (16)
- MIPS (1)
- Java图形化编程 (2)
- 数据结构 (1)
- 数学 (3)
- 爬虫 (1)
- 搜索引擎 (1)
- NetFPGA (1)
- Directshow (1)
- 小软件 (2)
- FFMPEG (1)
- Windows Socket 网络编程 (5)
- Git (1)
- IntelliJ IDEA (0)
- Plone (1)
- Python (1)
最新评论
-
不要叫我杨过:
受教了,高手
Heritrix架构分析 -
springaop_springmvc:
apache lucene开源框架demo使用实例教程源代码下 ...
Lucene 3.0.2 使用入门 -
zxw961346704:
值得学习的算法
Java 计算器 -
medicine:
Thread.sleep(1000); 会使线程进入 TIM ...
Java.lang.Thread 和 Java.lang.ThreadGroup -
tangzlboy:
嗯,不错!收藏。
Java 入门
1. 正像很多人所说的那样,equals 和 == 是完全两个不同的概念,将两者进行比较是有点滑稽的,不过对于Java的String类型来说,又使得两者之间建立了一点点联系。 要弄明白不同的String类型变量使用 “==” 操作符的结果何时为TRUE,何时为FALSE,只要将以下几点弄明白就好:
1. == 比较的是地址的引用
2. Java中的String池概念
做了个例子,如下:
2. 栈(stack)与堆(heap)区别以及Java的string变量赋值的内部工作机制(精典转载贴)
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
3. Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.
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;
关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:
(1)先定义一个名为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');
本概念转自: http://primer-2004.iteye.com/blog/125434
3. String对象的创建
原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。
原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。
另外,String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到String池上。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
由于Java是不可变类,这可以在一定程度上提高String创建和使用的效率。
不可改变的字符串具有一个很大的优点:编译器可以把字符串设置为共享。不可变类String有一个重要的优点-它们不会被共享引用。
是这样的,JAVA为了提高效率,所以对于String类型进行了特别的处理---为string类型提供了串池。
定义一个string类型的变量有两种方式:
string name= "tom ";
string name =new string( "tom ")
使用第一种方式的时候,就使用了串池,
使用第二中方式的时候,就是一种普通的声明对象的方式。
如果你使用了第一种方式,那么当你在声明一个内容也是 "tom "的string时,它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname= "tom ",将会指向同一块内存
另外关于string类型是不可改变的问题:
string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如name= "madding "
那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个 "tom "没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。
1. == 比较的是地址的引用
2. Java中的String池概念
做了个例子,如下:
/** * String * equals() 比较的是内容 * == 比较的是引用 * 需要注意的是java的String池。 * 而且当一个String是由"常量的String"形成的,(如String s4 = "Mon" + "day"; s4会引用内存池中的"Monday"(如果存在的话)) * 该String会引用内存中的String(如果存在的话). * @author yuahan * */ public class _String { public static void main(String[] args) { String s1 = "Monday"; String s2 = "Monday"; System.out.println(s1 == s2); String s3 = new String("Monday"); System.out.println(s1 == s3); s3 = s3.intern();//当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 System.out.println(s1 == s3); String s4 = "Mon" + "day";//对于String的常量表达式,java 会判断在内存中生成了Mon 和 day 两个常量之后,合成s4时会检查是否已经存在 System.out.println(s1 == s4); String s5 = "Monday6"; String s6 = s1 + 6; final String s7 = "Monday"; System.out.println(s5 == (s7 + 6));//true System.out.println(s1 == "Monday"); System.out.println(s5 == ("Monday" + 6));//两个都是常量,故在编译时便能确定,导致引用相同 System.out.println(s5 == s6);//false System.out.println(s5 == (s1 + 6));//false System.out.println(s5 == ("Monday" + s1.length()));//后者是变量,只有在执行时才能确定,引用不同 System.out.println(s6 == ("Monday" + s1.length())); String animal1 = "animal1"; String animal2 = "animal" + "1".length(); System.out.println("equals? " + animal1 == animal2);// result is "false", not "equals? false". System.out.println("equals? " + (animal1 == animal2));// result is "equals? false". } }
2. 栈(stack)与堆(heap)区别以及Java的string变量赋值的内部工作机制(精典转载贴)
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
3. Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.
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;
关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:
(1)先定义一个名为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');
本概念转自: http://primer-2004.iteye.com/blog/125434
3. String对象的创建
原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。
原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。
另外,String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到String池上。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
由于Java是不可变类,这可以在一定程度上提高String创建和使用的效率。
不可改变的字符串具有一个很大的优点:编译器可以把字符串设置为共享。不可变类String有一个重要的优点-它们不会被共享引用。
是这样的,JAVA为了提高效率,所以对于String类型进行了特别的处理---为string类型提供了串池。
定义一个string类型的变量有两种方式:
string name= "tom ";
string name =new string( "tom ")
使用第一种方式的时候,就使用了串池,
使用第二中方式的时候,就是一种普通的声明对象的方式。
如果你使用了第一种方式,那么当你在声明一个内容也是 "tom "的string时,它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname= "tom ",将会指向同一块内存
另外关于string类型是不可改变的问题:
string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如name= "madding "
那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个 "tom "没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。
package com.java.lang; public class _String { public static void main(String[] args) { String str1 = "hello"; String str2 = "world"; String str3 = "helloworld"; String str4 = str1 + str2;//由于str1和str2是变量,编译时不能确定 str4指向的地址。 String str5 = "hello" + "world";//由于"hello" 和 "world"都是常量,编译时确定 str5指向的地址是跟str3一样的。 String str6 = "hello" + str2;//由于str2是变量,编译时不能确定 str6指向的地址。 String str7 = str1 + "world";//由于str1是变量,编译时不能确定 str7指向的地址。 System.out.println(str3 == str4);//false System.out.println(str3 == str5);//true System.out.println(str3 == str6);//false System.out.println(str3 == str7);//false } }
发表评论
-
applet 您的安全设置已阻止本地应用程序运行
2013-08-23 19:13 1787控制面板中把JAVA的安全设置调至最低,然后重启浏览器。 -
Failed to create the Java Virtual Machine
2010-10-31 11:14 1345今天启动Eclipse,告诉我“Failed to creat ... -
udp sender 精确到毫秒
2010-10-22 20:14 12801。源文件。 package sender; impor ... -
Java实现的9种排序方法
2010-10-22 14:46 1048详见代码。 package com.java.sort; ... -
Java的System.getProperty()方法可以获取的值
2010-09-29 16:14 927ava的System.getProperty()方法可以获取的 ... -
Java 执行系统文件
2010-09-29 14:59 1029以下两个事例是执行Windows下的命令或者可执行文件。 ... -
Java access control
2010-08-19 18:31 904Java中有4个访问级别(不同于C或者C++的3个)。但规则同 ... -
Java中需要注意的函数
2010-08-17 22:23 1044(持续更新中。。。) ... -
Java面试题
2010-08-08 18:39 862最近在网上看到很多Java ... -
Java 入门
2010-08-06 16:59 1836(转载 IBM DeveloperWorks) ... -
Java中的深拷贝与浅拷贝
2010-08-06 06:32 963在Java中,一个重要的,而且是每个类都有的方法,clone( ... -
Java 容器类
2010-08-06 05:05 861Java功能丰富的集 ... -
java 解惑 1
2010-08-05 22:06 1028_1.java package itepub.net._201 ... -
java5 新特性
2010-08-05 19:31 38361.静态导入方法 package c ... -
Comparator and Comparable in Java
2010-08-05 19:10 9521. java.lang.Comparable java ... -
Java中 synchronize、wait和notify3
2010-08-05 19:07 905package com.java.lang.thread. ... -
Java中 synchronize、wait和notify2
2010-08-05 19:06 1567有一个生产者消费者实例,修改了一下,觉得还行,javaeye上 ... -
Java中 synchronize、wait和notify
2010-08-05 18:53 2340认识Java一段时间了了,到目前为止还没有好好认识一下其中的s ...
相关推荐
简单总结可以下Java中String类中的常用方法
### Java中String类详解 #### 引言 在Java编程语言中,`String`类扮演着至关重要的角色,它用于表示字符序列。本文档旨在深入探讨`String`类的特性和功能,帮助开发者更好地理解和应用这一核心类。 #### String类...
### Java中String类的知识 #### 一、String 类概述与创建方式 在Java语言中,`String`类是用于表示不可变字符序列的核心类之一。它代表了一个字符串对象,一旦被初始化后,其内容不能被改变。这被称为不可变性...
根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...
Java中的String类是编程中非常基础且重要的一个类,它代表不可变的字符序列,即一旦创建,其内容就不能更改。下面我们将详细讨论String类的一些主要特性、实例化方式以及常用方法。 1. **String类的实例创建**: -...
java jdk中string类的源码 ,了解string类的书写,定义和声明
Java中的String类是编程中最常用的数据类型之一,它在处理文本数据时扮演着核心角色。String类位于java.lang包中,意味着它无需显式导入即可在任何Java程序中使用。由于字符串在Java中被视为不可变对象,即一旦创建...
Java 中的 String 类是 Java 编程语言中最基本的类之一,用于表示字符串。它在 java.lang 包中,是所有 Java 程序的默认一部分。String 类是不可变的,这意味着一旦创建了 String 对象,就不能更改它所包含的字符...
在Java编程语言中,String类是一个非常基础且重要的类,它代表不可变的字符序列。String类提供了多种方法,使得开发者能够方便地处理字符串。以下是对标题和描述中提到的Java String类方法的详细说明: 1. **构造...
在Java编程语言中,String类和StringBuffer类是处理字符串的两种主要方式,它们各自有不同的特性和适用场景。理解二者的区别对于编写高效、优化的代码至关重要。 1. **String类**: - **不可变性**:String类的...
Java中的String类是Java语言中最基础且至关重要的类之一,它代表不可变的字符序列。在Java中,字符串被广泛用于各种数据处理和文本操作。本文将深入探讨String类的一些关键方法及其用法。 首先,让我们看看String类...
### Java中String类的常用方法详解 在Java编程语言中,`String` 类是一个非常重要的类,用于表示不可变的字符序列。它提供了丰富的内置方法,使得开发人员能够轻松地处理字符串相关的操作。本文将详细介绍Java中`...
标题为"Java中String类(字符串操作)的10个常见问题和解决方法"的文档主要探讨了Java语言中字符串处理的核心类String的使用细节和最佳实践。以下是根据文档内容总结的知识点: 1. 字符串比较 在Java中,比较字符串...
在Java编程语言中,String类是使用最广泛的类之一,它代表不可变的字符序列。以下是对Java中String类的全面解析,包括其比较方式、字符串常量的本质、以及常用的字符串操作方法。 一、String的比较方式 在Java中,...
Java中的String类是编程面试和笔试中经常出现的考察点,因为它在日常开发中极其重要。下面我们将深入探讨几个关于String类的知识点。 1. **字符串对象的创建和比较** 在Java中,创建字符串有两种方式:直接赋值...
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`对象,其内容就不能更改。这使得`String`类在多线程环境中非常安全,同时也带来了一些性能上的...