文档章节

Java基础8

DouDouLee
 DouDouLee
发布于 2016/05/09 15:59
字数 1004
阅读 23
收藏 0

1、字符串的创建与存储机制

字符串的声明与初始化有两种情况:

1)在JVM中存在着一个字符串池,保存着很多String对象,且可以被共享使用,s1与s2引用的是同一个常量池中的对象。String采用的是享元设计模式(使用共享技术实现相同或相似的对象的重用,即实现实现相同或相似的对象的代码共享,极大减少了系统中对象的个数),当创建一个字符串常量时,会首先在常量池中查找是否已经有相同的字符串被定义,依据String类的equals(Obj o)返回值,若已经定义,直接获取对其的引用,此时不需要再去创建新的对象;若没有定义,则首先创建这个对象,然后把它加到字符串池中,再将它的引用返回。

String s1 = "abc"; //在常量区里放一个“abc”字符串
String s2 = "abc";//s2 引用常量区里的字符串,不会创建新的对象

2)

String s3 = new String("abc");//在堆中创建新的对象
String s4 = new String("abc"); //在堆中又创建新的对象

他们在内存中地址是不同的,用new时总是会产生新的对象。

Q:new String("abc");创建了几个对象?

A:一个或两个。若常量池中有字符串“abc”则创建一个;没有则创建两个对象。

2、==/equals/hashCode()

==运算符用来比较两个变量的值是否相等。即比较变量对应的内存中所存储的数值是否相同。如String s = new String();,变量s占用一块存储空间,而new String()则存储在另外一块存储空间里,此时变量s所对应内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象的类型的变量,若比较这两个变量是否指向同一个对象,即要看这两个变量所对应内存中的数值(地址)是否相等,这时候可以用==比较。但要比较对象的内容是否相同==就无法实现了。

equals()方法是Object类提供的方法之一。Object类中定义的equals(obj)方法是直接用==比较的两个对象,所以在没覆盖equals方法情况下equals(obj)与==一样,比较的是引用。相比==,equals方法可以被覆盖。

hashCode()方法是从Object类中继承过来的,,返回内存中的地址转换成的一个int值,若没有重写,任何对象的hashCode方法返回值都是不同的。

package Four;

//s1.hashCode、s2.hashCode与s1.equals(s2)的关系:
//返回的hashCode()不同equals一定不同,equals相同则hashCode()同,其他情况都不确定

public class Equals {
 public static void main(String[] args){
  String s1 = "Hello";
  String s2 = "Hello";
  /*int java.lang.String.hashCode()
Returns a hash code for this string.
*/
  
  String s11 =new String( "Hello");
  String s22 =new String( "Hello");
  System.out.println(s1 .hashCode() == s2.hashCode());
  System.out.println(s1 == s2);
  System.out.println(s11 .hashCode() == s22.hashCode());
  System.out.println(s11 == s22);
 }
}/*
true
true
true
false*/

3、String/StringBuffer/StringBuilder/StringTokenizer

1)String是不可变类,即String对象一旦被创建,其值不能被改变;StringBuffer属于可变类。

2)实例化String时,可以利用构造函数String s = new String("abc");或赋值语句String s = "abc";StringBuffer只能用构造函数StringBuffer s = new StringBuffer("abc");

3)StringBuffer效率较高

String s = "abc";
s+="123";

等价于:

StringBuffer s1 = new StringBuffer(s);
s.append("123");
s = s1.toString();

由上看出,String的使用比StringBuffer多了一些操作,同时生成了一些临时对象,从而导致程序的执行效率降低。

StringBuilder与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,若只在单线程使用StringBuilder效率较高。

在执行效率方面StringBuilder>StringBuffer>String.

StringTokenizer是用来分割字符串的工具类。

import java.util.StringTokenizer;
public class StringTokenizerTest {
 public static void main(String[] args){
  StringTokenizer st = new StringTokenizer("Hey you");
  while(st.hasMoreTokens())
   System.out.println(st.nextToken());
 }
}/*
Hey
you
*/

© 著作权归作者所有

共有 人打赏支持
DouDouLee
粉丝 6
博文 95
码字总数 45242
作品 0
西安
大数据开发培训:0基础学习Java编程语言有哪些知识点?

Java 技术通用、高效、具有平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等,学习Java首先要知道学习知识点有哪些。在这就用加米谷大数据培训...

加米谷大数据
07/25
0
0
Docker | 第五章:构建自定义镜像

前言 上一章节,主要是介绍了下的一些常用命令的说明。我们知道,利用可以构建一个新的镜像,比如运行环境,就需要一个环境的镜像,但直接使用公共的镜像时,一般上大小都比较大。所以本章节...

oKong
08/04
0
0
Java 8新特性探究 前言

自2013年6月13日,oracle就已经发布的Java 8特性完备版本(M7),但最终GA版本将在2014年3月18日(已第二次跳票,原计划今年9月发布的,据官网宣称是为了解决安全问题......),相信大家多多...

OSC闲人
2013/11/05
0
17
Java面试中,遇到这类面试题最吃亏!

从你接触 Java开发到现在,你对 Java最直观的印象是什么呢?是它宣传的 “Compile once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java平台到底了解到什么程度?请你...

Java大蜗牛
07/20
0
0
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6 取余运算

python中取余运算逻辑如下: 如果a 与d 是整数,d 非零,那么余数 r 满足这样的关系: a = qd + r , q 为整数,且0 ≤ |r| < |d|。 经过测试可发现,python3.6中取余运算得到的 r 是正整数;...

colinux
17分钟前
1
0
[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
3
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
3
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
1
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部