1、Switch能否用string做参数?
在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型(枚举类型),从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
解释:
expr可能是一个枚举类型,或者一个整数的表达式(int 或Integer),而short byte char可以默认隐式的转换为int类型,所以可以而double和float不行
从JDK1.7之后expr支持string类型
本质上来说,对string的支持,其实还是对int类型的支持
不懂就写:
enum类型
enum类型是一种特殊的类型,他的值包含在一个命名的常量集合中。这些常量称为枚举符。
说明:枚举变量同struct和union一样,可以使用不同的方式说明。
//ex: enum week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; enum week a,b,c; //或:ex: enum week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }a,b,c; //或: enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }a,b,c;
枚举符表中的标识符声明为int类型的常量,它可以出现在常量可以出现的任何地方。
如果其中不含有 = 的枚举符,则相应常量值从0开始,且枚举常量值从左至右依次递增1。enum week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }day;
如上定义week,其结果Monday = 0,Tuesday = 1…Sunday = 6
如果其中含有 = 的枚举符,则该枚举符的值由该表达式指定,其前面标识符遵守之前的规则(即:从零开始,从左至右依次递增1或从前面含有 = 的枚举符的值开始递增),其后的标识符的值从该值开始依次递增。enum week { Monday, Tuesday = 2, Wednesday, Thursday = 3, Friday, Saturday, Sunday }day;
如上所定义,则其结果为Monday = 0,Tuesday = 2,Wednesday = 3,Thursday = 3,Friday = 4…Sunday = 6.
当枚举类型和枚举变量放在一起定义时,枚举类型的名字(就是enum week中的week)可以省略不写,意思是上图的有两种写法
第一种:
enum week{Mon = 1, Tues, Wed, Thurs}num;第二种:
enum {Mon = 1, Tues, Wed, Thurs}num;
注意:
1、同一作用域中的各枚举符的名字必须互不相同,也不能与普通变量名相同,但其值可以相同。
2、枚举值是常量,不是变量,不能在程序中用赋值语句在对其赋值
ex: Friday = 1;
Sunday = 2;
Saturday = Sunday; //这种方式都是错误的
3、只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量,如果一定要使用,则一定要强制类型转换enum week{Mon = 1, Tues, Wed, Thurs}num; num = (enum week)10; printf("%d", num);
上面的代码中,在对枚举变量赋值10的时候进行的强制类型转换,将整型常量10转换成了enum week类型再赋值给num变量。
总结:
1、在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1
2、在部分显示说明的情况下,未指定的枚举名的值将依着之前最有一个指定值向后依次递增
3、一个整数不能
直接赋值
给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值4、同一枚举类型中不同的枚举成员可以具有相同的值
5、同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量)
2、equals与==的区别。
== 和 Equals 的区别
1. == 是一个运算符。
2.Equals则是string对象的方法,可以.(点)出来。
我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较
1、基本数据类型比较
==和Equals都比较两个值是否相等。相等为true 否则为false;
2、引用对象比较
==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;主要区别在于前者是方法后者是操作符。“==”的行为对于每个对象来说与equals()是完全相同的,但是equals()可以基于业务规则的不同而重写(overridden )。“==”习惯用于原生(primitive)类型之间的比较,而equals()仅用于对象之间的比较。
==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。
分开讲解:
一、java当中的数据类型和“==”的含义:
- 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
- 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。
二、equals()方法介绍:
JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,equals的源码是这样写的:
public boolean equals(Object obj) { //this - s1 //obj - s2 return (this == obj); }
可以看到,这个方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String、Integer、Date。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。
所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。总结
== 的作用:
基本类型:比较的就是值是否相同
引用类型:比较的就是地址值是否相同
equals 的作用:
引用类型:默认情况下,比较的是地址值。
注:不过,我们可以根据情况自己重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同
public class ObjectDemo{ public static void main(String[] args) { String s1 = "Hello"; String s2 = new String("Hello"); s2 = s2.intern(); System.out.println(s1 == s2); // true System.out.println(s1.equals(s2)); // true } }
java.lang.String的intern()方法 "abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。
intern()方法
如果字符常量池中已经包含一个等于此String对象的字符串,则返回常量池中字符串的引用,否则,将新的字符串放入常量池,并返回新字符串的引用’
理解
package com.tangbaobao.test1; import org.junit.jupiter.api.Test; public class Test2 { @Test public void fun1(){ String str1 = new StringBuilder("计算机").append("软件").toString(); String str2 = new StringBuilder("Ja").append("va").toString(); String str3 = "java"; String str4 = new String("java"); System.out.println(str1.intern() == str1);//因为之前没有所以创建的引用和intern()返回的引用相同 System.out.println(str2.intern() == str2);//"java在StringBuilder()之前已经出现过",所以intern()返回的引用与新创建的引用不是同一个 System.out.println(str3 == str4); } }