String的存储过程

  我们知道字符有两种初始化方式:

     String s1 = “abc”;

     String s2 = new  String("def");

  这两种有什么区别呢?这时就需要我们看看String的在内存中是怎么存储的了。我们先看下面的图了解其在内存在是怎么存储的:

  首先是 String s1 = “abc”;它首先会去常量池去检查是否存在“abc“,如果存在就返回,否则就创建。“abc”的地址给了s1,s1指向了它。而String s2 = new  String("def");它会先去堆内存中去创建一个new String()对象,然后去常量池检查是否存在"def" 如果存在就返回,否则创建。“def”的地址给了new String(),而new String()自给有一个地址给了s2。这就是字符串的基本存储过程。

  接下来我们看看字符串的一个重要特性:字符串是常量,它们的值在创建之后不能更改。

  如下面一段代码

  

public class TestString {
    public static void main(String[] args) {
        String s = "abc";
        s+="def";
        System.out.println(s);
    }

}

  根据上面的分析我们可以知道 s 最开始是指向"abc",后面 s+="def"做个一个字符串拼接,而在内存中并没有直接把"def”拼接在“abc”上,而是先开辟了空间存储“def”,最后把abcdef拼接在一起,开辟了第三块空间。通过这个例子我们可以知道不能变的是字符串的值,即“abc”不能改变,而引用是可以改变的。所以最后 s打印出来的值变了,并不是“abc”发生了变化,而是s指向了新的对象“abcdef”。

  接下来我们可以通过1个例子看看

public class TestString {
    public static void main(String[] args) {
        String s1 = "abc";     String s2 = "abc"
        String s3 = new String("abc");     System.out.println(s1==s2)
        System.out.println(s1==s3);
        System.out.println(s1.equals(s3));

    }

}

  首先我们要知道==和equals的区别,==比较的是地址,而equals默认比较也是地址,而String重写了equals()方法,比较的是值是否相同。根据上面的理解我们画出内存图

根据上图我们知道了 String s1 = "abc";首先会在常量池中创建“abc”,s1指向此对象,而 String s2 = "abc"首先会在常量池中检查发现存在“abc”,所以s2并不会再创建而是直接指向“abc”,而 String s3 = new String("abc");首先会在堆内存new 一个String对象,然后指向常量池中已经存在的“abc” (不会再创建“abc”),但是new String()给s3是自己的地址,并不是“abc”的地址。所以输出结果为true  false  true

现在抛出一个问题 String  s = “abc”和 String s = new String("abc")有什么区别?

答案详情请见下一篇随笔

时间: 2024-09-29 18:04:54

String的存储过程的相关文章

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

sql存储过程和事务的应用

在去年,学习数据库的时候就学过存储过程了.一直都只知道一些理论,却不知道如何去使用.时隔一年,终于找到如何使用存储过程了. 在机房收费系统中,有些操作,需要多次执行sql语句,多次执行完成才算是完成这个事件流.但是如果其中有一个环节出了错误,那么没出错误的那些操作是不是就多余了. 执行存储过程,就是执行多句SQl语句.而事务,是为了控制这些语句 要么都做,要么 都不做. 在机房收费系统中,执行sql语句的时候. 一般的sql语句使用方法:定义一个字符串,用于存放sql语句.之后指明command

数据库技术之存储过程设计与实现(三)

原创性声明 此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/39251241如果进行转载请注明出处.本文作者原创,邮箱[email protected],如有问题请联系作者 一个java模拟的存储过程 在前两篇博客中介绍了存储过程的设计方法和数据结构.但是没有一个例子恐怕文章在好也没有很容易理解把 为此博主专门给了一个实例,我用java模拟了一个存储过程来实现,由于java下我没有进行词法语法解析,所以我的语法树就得自己来构造了

sql使用存储过程和交易

在过去的一年.学习数据库的时候学校有存储过程.永远只是知道一些理论,我不知道怎么用.时隔一年,最终找到怎样使用存储过程了. 在机房收费系统中.有些操作.须要多次运行sql语句,多次运行完毕才算是完毕这个事件流. 可是假设当中有一个环节出了错误,那么没出错误的那些操作是不是就多余了. 运行存储过程.就是运行多句SQl语句.而事务.是为了控制这些语句 要么都做,要么 都不做. 在机房收费系统中.运行sql语句的时候. 一般的sql语句用法:定义一个字符串,用于存放sql语句.之后指明commandt

【机房重构】—存储过程当媒人

以下是本人亲眼所见的机房重构帅小伙(简称重构),借助存储过程媒人(简称存储)与数据库大美女(简称:库)交往的经历,和大家分享一下. 那是一个风和日丽的白天,重构帅小伙独自一人走在处处飘香的初夏的校园中,他一直在思考,如何与库美女更容易的交往呢?以前重构去找库美女的时候总是需要先打一个电话(链接一个表),再问问库美女在哪里(再链接一个表),然后才能去找库美女(向两个表中存入数据):重构绞尽脑汁终于想出了一个办法, 他通过手机中的GPS(存储过程)直接定位库美女的位置,然后突然给库美女一个惊喜,这样

asp.net 常用的几种调用存储过程的方法

(1)简单的无参数存储过程 create procedure ExpOneasselect top 10 * from Corpgo C#调用此存储过程        SqlConnection con = new SqlConnection(connstr);        string procedurestr = "存储过程名";        SqlCommand cmd = new SqlCommand(procedurestr, con);        con.Open(

Oracle在存储过程中如何返回结果集

Oracle和Sqlserver不一样的地方有很多. 个人最深的体会是存储过程返回结果集,在Sqlserver中直接select查询就行,Oracle就不行了. 这里,就用最简单的例子说明存储过程返回结果集的例子 CREATE OR REPLACE PROCEDURE 存储过程名( 字段名 in VARCHAR2, l_result OUT TYPES.RQ_REF_CURSOR -- 包里面方法名 ) is str_sql varchar2(8000) := ''; begin str_sql

使用CompletionService结合ExecutorService批处理调用存储过程任务实例

此实例为java多线程并发调用存储过程实例,只做代码记载,不做详细描述 1.线程池构造初始化类CommonExecutorService.java package com.pupeiyuan.go; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.u

Nodejs之mssql模块的封装

在nodejs中,mssql模块支持sqlserver数据库操作.今天将mssql模块的某些功能封装为一个类,方便以后调用.封装的功能有执行存储过程,执行查询语句操作等.如果本篇文章对大家有帮助,那就再好不过了! 要使用mssql模块,请先用npm加载到项目中.加载过程:打开cmd命令框,定位到项目的根目录下,输入npm install mssql --save ,然后按回车键就OK! 封装的代码如下: //导入mssql模块 var mssql=require("mssql"); v