1.对于基本数据类型,可以直接使用==和!=进行内容比较
如:int x=30;
       int y=30;
        x==y;  //true
基本数据类型

简单类型(基本类型)

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

 
 
 
 
 
 
 
2.对于不是基本数据类型的,则==和!=比较的就是对象的引用
如:String s1="hello";
       String s2=new String("hello");
        s1==s2;//false
错误原因就是String不是基本数据类型,所以==比较的是对象的引用,很显然,两个对象的引用时在栈的不同位置,也就是说,两个对象的引用在栈中是不同的地址
 
String类中有一个equals()方法,可以进行内容的比较。
如:s1.equals(s2);//true

栗子:

  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的更多相关文章

  1. java乱码详解(java中byte与char的转换)

    转自:http://hi.baidu.com/%C6%F3%D2%B5%BC%D2%D4%B0/blog/item/825a4858d6248e8b810a181a.html   java byte与 ...

  2. java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换

    java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换 一.字符串与其他类型连接 public class DemoString{ public static void mai ...

  3. Java中数据类型及其之间的转换

    Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...

  4. Java中数据类型及其之间的转换(转)

    Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...

  5. string与char* 互相转换以及周边问题

    先插一个小知识点 string str = "abc" str += 'd'; cout<<str<<endl;  //"abcd"   ...

  6. java中“==”和equals方法的区别,再加上特殊的String引用类型

    ==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为  基本数据类型  的比较和  引用数据类型 的比较 ...

  7. 使用hashCode()和equals()方法 - Java

    在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...

  8. java 中的Number类 Character类 String类 StringBuffer类 StringBuilder类

    1. Number类 Java语言为每一个内置数据类型提供了对应的包装类.所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类.这种由编 ...

  9. Java中的字符串操作(比较String,StringBuiler和StringBuffer)

    一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...

随机推荐

  1. 【洛谷5288】[HNOI2019] 多边形(二叉树模型)

    点此看题面 大致题意: 给你一个多边形,用若干不重合.不相交的线段将其划分为若干三角形区域,并定义旋转操作\((a,c)\)为选定\(4\)个点\(a,b,c,d\)满足\(a<b<c&l ...

  2. POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】

    任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total ...

  3. c#主窗体以及副窗体弹出

    在program.cs中,Form1的位置就是主窗体的位置(主窗体特征:关闭窗体应用程序结束) 弹出副窗口(点击按钮弹出窗口) Close为关闭窗口(关闭对应对象,需要先自己new一个) this.C ...

  4. mysql时间日期函数

    now(), current_timestamp(); -- 当前日期时间 current_date(); -- 当前日期 current_time(); -- 当前时间 date('yyyy-mm- ...

  5. vuex+vue-router拦截

    干就完了 项目中经常遇到这样一个场景,用户信息或者进行增删改的一些模块,需要根据用户是否登录,进行路由拦截,直接上代码 在store文件夹下的store.js中存放一个默认登录状态 /* * stor ...

  6. windows下搭建python

    windows下搭建python 下载python版本  https://www.python.org/   注意当前操作系统的位数,32位还是64位 同时   安装后  修改环境变量         ...

  7. Oracle中的一些查询语句及其执行顺序

    查询条件: 1)LIKE:模糊查询,需要借助两个通配符,%:表示0到多个字符:_:标识单个字符. 2)IN(list):用来取出符合列表范围中的数据. 3)NOT IN(list): 取出不符合此列表 ...

  8. oracle日常监控语句

    oracle常用的性能监控SQL语句 一.查询历史SQL: ---正在执行的SQL语句: select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT fro ...

  9. iOS之一些实用的Demo

    图像浏览及处理 FLAnimatedImage - gif播放处理的工具. CLImageEditor - 超强的图片编辑库,快速帮你实现旋转,防缩,滤镜等等一系列麻烦的事情. ios-image-f ...

  10. SmallMQ实现发布

    最近一直学习,主要处理java的分布式,MQ,RPC,通信,数据库,缓存等方向. 一般现在的MQ都是企业级的,庞大,功能齐全.最主要是代码量大,对于我们这些小程序员而言,太大,修改困难,修复更加困难, ...