- 浏览: 340638 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
hjl0722:
...
Java中的异或 -
lucd:
f(New.<Person, List<Pet&g ...
第15章泛型 -
liujunhao225:
[Error: could not access: List; ...
mvel的使用 -
superscorpio:
public void testImportInContex ...
mvel的使用 -
yuyangtina:
哦,知道了,是继承的方法。谢谢你的分享。
HttpClient3.x发送Soap请求的方法
一、字符串的六道经典题
看明白了,基本上就掌握了字符串的原理了。
public class test1 {
/**
* @param args
*/
public static void main(String[] args){
String a = "a1";
String b = "a"+ 1;
System.out.println(a==b);
}//true
}
test2:
package StringTest;
public class test2 {
/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
String bb = "b";
String b = "a"+ bb; //编译器不能确定为常量
System.out.println(a==b);
}//false
}
test3:
package StringTest;
public class test3 {
/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
final String bb = "b";
String b = "a"+ bb; //bb加final后是常量,可以在编译器确定b
System.out.println(a==b);
}//true
}
test4:
package StringTest;
public class test4 {
/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
final String bb = getBB();
String b = "a"+ bb;//bb是通过函数返回的,虽然知道它是final的,但不知道具体是啥,要到运行期才知道bb的值
System.out.println(a==b);
}//false
private static String getBB(){ return "b"; }
}
test5:
package StringTest;
public class test5 {
/**
* @param args
*/
private static String a = "ab";
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;//+的用法
System.out.println(s == a);
System.out.println(s.intern() == a);//intern的含义
}//flase true
}
test6:
package StringTest;
public class test6 {
/**
* @param args
*/
private static String a = new String("ab");
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);
System.out.println(s.intern() == a);
System.out.println(s.intern() == a.intern());
}//flase false true
}
原因解析:
String str1 = "java";
String str2 = "blog";
String s = str1+str2;
System.out.print(s=="javablog");
原因很简单,JVM确实会对型如String str1 = "java"; 的String对象放在字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在运行时刻才能知道,也就是说str1+str2是在堆里创建的,s引用当然不可能指向字符串常量池里的对象。没崩溃的人继续看例子D。
另外,对字符串进行赋值时,假如右操纵数含有一个或一个以上的字符串引用时,则在堆中再建立一个字符串对象,返回引用;如String s=str1+ "blog"; 会在堆中创建对象。
二、创建了几个对象
现在分析String str = new String("abc");创建了几个String对象。很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象,一个是编译期,一个是运行期。
三、字符串的不可变性
String s1 = "s1";
String s2 = s1;
s2 = "s2";
s1指向的对象中的字符串是什么?
答案: "s1"。(永远不要忘了String不可变的,s2 = "s2";实际上s2的指向就变了,因为你不可以去改变一个String,)
Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",假如存在则直接将"abc"赋给str,假如不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(留意:新建的字符串"abc"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,由于新建字符串占用内存空间。String str = new String()创建了一个空字符串,与String str=new String("")相同。
String的不变性的机制显然会在String常量内有大量的冗余。如:"1" + "2" + "3" +......+ "n" 产生了n+(n+1)个String对象!因此Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。对String多么照顾啊!当编译器遇见String常量的时候,它检查该池内是否已经存在相同的String常量。如果找到,就把新常量的引用指向现有的String,不创建任何新的String常量对象。
四、怎么检查字符串在字符串常量池中
public static boolean inPool(String s) {
String s2 = s.intern();
if (s2 == s)
return true;
return false;
}
五、intern方法的作用
当调用 intern 方法时,假如池已经包含一个即是此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
看明白了,基本上就掌握了字符串的原理了。
public class test1 {
/**
* @param args
*/
public static void main(String[] args){
String a = "a1";
String b = "a"+ 1;
System.out.println(a==b);
}//true
}
test2:
package StringTest;
public class test2 {
/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
String bb = "b";
String b = "a"+ bb; //编译器不能确定为常量
System.out.println(a==b);
}//false
}
test3:
package StringTest;
public class test3 {
/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
final String bb = "b";
String b = "a"+ bb; //bb加final后是常量,可以在编译器确定b
System.out.println(a==b);
}//true
}
test4:
package StringTest;
public class test4 {
/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
final String bb = getBB();
String b = "a"+ bb;//bb是通过函数返回的,虽然知道它是final的,但不知道具体是啥,要到运行期才知道bb的值
System.out.println(a==b);
}//false
private static String getBB(){ return "b"; }
}
test5:
package StringTest;
public class test5 {
/**
* @param args
*/
private static String a = "ab";
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;//+的用法
System.out.println(s == a);
System.out.println(s.intern() == a);//intern的含义
}//flase true
}
test6:
package StringTest;
public class test6 {
/**
* @param args
*/
private static String a = new String("ab");
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);
System.out.println(s.intern() == a);
System.out.println(s.intern() == a.intern());
}//flase false true
}
原因解析:
String str1 = "java";
String str2 = "blog";
String s = str1+str2;
System.out.print(s=="javablog");
原因很简单,JVM确实会对型如String str1 = "java"; 的String对象放在字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在运行时刻才能知道,也就是说str1+str2是在堆里创建的,s引用当然不可能指向字符串常量池里的对象。没崩溃的人继续看例子D。
另外,对字符串进行赋值时,假如右操纵数含有一个或一个以上的字符串引用时,则在堆中再建立一个字符串对象,返回引用;如String s=str1+ "blog"; 会在堆中创建对象。
二、创建了几个对象
现在分析String str = new String("abc");创建了几个String对象。很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象,一个是编译期,一个是运行期。
三、字符串的不可变性
String s1 = "s1";
String s2 = s1;
s2 = "s2";
s1指向的对象中的字符串是什么?
答案: "s1"。(永远不要忘了String不可变的,s2 = "s2";实际上s2的指向就变了,因为你不可以去改变一个String,)
Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",假如存在则直接将"abc"赋给str,假如不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(留意:新建的字符串"abc"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,由于新建字符串占用内存空间。String str = new String()创建了一个空字符串,与String str=new String("")相同。
String的不变性的机制显然会在String常量内有大量的冗余。如:"1" + "2" + "3" +......+ "n" 产生了n+(n+1)个String对象!因此Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。对String多么照顾啊!当编译器遇见String常量的时候,它检查该池内是否已经存在相同的String常量。如果找到,就把新常量的引用指向现有的String,不创建任何新的String常量对象。
四、怎么检查字符串在字符串常量池中
public static boolean inPool(String s) {
String s2 = s.intern();
if (s2 == s)
return true;
return false;
}
五、intern方法的作用
当调用 intern 方法时,假如池已经包含一个即是此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
发表评论
-
java发邮件
2013-05-07 16:55 881发邮件需要用到mail.jar包 import ja ... -
PropertyChangeSupport的使用
2012-12-20 14:06 2743import java.beans.PropertyCh ... -
JVM运行时数据区的划分
2012-11-28 09:20 860虚拟机运行时数据区 ... -
威风威风
2012-11-20 11:26 10931. //a 不 ... -
Http基本认证
2012-10-29 15:20 1004在HTTP中,基本认证是一种用来允许Web浏 ... -
如何获取美国时间
2012-10-26 10:41 2615TimeZone tz=TimeZone.getT ... -
base64加密算法简介
2012-10-23 11:32 1084什么是base64呢? 它是一种加密 ... -
比较器comparator
2012-10-11 10:46 809排序的规律跟方法的参数顺序有关。 该接口有个方法:in ... -
文件输入输出时的编码问题
2012-10-09 16:38 1066Java读取文件的 ... -
java源文件编码问题
2012-10-09 16:00 4661Java编译器在对 ... -
在java中利用ant对目录进行压缩
2012-08-31 17:05 912import java.io.File; impo ... -
File类中几个经常用到的方法
2012-07-30 16:02 2539一、File类的一些常用方法: 1.create ... -
文件读写例子
2012-07-07 10:19 988import java.io.BufferedReade ... -
私有成员的访问
2012-06-21 09:50 846不通过getXXX()方法获取类的私有域: public c ... -
jar文件
2012-05-31 23:41 1021JAR(Java Archive,Java 归档文件) ... -
mvel的使用
2012-05-23 16:03 10605MVEL is a powerful expressi ... -
NotePad++的格式编码
2012-04-25 10:01 11985notepad默认存储文件的格式是ansi格式,如果想修改,可 ... -
字符编码概述
2012-04-24 23:59 798ASCII码 我们知道,在计 ... -
http协议的消息头
2012-04-18 17:25 2661一、HTTP消息头主要分为 ... -
HTTP协议详解
2012-04-18 17:17 987一、简介 1.http默认端口号为80,Https的端 ...
相关推荐
本实例“Java字符串详解 Java实例20”将深入探讨Java中的字符串处理机制,包括其创建、操作以及性能优化等方面的知识。 一、字符串的创建与初始化 在Java中,字符串是对象,它们被封装在`String`类中。字符串可以...
Python 字符串详解及序列类型 Python 中的字符串是我们在程序中使用非常多的一个对象,对于字符串的处理在各种编程语言中也是非常重要的一部分。 字符串定义 在 Python 中,字符串可以使用单引号、双引号或者三个...
格式化数字字符串详解(sprintf) sprintf 函数是 C 语言中一个强大的格式化数字字符串函数,可以将整数打印到字符串中,控制浮点数打印格式,连接字符串,等等。 格式化数字字符串 sprintf 函数最常见的应用之一...
### EditPlus正则表达式替换字符串详解 #### 正则表达式基础介绍 正则表达式是一种用于匹配、查找和替换字符串的强大工具。在文本处理领域有着广泛的应用,尤其是在编程语言中,它可以帮助我们高效地处理各种文本...
接字符串属性时,可以使用 `true`、`false`、`yes` 或 `no`,它们之间是等价的。MS SQL Server 数据库连接字符串是用于建立与 SQL Server 数据库实例连接的重要配置,包含了多种参数以确保正确和安全地访问数据库。 ...
内容讲解了Java的字符串实现String和StringBuffer,以及对应的方法,同时包含讲解的测试例子。
### Python变量和字符串详解 #### 一、变量 在Python编程中,变量是最基本的数据存储单元,用于存储各种类型的数据,如数字、字符串等。在Python中声明变量非常直观,无需提前指定变量类型,直接赋值即可。 #####...
C++中的字符串处理是编程中常见且重要的任务,涉及到数据的读取、处理和输出。在C++中,字符串通常以字符数组的形式存在,而C++标准库提供了多个函数来帮助我们有效地操作这些字符串。 首先,`strcpy()`函数用于...
C++字符串是编程中不可或缺的一部分,它用于存储和操作文本数据。C++提供了多种方法来创建、修改和处理字符串,这些方法包括标准库中的C风格字符串函数和STL中的`std::string`类。以下是对这些知识点的详细解释: #...
Mathematica 作为一套先进的计算平台,在国内普及的程度远远不如matlab,这与它的参考资料稀少有关,这个文档详细介绍了Mathematica 的字符串的操作方式,可作为使用Mathematica的进阶教程使用。
### 各种数据库链接字符串详解 #### 一、概述 在进行数据库开发的过程中,数据库连接字符串是必不可少的一部分。本文将详细介绍几种常见的数据库连接字符串及其配置参数。这些数据库包括:DBase 5.0、DBASE IV、...
### Java数组和字符串详解 #### 实验目标与背景 本次实验旨在深化理解Java中的数组与字符串操作,聚焦于`String`类与`StringBuffer`类的掌握,包括它们的常用方法、相等性判断的不同方式、数组的创建及引用机制,...
### Python3字符串详解 #### 一、字符串简介 在Python3中,字符串是最常用的数据类型之一,用于存储一系列字符。字符串可以通过单引号('')或双引号("")创建。例如: ```python var1 = 'HelloWorld!' var2 = ...
按键精灵字符串函数详解 本文档详细介绍了按键精灵字符串函数的使用方法和应用场景,涵盖了 Sqr、Asc、Chr、Hex、InStrRev、Join、LCase、Left、Len、LTrim、RTrim、Trim、Mid、Replace、Right、Space 和 StrComp ...
### 连接字符串详解 连接字符串是ADODB.Connection对象与特定数据源建立连接的关键参数集合。它通常包含以下几种类型的参数: - **Provider**: 指定数据源的提供者,如SQL Server、Oracle等。 - **DataSource**: ...
### MFC字符串CString操作用法详解 #### 一、引言 Microsoft Foundation Classes (MFC) 是一套由微软开发的类库,它封装了Windows API,使得开发者可以更方便地进行Windows应用程序的开发。其中,`CString`是MFC中...
#### 二、连接字符串详解 连接字符串是用于指定应用程序如何连接到数据库的一组参数。对于 SQL Server 来说,连接字符串通常由一系列属性/值对组成,每个属性/值对之间用分号隔开。例如: ``` DataSource=...
### ASP.NET Oracle连接字符串详解 在开发基于ASP.NET的应用程序时,经常需要与Oracle数据库进行交互。为了确保数据能够正确地被读取、写入,一个正确的连接字符串至关重要。本文将详细探讨如何设置一个适用于ASP...
在C++编程中,`std::string`是一个非常重要的数据类型,用于表示和操作字符串。本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理...