文档章节

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
*/

© 著作权归作者所有

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

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

加米谷大数据
2018/07/25
0
0
甲骨文宣布将于明年7月28日推JDK 7

北京时间11月20日消息,据国外媒 体报道,甲骨文今天宣布,Java Development Kit 7(Java开发者工具包)将于2011年7月28日推出。甲骨文同时表示,公司已于昨天向Javap社区进程执行委员会(Java...

红薯
2010/11/20
1K
9
Java程序员必读书单,家族又添新成员

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

异步社区
2018/05/09
0
0
回顾 2017, Java 有哪些重大变化值得关注?

在过去的一年中,Java 历经了许多变化。在今年年初,Java EE 处于一个不确定的状态,Java 9 版本也推迟了它的发布日期。在 2016 年的 JavaOne 上,甲骨文宣布了解决平台的计划和 Java SE 9 ...

周其
2017/12/25
3.2K
7
Docker | 第五章:构建自定义镜像

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

oKong
2018/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
2
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
1
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
3
0
Java并发编程:深入剖析ThreadLocal

ThreadLocal 的理解 ThreadLocal,很多地方叫线程本地变量,或线程本地存储。ThreadLocal为变量在每个线程中都创建了一个副本,每个线程可以访问自己内部的副本变量。===》解决的问题是线程间...

细节探索者
昨天
3
0
【Python3之异常处理】

一、错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^SyntaxError: invalid...

dragon_tech
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部