- 浏览: 335209 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
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 854发邮件需要用到mail.jar包 import ja ... -
PropertyChangeSupport的使用
2012-12-20 14:06 2689import java.beans.PropertyCh ... -
JVM运行时数据区的划分
2012-11-28 09:20 837虚拟机运行时数据区 ... -
威风威风
2012-11-20 11:26 10641. //a 不 ... -
Http基本认证
2012-10-29 15:20 973在HTTP中,基本认证是一种用来允许Web浏 ... -
如何获取美国时间
2012-10-26 10:41 2560TimeZone tz=TimeZone.getT ... -
base64加密算法简介
2012-10-23 11:32 1049什么是base64呢? 它是一种加密 ... -
比较器comparator
2012-10-11 10:46 778排序的规律跟方法的参数顺序有关。 该接口有个方法:in ... -
文件输入输出时的编码问题
2012-10-09 16:38 1038Java读取文件的 ... -
java源文件编码问题
2012-10-09 16:00 4635Java编译器在对 ... -
在java中利用ant对目录进行压缩
2012-08-31 17:05 886import java.io.File; impo ... -
File类中几个经常用到的方法
2012-07-30 16:02 2511一、File类的一些常用方法: 1.create ... -
文件读写例子
2012-07-07 10:19 965import java.io.BufferedReade ... -
私有成员的访问
2012-06-21 09:50 818不通过getXXX()方法获取类的私有域: public c ... -
jar文件
2012-05-31 23:41 917JAR(Java Archive,Java 归档文件) ... -
mvel的使用
2012-05-23 16:03 10535MVEL is a powerful expressi ... -
NotePad++的格式编码
2012-04-25 10:01 11954notepad默认存储文件的格式是ansi格式,如果想修改,可 ... -
字符编码概述
2012-04-24 23:59 763ASCII码 我们知道,在计 ... -
http协议的消息头
2012-04-18 17:25 2633一、HTTP消息头主要分为 ... -
HTTP协议详解
2012-04-18 17:17 935一、简介 1.http默认端口号为80,Https的端 ...
相关推荐
java字符串 详解 java实例20java字符串 详解 java实例20
MS_SQL_Server_数据库连接字符串详解
⼊门第三课 ⼊门第三课Python中的变量,及数字、字符串详解 中的变量,及数字、字符串详解 ⼀、我们先以⼀道常见的⼩学数学题作为例⼦: 3x=6,那么x等于多少? 这⾥的x就成为"变量"。说⽩了就是⼀个"可变的"这么⼀...
JAVA数组与字符串详解[借鉴].pdf
Python教程-字符串详解及序列类型.pdf
EditPlus正则表达式替换字符串详解.txt,经过搜索总结而成,很全面的哦。
内容讲解了Java的字符串实现String和StringBuffer,以及对应的方法,同时包含讲解的测试例子。
用sprintf把整数打印到字符串中,控制浮点数打印格式,连接字符串,以及sprintf返回值的使用。
Mathematica 作为一套先进的计算平台,在国内普及的程度远远不如matlab,这与它的参考资料稀少有关,这个文档详细介绍了Mathematica 的字符串的操作方式,可作为使用Mathematica的进阶教程使用。
。。。
。。。
本篇文章主要介绍了Python变量和字符串的相关资料。具有很好的参考价值。下面跟着小编一起来看下吧
string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置。找到返回子...
字符串问题详解,字符串匹配,Trie树,KMP,AC自动机,Trie图详细过程,ACM字符串入门及进阶
主要介绍了java & Android 格式化字符串详解的相关资料,需要的朋友可以参考下
字符串CString 操作用法详解,很详细的运用实例讲解CString字符串的各个操作用法。
主要介绍了nodejs中转换URL字符串与查询字符串详解,需要的朋友可以参考下
详解C++中十六进制字符串转数字(数值) 主要有两个方法,其实都是对现有函数的使用: 方法1: sscanf() 函数名: sscanf 功 能: 从字符串格式化输入 用 法: int sscanf(char *string, char *format[,...
oracle连接字符串: class:oracle.jdbc.driver.OracleDriver url:"jdbc:oracle:thin:@localhost:1521:jbitdb","epet","epet" sqlserver: class:com.microsoft.sqlserver.jdbc.SQLServerDriver url:"jdbc:sql...
模板字符串(template strings) ES6 中引进的一种新型的字符串字面量语法 – 模板字符串。书面上来解释,模板字符串是一种能在字符串文本中内嵌表示式的字符串字面量。简单来讲,就是增加了变量功能的字符串。 ES6为...