**
运算符
**
分隔符 . [] () , ;
算术运算符: +,―,*,/,%取余,如7/4=1,7%4=3、++,――
关系运算符: >,<,>=,<=,==,!=
布尔逻辑运算符: !,& , | , &&,||
位运算符: &,|,^,~ , >>,<<,>>>
赋值运算符: =
扩展赋值运算符:+=,―=,*=,/=
字符串连接运算符: +
造型操作符:()
**
关系运算符
**
, <, >=, <=, ==, !=
3=5 false
3!=5 ture
**
== 等值比较和equal比较
**
所有的对象都拥有标识(内存地址)和状态(数据)
同时“= =”比较的是两个对象的内存地址,
在Object的equals方法底层调用的是“= =”号
所以说Object的equals()方法是比较两个对象的内存地址是否相等
equals()与"==" 的区别:
(1)= = 号在比较基本数据类型时比较的是数据的值,而用 = = 号比较两个对象时比较的是两个对象的地址值;
(2)equals()不能用于基本的数据类型,对于基本的数据类型要用其包装类。
(3)默认情况下,也就是从Object继承而来的 equals 方法与 “= =” 是完全等价的,比较的都是对象的内存地址,因为底层调用的是“= =” 号,但我们可以重写equals方法,使其按照我们的需求方式进行比较,如String类(integer,date,file)重写equala()方法,使其比较的是字符的内容,而不再是内存地址。
**
代码实例:
public class Test1 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2); //true
System.out.println(str1.equals(str2)); //true
//相等原因:str1先在方法區創建了abc對象,str2直接調用abc地址,不用再創建。
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3 == str4); //false 不相等原因:str3先在方法區創建對象,再調用對象。
//str4也在方法區調用對象,但是二者在堆區對象地址不同。
System.out.println(str3.equals(str4)); //true String中默认改写equals方法,只比较内容,不比较地址。
}
**
public class equals {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println("n1 == n2 :" + (n1 == n2));// false
// n1=null;
System.out.println("n1.equals(n2) :" + n1.equals(n2));// true
System.out.println("n2.equals(n1) :" + n2.equals(n1));// true
System.out.println("n1!= n2 :" + (n1 != n2)); // ture
n1 = 300;
n2 = 300;// 自动装箱
System.out.println("***n1 == n2 :" + (n1 == n2));// false
System.out.println("______________");
n1 = 100;
n2 = 100;// 自动装箱
System.out.println("####n1 == n2 :" + (n1 == n2));// true
System.out.println("______________");
int a1, a2;
a1 = 130;
a2 = 130;
System.out.println("a1 == a2 :" + (a1 == a2));// true
// System.out.println("a1.equals(a2) :" +a1.equals(a2));
System.out.println("______________");
String str1;
str1 = new String("Hello");
String str2 = new String("Hello");
// str2=null;
System.out.println(str1 == str2);// false
System.out.println("str1的hash地址" + str1.hashCode());// str1的hash地址69609650
System.out.println("str2的hash地址" + str2.hashCode());// str2的hash地址69609650
System.out.println("str2.equals(str1) :" + str2.equals(str1));// true
System.out.println("*************");
System.out.println(str1 == "Hello");// false
// str1=null;
System.out.println("str1.equals( Hello ) :" + str1.equals("Hello"));// true
System.out.println("Hello.equals(str1) :" + "Hello".equals(str2));// true
}
}
装箱机制:
n1=300,n1是Integer类型,会自动创建一个新的integer对象,
基本类型300变成integer类型放入n1所指对象的属性里 n1=100,n2=100,
n1会先在常量池内寻找是否有属性值为100的Integer对象,
若没有,就会在常量池里创建一个Integer对 象,开辟属性空间100(没有属性名),方法空间tostring()和equals(),
然后把这个对象的地址给局部变量n1,
到n2的时 候,不会先创建对象,而是在常量池中找到属性值为100的Integer对象,
然后把该对象的地址赋给n2局部变量;
注意:
常量池中村的Integer范围在-128~127内,超出范围就不存在常量池里
创建字符对象:
New string()创建两个对象: 一个在常量池,一个在堆区
堆里的对象用户自己管理;
常量池的对象由虚拟机管理;
强制类型转换
代码实例:
public class Test4 {
public static void main(String[] args) {
Test4 t = new Test4();
t.getRun(3.14);
}
public void getRun(double x) {
int temp = (int)x;//强制类型转换
//要求必须输出一个整数
System.out.println(temp);
}
}