Java中String类型细节

Java中String类型细节

一 . String两种初始化方式

1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效

在字符串缓冲区中检测”abc”是否存在 
若存在则不重复创建,将地址赋值给str1. 
若不存在,则在字符串缓冲区中创建对象并赋地址给str1.

2 . String str1= new String( “abc”); //构造函数初始化 
 或者 
 char [] ch={‘a’,’b’,’c’}; 
 String str1=new String (ch); 
先有 “abc” 对象,然后拷贝给构造函数创建的对象(相当于str1得到的是构造函数的副本)

String对象是不可变的,它的内容不能改变,而在程序中字符串频繁使用,为了提高效率,对具有相同字符串序列的字符串直接量使用同一个实例,这样的实例被称之为限定的(interned)

注意,第二种方式的参数只支持字符串直接量或字符数组创建,这种方式是错误的 String strA = “asd”; 
String strbB = new Strint(strA);

比较两种创建方式,第一种更高效,只创建了一个对象,第二种创建了两个对象。

二 . 初始化细节

栈中保存基本类型与对象的引用,基本类型在创建前会查看Stack中是否已经有, 有则赋值指向, 没有则创建。

String str1= “abc”; 
String str1= new String( “abc”);

前者首先在栈中创建一个引用型变量str1,然后查看栈中是否存在“abc”如果没有,则将“abc”存放进栈,并令引用变量str指向它;如果有,则直接令str1指向它;后者是java中标准的对象创建方式,其创建的对象将直接放置到堆中,每调用一次就会创建一个新的对象。

String str = “abc”+”def”; 
这条语句创建对象个数? 1个。 
编译器会自己调用Stringbuilder的append方法来合成abcdef,最后只生成一个对象.

实际上,字符串直接量属于常量,在编译的时候已确定,两个常量相加,先检测栈内存中是否有”abcdef” 如有有,指向已有的栈中的”abcdef”空间,若没有,则创建。

package stringDemo;

public class stringInitial
{

    public static void main(String[] args)
    {
    String str1 = "abc";
    String str2 = new String("abc");
    // String str2 = new String(new char[] { ‘a‘, ‘b‘, ‘c‘ });
    // String str2 = new String(str1);错误写法

    System.out.println(str1 == str2);// false
    System.out.println(str1.equals(str2));// true这里的equals()方法已经被覆盖,比较的是字符串不是地址

    String str3 = "123";
    String str4 = "abc123";
    String str5 = "abc" + "123";
    String str = str1 + str3;
    System.out.println(str4 == str5);// true
    System.out.println(str4 == str1+"123");// false
    System.out.println(str4 == str);// false

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

可以看出,只要是+中出现非字符串直接量,就会在堆中产生新的对象,并不会检测栈内存

三.关于String str=null;String str;String str=”“;

String str=null; 
声明了一个String的引用型变量并初始化为空,及未指向任何地址,不占用任何空间

String str; 
只是声明了一个String的引用型变量,并未初始化(作为对象属性时会有默认的隐式初始化str=null),如果后面未用此变量编译会通过

String str=”“; 
正常的字符串初始化,只不过字符串内容为空。

原文地址:https://www.cnblogs.com/andy-lehhaxm/p/9446312.html

时间: 2024-08-03 19:28:22

Java中String类型细节的相关文章

Java中String类型详解

这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...

java中String类型转换方法

integer to String : int i = 42;String str = Integer.toString(i);orString str = "" + idouble to String :String str = Double.toString(i);long to String :String str = Long.toString(l);float to String :String str = Float.toString(f);String to intege

(转)Java中String类型的参数传递问题

这篇文章主要介绍了简单谈谈Java中String类型的参数传递问题的相关资料,需要的朋友可以参考下 提要:本文从实现原理的角度上阐述和剖析了:在Java语言中,以 String 作为类型的变量在作为方法参数时所表现出的“非对象”的特性. 一.最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了.所以,在本文中首先以一个简单示例来抛出核心话题: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public clas

Java中String类型的参数传递问题的解析

一.引入示例 public class StringAsParamOfMethodDemo { public static void main(String[] args) { StringAsParamOfMethodDemo sapm = new StringAsParamOfMethodDemo(); sapm.testA(); } private void testA() { String originalStr = "original"; System.out.println

java中String类型

String类型是字符串类型.. 字符串一旦创建不可以在改变."abc"字符串对象一旦创建,不可以再改成"abcd" 提升字符串的访问效率:在程序中使用了"缓存"技术.所以在java中所有使用"双引号"括起来的字符串都会在"字符串常量池"中创建一份.字符串常量池在方法区中被存储. 在程序执行过程中,如果用到某个字符串,例如:"abc"那么程序救护在字符串常量池中去搜索该字符串,如果没有找

Java中String类型的数据比较

在Java中如果想比较两个字符串是否相等,可以使用string1==string2 或string1.equal(string2)来比较. 但是,第一种方法过于局限.例如, String string1="string": String string2="string": 此时,string1==string2的返回值为True. 但是,如果 String string1=new String("string"): String string2=

关于Java中String类型的问题

简单来说,"=="是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等.只要你项检测俩字符串是不是相等的,你就必须得用equals()方法. 如果你知道"字符串保留(string intern)"的概念那就更好了. 2. 为什么安全敏感的字符串信息用char[]会比String对象更好? String对象是不可变的就意味着直到垃圾回收器过来清扫之前它们都不会发生变化的.用数组的话,就可以很明确的修改它任何位置的字符元素.

Java中String类型的不可变性和驻留池

一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创建,其内在成员变量的值就不能被修改.其中String类就是不可变类的经典应用. 二 例子 package cn.xy.test; public class StringTest{ /**  * a的值在编译时就被确定下来,故其值"xy"被放入String的驻留池(驻留池在堆中)并被a指向.

好程序员Java教程分享Java中String类型的10个问题

如何比较两个字符串?用"="还是equals简单来说,"=="是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等.只要你想检测俩字符串是不是相等的,你就必须得用equals()方法. 如果你知道"字符串保留(string intern)"的概念那就更好了. 为什么安全敏感的字符串信息用char[]会比String对象更好?String对象是不可变的就意味着直到垃圾回收器过来清扫之前它们都不会发生变化