便宜网站建设 优帮云,wordpress 钉钉,网站登录注册怎么做,产品开发的流程和步骤String类的概述
String类#xff1a;代表字符串。 Java 程序中的所有字符串字面值#xff08;如 “abc” #xff09;都作 为此类的实例实现。
String是JDK中内置的一个类#xff1a;java.lang.string 。 String表示字符串类型#xff0c;属于引用数据类型#xff0c;不…String类的概述
String类代表字符串。 Java 程序中的所有字符串字面值如 “abc” 都作 为此类的实例实现。
String是JDK中内置的一个类java.lang.string 。 String表示字符串类型属于引用数据类型不属于基本数据类型 。 String 类 创建出来的 对象 也就是 String对象 。 String是一个final类代表不可变的字符序列。 字符串是常量用双引号引起来表示。它们的值在创建之后不能更改。 String对象的字符内容是存储在一个字符数组value[]中的。
创建String
日常创建String对象使用的就是 2种方式
字面量方式 什么是字符串字面量一个字符串字面量就是两个双引号之间的字符序列形如“张三”、“zs”。
String str1字面量;✨new 的方式
String str2 new String(new);因为String 是引用数据类型 所以str1str2 都是 String 引用数据类型的变量 。这两个String类型的变量存在栈里面
栈 (stack)
存储变量str1str2
栈 (stack)
是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{…}括起来的区域).函数中定义的基本类型变量对象的引用变量都在函数的栈内存中分配。栈内存特点数数据一执行完毕变量会立即释放节约内存空间。栈内存中的数据没有默认初始化值需要手动设置。 然后String 类 创建的对象也就是 new String(“new”), 也是需要有东西存。这些东西存在堆里面 堆heap 堆内存用来存放new创建的对象和数组。 堆内存中所有的实体都有内存地址值。 创建String对象的2种方式存储情况: new String(“ACV”) 存在堆里面。 String str1“JCccc”; 也是在堆里面但是是在堆里面的字符串常量池里面。 现在的java版本是 jdk 8不考虑字符串常量池的一个位置演变过程了明确知道一点jdk7之后字符串常量池在堆里面 字符串常量池jdk7之后
为什么明明说好了 堆是用来存对象的为什么又搞个字符串常量池 也是存对象
是的JAVA 设计者确实是这样设计的。
为什么有字符串常量池 因为我们会发现 String这个引用类型用起来基本跟其他八个基本类型 byte、char、short、int、long、float、double、boolean没有什么区别甚至String还用的更多。 而且String对象对象的使用分配要付出时间和空间上的开销。 既然用的这么勤我们如果搞一个缓存池给这个String 分配过的不再分配不再开销 是不是就能提升性能更加合理 所以字符串常量池出来了。 什么东西能存到字符串常量池
String 对象 通过字面量赋值的能进去 例如 String str“张三” 再回顾一下 什么是字符串字面量一个字符串字面量就是两个双引号之间的字符序列形如“张三”、“abc”。 还有就是 通过 String提供的方法 intern 可以将字符串丢进去常量池里面。 调用intern方法时如果池已包含 等于此 string 对象的字符串通过由使用equals方法则返回池中的字符串的对象引用。 否则此Stringobject将添加到池中 并返回对该String对象的引用。 理解String的不可变性
import org.junit.Test;
//String的使用
public class StringTest {/*String:字符串使用一对引起来表示。1.String声明为final的不可被继承2.String实现了Serializable接口表示字符串是支持序列化的。实现了Comparable接口表示String可以比较大小3.String内部定义了final char[] value用于存储字符串数据4.String:代表不可变的字符序列。简称不可变性。体现1.当对字符串重新赋值时需要重写指定内存区域赋值不能使用原有的value进行赋值。2. 当对现有的字符串进行连接操作时也需要重新指定内存区域赋值不能使用原有的value进行赋值。3. 当调用String的replace()方法修改指定字符或字符串时也需要重新指定内存区域赋值不能使用原有的value进行赋值。5.通过字面量的方式区别于new给一个字符串赋值此时的字符串值声明在字符串常量池中。6.字符串常量池中是不会存储相同内容的字符串的。*/Testpublic void test1(){String s1 abc;//字面量的定义方式String s2 abc;s1 hello;System.out.println(s1 s2);//比较s1和s2的地址值,falseSystem.out.println(s1);//helloSystem.out.println(s2);//abcSystem.out.println(*****************);String s3 abc;s3 def;System.out.println(s3);//abcdefSystem.out.println(s2);System.out.println(*****************);String s4 abc;String s5 s4.replace(a, m);//将a替换成mSystem.out.println(s4);//abcSystem.out.println(s5);//mbc}
}String s1 abc;
//首次声明在方法区的字符串常量池中新造abc
//栈中S1指向字符串常量池中的abc
String s2 abc;
//声明S2时会先在常量池中寻找是否有abc有的话将地址赋给S2
s1 hello;
//再次为S1赋值新造hello将S1的指针指向helloString不同实例化方式的对比
String对象的创建
String str hello;//本质上this.value new char[0];
String s1 new String();//this.value original.value;
String s2 new String(String original);//this.value Arrays.copyOf(value, value.length);
String s3 new String(char[] a);String s4 new String(char[] a,int startIndex,int count);/*String的实例化方式方式一通过字面量定义的方式方式二通过new 构造器的方式面试题String s new String(abc);方式创建对象在内存中创建了几个对象两个:一个是堆空间中new结构另一个是char[]对应的常量池中的数据abc*/Testpublic void test2(){//通过字面量定义的方式此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。String s1 javaEE;String s2 javaEE;//通过new 构造器的方式:此时的s3和s4保存的地址值是数据在堆空间中开辟空间以后对应的地址值。String s3 new String(javaEE);String s4 new String(javaEE);System.out.println(s1 s2);//trueSystem.out.println(s1 s3);//falseSystem.out.println(s1 s4);//falseSystem.out.println(s3 s4);//falseSystem.out.println(***********************);Person p1 new Person(Tom,12);Person p2 new Person(Tom,12);System.out.println(p1.name.equals(p2.name));//trueSystem.out.println(p1.name p2.name);//true//name的地址指向方法区p1.name Jerry;System.out.println(p2.name);//Tom}