JAVA 字符串疑惑Java 字符串池
所谓天下文章皆是抄,在网上找一个Java 字符串池的文章,搜到N多条目,可看来看去也就两篇,总结如下:
首先看一段代码:
String a = "Hello";
String b = "Hello";
String c = new String("Hello");
String d = new String("Hello");
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(b.equals(c));
System.out.println(c.equals(d));
结果是true,false,false,true,true , true 。这里就涉及到字符串池 。“字符串池”,是Java为了提高内存利用率而采用的措施:当遇到String a = "Hello"; 这样的语句时 , Java会先在字符串池中寻找是否已经存在"Hello"这个字符串,如果没有,则建立字符串"Hello"对象,然后变量 a 指向这个地址;然后遇到语句String b = "Hello",这时字符串池中已经有 "Hello"了 , 所以直接让变量b也指向这个地址 , 省去了重新分配的麻烦 。而在Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同,对于两个对象来说,则是判断其地址是否相同,所以a == b返回 true 。那么String c = new String("Hello")又如何处理呢?如果是这种写法,则不会去访问字符串池,而是先为变量 c 开辟空间,然后将值写入空间 。所以a == c返回false , c == d同样返回false 。至于String的equals方法,因为它比较的不是对象的地址,而是对象的值,所以都返回true就不奇怪了 。
Java虚拟机有一个字符串池,保存着几乎所有的字符串对象 。字符串表达式总是指向字符串池中的一个对象 。使用new操作创建的字符串对象不指向字符串池中的对象但是可以使用intern方法使其指向字符串池中的对象(注:如果池中已经有相同的字符串--使用equals方法确定,则直接返回池中的字符串 , 否则先将字符串添加到池中,再返回) 。池中两个相等的字符串如果使用“==”来比较将返回真 。
有关Java代码的一个疑惑因为你的 LabeledPoint类继承自Point类,在写你的 LabeledPoint类构造函数时,要自动调用Point类的构造函数,如你不用super()显式调用,系统默认调用Point(),又因为你定义啦Point(int x,int y)所以Point()不能没有
还有你打印对象应重载toString()
说的有点乱,可以这样修改,你再想想看 。。。
public class LabeledPoint extends Point {
private String label;
LabeledPoint(int x, int y, String s) {
super(x,y);//显式调用Point(int x,int y),可删除Point()
label = s;
}
public void setLabel(String s) {
label = s;
}
@Override
public String toString() {
return label "("xCoord","yCoord")";
}
public static void main(String[] args) {
Point p1 = new Point(0, 0);
LabeledPoint p2 = new LabeledPoint(1, 1, "I started at (1,1)");
System.out.println("p1: "p1);
System.out.println("p2: "p2);
p1.move(20, 45);
System.out.println("p1: "p1);
p2.setLabel("new label");
System.out.println("p2: "p2);
System.out.println("\nexiting \"main\"");
}
}
class Point {
int xCoord;
int yCoord;
Point(int x, int y) {
xCoord = x;
yCoord = y;
}
public void move(int dx, int dy) {
xCoord= dx;
yCoord= dy;
}
@Override
public String toString() {
【让人疑惑的java代码 java代码常见错误】return "("xCoord","yCoord")";
}
}
或者:
LabeledPoint(int x, int y, String s) {
System.out.println(xCoord "," yCoord);
xCoord = x;
yCoord = y;
label = s;
}
可见:调用啦
Point() {
this(0, 0);
}
,可将其改为空函数
Point() {
}
,还有就是可将Point()和Point(int x,int y)同时删除,则调用默认的Point类构造函数
求教高手解决此段java代码的疑惑……为什么显示3.14 - 3 = 0.14000000000000012?不仅java让人疑惑的java代码,所有语言存数字类型都是用的2进制让人疑惑的java代码 , 这由计算机的硬件结构决定 。比如说让人疑惑的java代码,十进制的0.5可以正好由二进制的0.1表示,可是对于0.3之类的,会由一个近似的二进制小数表示 , 因为0.3不会由有限个二进制小数表示出来,所以计算机会使用截断剩余位数的方法(或向偶靠近的方法) 。不管什么方法,反正就是一般的double或float类型的小数都不会是一个确定值,在计算机内都会是一个近似值 。
因此浮点数判断是否相等要使其减去近似值并且误差在某个可接受的范围内就认为相等 。
这里改成--------→if(Math.ABS(a - b - 0.14)0.0000001 )
java 中的疑惑第一行代码private static A a = new A(); 仅在A类被加载时执行 , 而且只执行一次 。
如果把static去掉,则每次调用new A()时都会执行 , 造成溢出 。仅供参考 。
一道关于求日期的java代码 。。疑惑求解你要明白月份是从0开始的,也就是1对应的是二月February
也就是你说的输出的礼拜六
2010年1月2日实际你的calendar是2010年2月2日,星期二
一年中的第一个月是 JANUARY,它为 0;最后一个月取决于一年中的月份数 。
让人疑惑的java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java代码常见错误、让人疑惑的java代码的信息别忘了在本站进行查找喔 。
推荐阅读
- 小程序和后台怎么实现交互,微信小程序如何交互
- sap物料视图,sap物料视图是否被扩充
- 计算机毕业设计作品演示,计算机毕设范文
- mysql怎么让年数相减 mysql年龄怎么求
- 公众号该关注什么人呢图片,公众号该关注什么人呢图片怎么设置
- jquery中事件大全介绍,jquery 事件
- 揭秘直播运营培训,直播运营培训心得体会
- python指数函数代码 python中的指数
- 怎么联系开发小程序客服,小程序开发客服功能