关于==和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库函数或者自己 ...
随机推荐
- JQuery datatables 标题和内容居中显示
1.如题,使用到了强大的表格插件datatables,要使标题和内容都居中显示,只需要在jsp引入css,写上如下内容即可: /*qiulinhe:2016年11月7日13:48:26*/ /* da ...
- codeforces 609E Minimum spanning tree for each edge
E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...
- Uva 11396 爪分解
题目链接:https://vjudge.net/contest/166461#problem/A 题意: 给定一个图,特点是每个点的度都是3,求是不是原图可以分解为全部鸡爪:每条边只属于一个鸡爪: 分 ...
- 【luogu P1144 最短路计数】 题解
题目链接:https://www.luogu.org/problemnew/show/P1144 #include <iostream> #include <cstdio> # ...
- JVM构架、GC垃圾回收机制的理解
JVM是Java Virtual Machine(Java虚拟机)的缩写 1.程序计数器 它的作用可以看做是当前线程所执行的字节码的行号指示器. 每个线程都有一个程序计算器,就是一个指针,指向方法区 ...
- 怎么得到scrollTop
我们学习一个事件 : 页面滚动效果 window.onscroll = function() { 页面滚动语句 } 谷歌浏览器 和没有声明 DTD <DOCTYPE > : ...
- 20.springboot项目部署到linux服务器文件上传临时路径处理问题
1.前言 把项目部署到服务器上之后,文件上传默认会在/tmp路径中. 之前想了各种解决办法,比如如何更改这个上传路径...... 最后发现不是个好的方法,当然就想到了更好的解决方案. 就是我把上传文件 ...
- leetcode算法之 Single Number
题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 要求: 时间复杂度O(n),空间复杂都O(1) 示例: 输入: [2,2,1] 输 ...
- IPC进程间通信---消息队列
消息队列 消息队列:消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识.与管道不同的是消息队 列存放在内核中,只有在内核重启(即操作系统重启)或者显式地删除一个消息队列时,该消息队 ...
- 如何在linux中创建虚拟环境
安装虚拟环境的命令 : sudo pip install virtualenv sudo pip install virtualenvwrapper 安装完虚拟环境后,如果提示找不到mkvirtual ...