String类的两种定义方式:

  1. 直接赋值

  2. 通过构造方法赋值

//直接赋值
public class test2 {
public static void main(String args[]) {
String str = "hello";
System.out.println(str);
}
} //通过构造方法
public class test2 {
public static void main(String args[]) {
String str = new String("hello");
System.out.println(str);
}
}

但是,两种方法却有着极大的区别

主要体现在内存

一个简单的例子:

public class test1 {
public static void main(String args[]) {
int a = 10;
int b = 10;
String str_1 = "hello";
String str_2 = "hello";
String str_3 = new String("hello");
System.out.println(a==b);
System.out.println(str_1==str_2);
System.out.println(str_1==str_3);
System.out.println(str_2==str_3);
}
} //输出为true true false false

按道理来说,应该是四个true,因为他们的值都是相等的啊.......但是.....

上图解释了两个通过直接赋相同值产生的字符串使用“”==“”为什么返回true。

为什么会全部指向一块堆内存而不是分别指向自己的堆内存呢???

共享设计模式:

在JVM底层有一个对象池,里面有包括String在内的许多对象,当代码之中使用了直接赋值的方式定义了一个String类对象时,会将此字符串使用的匿名对象加入对象池。之后若有采用直接赋值的方式定义字符串,并且赋了相同的值,那么不会开辟新的堆内存空间,而是使用已有的对象(堆内存)进行继续使用。

上图解释了为什么直接赋值和构造方法赋相同的值,然而返回值却为false。因为使用构造方法定义字符串,使用了new关键字,意味着产生一块新的堆内存。那么两种方法各自开辟了一块堆内存,“==”符号对于字符串来说,比较的是地址值。两块堆内存的地址不同,所以返回值为false。

若要比较字符串的内容,而不是地址,应该使用str_a.equals(str_b)

字符串常量就是String类的匿名对象,所谓的直接赋值实际上就是为匿名对象加了一个名字。但是String类的匿名对象是由系统自动生成的,不用用户自己创建

public class test1 {
public static void main(String args[]) {
String str = "hello";
System.out.println("hello".equals(str));
}
}
//返回值为true

tips:

防止空指向异常(使用了未实例化的对象):将字符串写在输入的前面

public class test1 {
public static void main(String args[]) {
String input = null;
System.out.println(input.equals("hello"));
}
}
//Exception in thread "main" java.lang.NullPointerException
at test.test1.main(test1.java:6) 空指向异常 public class test1 {
public static void main(String args[]) {
String input = null;
System.out.println("hello".equals(input));
}
}
//false

两种定义方法的优劣:

直接赋值节约空间

然而构造方法却会产生大量垃圾,如下图:

代码从右向左看,产生的第一块堆内存会成为垃圾

构造方法实例化的方法除了浪费内存外,其定义的对象不会保存在对象池之中,若要保存,需要手动入池(使用inner()方法)

public class test1 {
public static void main(String args[]) {
String str_1 = new String("hello").intern();
String str_2 = "hello";
System.out.println(str_1==str_2);
}
}
//true

返回值为true,证明入池成功。

JAVA基础学习之路(八)[1]String类的基本特点的更多相关文章

  1. JAVA基础学习之路(三)类定义及构造方法

    类的定义及使用 一,类的定义 class Book {//定义一个类 int price;//定义一个属性 int num; public static int getMonney(int price ...

  2. Java基础系列2:深入理解String类

    Java基础系列2:深入理解String类 String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String.主要包括如下的五个内容: Strin ...

  3. JAVA基础学习之路(一)基本概念及运算符

    JAVA基础概念: PATH: path属于操作系统的属性,是系统用来搜寻可执行文件的路径 CALSSPATH: java程序解释类文件时加载文件的路径 注释: 单行注释  // 多行注释 /*... ...

  4. JAVA基础学习之路(十一)引用传递

    引用传递: 不同栈内存可以指向同一块堆内存,不同栈内存可以对一块堆内存进行修改 范例一: class Message { private int num = 10; public Message(in ...

  5. Java基础篇(02):特殊的String类,和相关扩展API

    本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类 ...

  6. JAVA基础学习之路(九)[2]String类常用方法

    字符与字符串: 1.将字符数组变为字符串(构造方法) public String(char[] value) Allocates a new String so that it represents ...

  7. Java基础学习笔记十八 异常处理

    什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在 ...

  8. JAVA基础学习之路(五)数组的定义及使用

    什么是数组:就是一堆相同类型的数据放一堆(一组相关变量的集合) 定义语法: 1.声明并开辟数组 数据类型 数组名[] = new 数据类型[长度]: 2.分布完成 声明数组:数据类型 数组名 [] = ...

  9. JAVA基础学习之路(七)对象数组的定义及使用

    两种定义方式: 1.动态初始化: 定义并开辟数组:类名称 对象数组名[] = new 类名称[长度] 分布按成:类名称 对象数组名[] = null: 对象数组名 = new 类名称[长度]:   2 ...

随机推荐

  1. sharepoint2016安装OOS,OOS场负载均衡

    Office Online Server is the successor to Office Web Apps Server. It may be connected to SharePoint, ...

  2. Matplotlib——中级

    关于Matplotlib的愚见 初级中,我只是简单介绍了Matplotlib的使用方法,在中级部分,我系统地说一下我总结的内容. 上图是我画的关于Matplotlib几个对象之间的关系图.它们都来自于 ...

  3. Struts2+hibernate 结合,实现登陆校验

    完整的项目在github中,数据库使用postgresql,建表语句见项目文档. 下面我分块介绍一下struts2.hibernate.与页面部分的代码. Struts2 UserAction.jav ...

  4. Oracle12C创建用户遇到ora-6509

    引用自:http://blog.itpub.net/29357786/viewspace-1995055/ ORACLE 12C创建用户之ORA-65096 2016年2月25日,一北京北方人瑞教育咨 ...

  5. NodeJ Koa2 安装使用 reeber

    介绍 Koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的 Web 框架. 使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的 ...

  6. ABAP开发顾问必备:SAP ABAP开发技术总结[转载]

    转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...

  7. MySQL语句整理(二)

    数据库操作前的准备 -- 创建数据库 -- create database python_test_1 charset=utf8; -- 使用数据库 -- use python_test_1; -- ...

  8. linux系统基础之六--系统引导(基于centos7.4 1708)

  9. Js 手指事件

    1.Touch事件简介   pc上的web页面鼠标会产生onmousedown.onmouseup.onmouseout.onmouseover.onmousemove的事件,但是在移动终端如ipho ...

  10. mysql索引建立原则

    看了网上一些网上关于创建索引的原则,在这里做一下总结: 1.尽量创建在使用频率较高的字段上,比如主键,外键,where总用到的字段,join是相关联的字段 2.如果表过大,一定要创建索引. 3.索引应 ...