关于==和equals()方法&Java中string与char如何转换&String,StringBuffer
| 
 简单类型(基本类型)  | 
 boolean  | 
 byte  | 
 char  | 
 short  | 
 int  | 
 long  | 
 float  | 
 double  | 
 void  | 
| 
 二进制位数  | 
 1  | 
 8  | 
 16  | 
 16  | 
 32  | 
 64  | 
 32  | 
 64  | 
 --  | 
| 
 封装器类  | 
 Boolean  | 
 Byte  | 
 Character  | 
 Short  | 
 Integer  | 
 Long  | 
 Float  | 
 Double  | 
 Void  | 
栗子:
String s1="abc";
String s2==s1;
String s5="abc";
String s3=new String("abc");
String s4=new String("abc");
问题来了:
s1==s5; //true,"abc"放到常量池(Constant Pool)中,对于两个值相同的常量,常量池只会创建一个
s1==s2; //true,比较的是同一个引用
s1.equals(s2); //equals()比较的是内容,显然s1,与s2的内容相同
s3==s4; //false,new出来的,就是放在了不同的堆内存中了,它们的引用s3,s4就会不同
s3.equals(s4); //true,s3与s4的内容相同
s1.equals(s4); //true,s1与s4的内容相同
s1==s4; //false,使用new关键字创建出来的,不管String Pool中是否已经有值相同的对象,都会创建一个新的String对象存储在堆内存中,然后把引用返回,赋值给s4
3.Java中string与char如何转换?
String s="hello";
char c[]={'h','e','l','l','o'};
char ch[]=s.toCharArray(); //string转换成char
String s1=new String(c); //char转换成string
4.注意以下二者的区别
String s="a"+"b";
String s="a";
s+="b";
每次"+="操作都会构造新的String对象,所以后者开辟了两个内存段。为了效率,应该避免使用"+="来构造字符串
栗子1:
以下程序创建了几个对象?
String A,B,C;
A="a";
B="b";
A=A+B;
StringBuffer D=new StringBuffer("abc");
D=D.append("567");
答案;5个
其实String s3=new String("abc");是创建了两个对象,"abc"本身就是在pool中创建的一个对象,而在运行时,执行new String()时,将pool中的对象复制了一份放到heap中,并且把这个对象的引用交给s3持有。
但是StringBuffer是可变类,特点就是改变对象本身而不是创建新的对象,所以StringBuffer D=new StringBuffer("abc");是创建了一个对象。
D=D.append("567");创建了一个对象,因为"567"本身就是一个对象。
A="a";//创建了一个对象
B="b";//创建了一个对象
A=A+B;//此处创建了一个对象,并由A来引用,那么原来A所指向的对象就成为垃圾对象,被回收。
栗子2:
请说出以下代码块存在的问题?
String temp="";
for(int i=0;i<9999;temp+="x")
{
}
由于String类是支持非可变性的,所以当执行temp+="x"的时候,实际上是另外创建了一个对象,而tmp原来指向的那个对象就成了垃圾。
这样一循环就会产生n个对象,从而造成内存浪费。
那么问题来了:什么是支持非可变性类?
这种类的特点就是状态固定,不存在任何修改对象的方法,在该对象生存周期内,它的值永远不变的。所以线程安全,不要做同步处理,可以将其共享给所有的用户,让所有的"客户端程序员"都可以直接使用此类而不需要做任何额外的工作。
非可变类的缺点就是:对于每一个不同的值,都要去一个单独的对象。
栗子3:
下列 java 程序输出结果为_A_。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
A.true,true
B.false,true
解释: i==j ,这个是基本类型与 Integer 的比较, j 会自动拆箱成 int 类型,然后比较的是值。因此返回真。
关于==和equals()方法&Java中string与char如何转换&String,StringBuffer的更多相关文章
- java乱码详解(java中byte与char的转换)
		
转自:http://hi.baidu.com/%C6%F3%D2%B5%BC%D2%D4%B0/blog/item/825a4858d6248e8b810a181a.html java byte与 ...
 - java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换
		
java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换 一.字符串与其他类型连接 public class DemoString{ public static void mai ...
 - Java中数据类型及其之间的转换
		
Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...
 - Java中数据类型及其之间的转换(转)
		
Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...
 - string与char* 互相转换以及周边问题
		
先插一个小知识点 string str = "abc" str += 'd'; cout<<str<<endl; //"abcd" ...
 - java中“==”和equals方法的区别,再加上特殊的String引用类型
		
==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为 基本数据类型 的比较和 引用数据类型 的比较 ...
 - 使用hashCode()和equals()方法 - Java
		
在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...
 - java 中的Number类  Character类 String类 StringBuffer类 StringBuilder类
		
1. Number类 Java语言为每一个内置数据类型提供了对应的包装类.所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类.这种由编 ...
 - Java中的字符串操作(比较String,StringBuiler和StringBuffer)
		
一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...
 
随机推荐
- 【转】CommonJS,AMD,CMD区别
			
学得比较晕,再次看commonjs,amd, cmd时好像还是没完全弄清楚,今天再整理一下: commonjs是用在服务器端的,同步的,如nodejs amd, cmd是用在浏览器端的,异步的,如re ...
 - VOJ1067 【矩阵经典7 构造矩阵】
			
任意门:https://vijos.org/records/5be95b65d3d8a1366270262b 背景 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条 ...
 - vue常用事件
			
一.事件监听 1. banner_edit.$watch('bannerForm.type', function () { //执行其他代码 console.log(666); this.banner ...
 - WebStorm11 注册码及激活
			
网址:http://www.jianshu.com/p/5ce394a28ce5 1.获取注册码 打开第一个网址(IntelliJ IDEA 注册码),我们能看到下面的界面,直接点击获取激活码,将生成 ...
 - Linux---more命令学习
			
More命令 more命令一般用于分页显示文件的内容,more会显示文件第一屏的内容,在屏幕的底部,more用反白字体显示文件的百分比,这时如果按空格键,文件的一下屏内容会显示出来,如果按回车键,显示 ...
 - JDBC执行存储过程的四种情况 (转)
			
本文主要是总结 如何实现 JDBC调用Oracle的存储过程,从以下情况分别介绍: [1].只有输入IN参数,没有输出OUT参数 [2].既有输入IN参数,也有输出OUT参数,输出是简单值(非列表) ...
 - Android学习笔记_5_文件操作
			
1.Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. package com.example.servi ...
 - neo4j 安装步骤 转自:http://blog.csdn.net/luoluowushengmimi/article/details/19987995
			
1. Neo4j简介 Neo4j是一个用Java实现的.高性能的.NoSQL图形数据库.Neo4j 使用图(graph)相关的概念来描述数据模型,通过图中的节点和节点的关系来建模.Neo4j完全兼容A ...
 - node学习----Promise 初见
			
今天在网上查看promise资料,发现promise有三种状态,pending,fullfilled,rejected.分别对应了初始化状态,成功状态及失败状态.为了理解写测试代码来实验:functi ...
 - 并发编程之多线程基础-Thread和Runnable的区别及联系(二)
			
上篇文章讲述了创建线程的常用方式 本篇主要分析一下Thread和Runnable两种方式创建线程的区别及联系 联系: ▶Thread类实现了Runable接口. ▶都需要重写里面Run方法. 区别: ...