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=”“; 
正常的字符串初始化,只不过字符串内容为空。

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

  1. Java中String类型详解

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

  2. 【转载】 Java中String类型的两种创建方式

    本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...

  3. 关于JAVA中String类型的最大长度

    前些天看到一道面试题,题目很容易理解:String的长度限制是多少? 针对这个题目,浏览了网友的回答,大概得到了3个层次的答案. 最浅的层次: 近似计算机内存大小的长度.这是作为一个程序员最浅显的回答 ...

  4. Java中String类型的数据比较

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

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

    一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创 ...

  6. java中String类型的相关知识

    String类方法整理说明: ·Length()用来求字符串的长度,返回值为字符串的长度: ·charAt()取该字符串某个位置的字符,从0开始,为char类型: ·getChars()将这个字符串中 ...

  7. java中String类型

    string对象常用方法 string对象比较方法: string类获取包含子串的方法: 字符串和数字的转换: String类 String对象是不可改变的,字符串一旦创建,内容不能再改变. 构造字符 ...

  8. Java中String类型的部分用法

    1.如何将字符串转换为整型数值? int i = Integer.parseInt("20"); 2.如何用“==”还是equals比较两个字符串? “==”是用来比较俩引用是不是 ...

  9. java中String类型转换为float类型

    import java.io.*; public class Demo1{ public static void main(String args[]) { String df="12.2& ...

随机推荐

  1. Prometheus监控学习笔记之初识PromQL

    0x00 概述 Prometheus 提供了一种功能表达式语言 PromQL,允许用户实时选择和汇聚时间序列数据.表达式的结果可以在浏览器中显示为图形,也可以显示为表格数据,或者由外部系统通过 HTT ...

  2. 【题解】Luogu P4363 [九省联考2018]一双木棋chess

    原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ...

  3. 人机猜拳游戏Java

    作业要求: 我的代码: package day20181119;/** * 猜拳游戏 * @author Administrator * @version1.0 */import java.util. ...

  4. 13:python-ldap

    1.1 python-ldap 基本使用 11111111111111111111

  5. win-Linux文件脚本迁移过程中的问题 syntax error: unexpected end of file

    问题:  在win下写好的shell脚本,放到Linux上测试sh -n报错如下 ORA_check.sh: line 251: syntax error: unexpected end of fil ...

  6. opencv学习之路(18)、霍夫变换

    一.简介 在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确地检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Hough) ...

  7. gcc,make,cmake

    1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C.C++.Objective-C.Fortran.Java等等 ...

  8. 深刻理解Python中的元类(metaclass)以及元类实现单例模式

    在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍 ...

  9. Flask学习【第11篇】:整合Flask中的一些知识点

    SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sq ...

  10. linux内核中侧async_tx是什么?

    答: 异步内存传输api(asynchronous memory transfer/transform API),这是一种api,用来为应用提供操作DMA的API. 下图是async_tx在架构中所处 ...