关于java中String的一点理解
??String类是java的最基本类之中的一个,非常好的掌握它的原理非常是必要的!
? 1、String的Final类型的。是不可继承 的。final类默认的方法都为final类型,保证了方法不能被重载。成员变量不影响
? 2、String的本质就是char[] 而且其值是不可改变的
? 3、String str = "abc"是一种特殊的创建方式,"abc"存在常量区,str仅仅是对其的引用
? 4、String能够通过+串联。形成一个新的对象
? 5、java执行时会维护一个String Pool。用来存放程序执行产生的字符串,而且里面的字符串不会反复
? 6、创建字符串的方式非常多,归纳起来有三类:
???? 其一。使用newkeyword创建字符串。比方String s1 = new String("abc");
??? ?其二,直接指定。
比方String s2 = "abc";
???? 其三,使用串联生成新的字符串。比方String s3 = "ab" + "c";?
?
public class MyString {
public static void main(String[] args) {
//关于String堆栈分析
String str1 = "abc";
System.out.println("abc" == str1);
/*1、在栈上分配内存存放str1
2、String池中开辟一块空间。存放String常量"abc";
3、str1指向String池中的"abc";
4、输出true
*/
String str2 = new String("abc");
System.out.println(str1 == str2);
/*1、栈上分配内存存放str2
2、此时的"abc"已经存在,然后将"abc"的引用传给String的构造函数。在堆上创建一个新的String对象
then the JVM still arranges for "abc" to be in that pool, and still
provides a reference to it, but that reference is then passed into a
constructor to create a NEW String object that‘s NOT in the pool and
copies the first one. It‘s that second String object which ends up
being assigned to the reference
3、str2指向在堆上的新创建的对象。
4、输出false
*/
String str3 = "a"+"bc";
System.out.println("abc" == str3);
/*1、栈上分配内存存放str3
2、依据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"abc"
3、str3指向在堆上的"abc"’
4、输出true
*/
String str4 = "a";
String str5 = "bc";
String str6 =str4+str5;
System.out.println("abc" == str6);
/*1) 栈中开辟一块中间存放引用s1,s1指向池中String常量"a"。
2) 栈中开辟一块中间存放引用s2。s2指向池中String常量"b",
3) 栈中开辟一块中间存放引用str5,
4) s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象,
5) 引用str6指向堆中(s1 + s2)所还原的新String对象,
6) str6指向的对象在堆中,而常量"ab"在池中,输出为false
*/
String str7 = new String("abc");
String str8 = new String("abc");
if(str7 == str8){
System.out.println("str7 等于str8");
}else{
System.out.println("str7 不等于str8");
}
//输出str7 不等于str8
}
}
?
原文地址:https://www.cnblogs.com/zhchoutai/p/8387509.html
时间: 2024-10-01 20:17:14
关于java中String的一点理解的相关文章
在只有try-catch语句中,如果catch块中出现了return语句或者抛出了异常,那么catch之后的语句是执行不到的:但是如果将代码放入finally中,即使catch中出现了return语句或者抛出了异常,finally中的代码仍然是可以执行到的.看下面的程序: public class Test { public static void main(String[] args) { // TODO Auto-generated method stub System.out.printl
Java中String的理解 最近在读String的源码,看了些String的文章,自己对String作了下总结记录下来. 1.String为什么是不可变的? String是final类,不可继承,其方法也不可被覆盖,避免从子类操纵父类属性:String的值保存在private final char[]数组中,本质是一个字符数组,私有则外部不可访问和修改,final引用则引用(或说引用的值)不变.引用可以简单地认为是堆上对象的首地址.String内部的private int hash,缓存has
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景.下面是本文的目录大纲: 一.你了解String类吗? 二.深入理解String.StringBuffer.StringBuilder 三.不同场景下三个类的性能测试 四.常见的关于
本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html 版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利 正文: 探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得
首先贴出测试用例: 1 package test; 2 3 import org.junit.Test; 4 5 /** 6 * Created by Administrator on 2015/9/16. 7 * 8 */ 9 public class TestString { 10 11 String str1 = "hello quanjizhu"; //若String pool中没有,则创建新对象,并放入String pool 12 String str2 =str1+&quo
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在Abstra
本篇文章介绍了,java中String与StringBuilder的区别. 相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE 5.0 里面带来的一个新的字符操作的类—— StringBuilder (先别忙着扔我砖头,我还算清醒,我这里说的不是 C #, Java 也有 StringBuilder 类).那么这个 StringBuilder 和
java中String类的使用频率非常高,本人在学习此模块时,认为下列几点知识值得注意: 一.String是不可变对象 java.lang.String类使用了final修饰,不能被继承.Java程序中的所有字面值,即双引号括起的字符串,如"abc",都是作为String类的实例实现的.String是常量,其对象一旦构造就不能再被改变.换句话说,String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创造了一个全新的String对象,以包含修改后的字符串内容.而最
Java中String的基础知识 ==与equal的区别 基本数据类型,指的是java中的八种基本数据结构(byte,short,char,int,long,float,double,boolean),一般的比较是使用的 ==,比较的是他们的值. 复合数据类型(类) ==比较的是两个对象的引用,可以理解为在内存中的地址,除非是同一个new出来的对象,他们的 ==为true,否则,都为false. equal是object中的方法.object中的实现如下,内部还是使用==实现,也就是说,如果一个