当前位置:首页 » 《关注互联网》 » 正文

Android校招知识点——Java篇(杂,仅供个人参考)(一)_indeedes的博客

24 人参与  2021年09月06日 12:23  分类 : 《关注互联网》  评论

点击全文阅读


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);

    }
}


点击全文阅读


本文链接:http://zhangshiyu.com/post/27139.html

枚举  类型  常量  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1