zoukankan      html  css  js  c++  java
  • Java面试集合(七)

    标题图

    前言:

    Java面试集合(六)
    的回顾,对于final可以修饰常量,方法,和类,一旦常量定义好后就不可改变,而方法,用final来修饰方法,方法不可重载,继承,重写,final用来修饰类,该类不能被继承。

    抽象abstract,不能够有对象,即不能进行实例化,但又构造方法,在抽象修饰类时,这个抽象类,不一定有抽象方法,但是在类中有抽象方法,那么这个类就一定是抽象类。

    在抽象类中的所有抽象方法,子类一旦继承抽象类,就要重写父类(即抽象类)中的所有抽象方法,但是连子类都是抽象类就不用,如果该子类继承了抽象的父类,子类也是抽象类,就不用。

    抽象方法是没有方法体的,因为抽象方法是抽象功能的,在子类中实现,抽象方法可以被重载,即参数等不同。抽象方法不能再用static/final/private来修饰。

    接口interface的抽象方法用public abstract来修饰,属性用public static final来修饰。

    接口是没有实例化对象的,也没有构造方法

    内部类的分类为,方法的内部类,成员的内部类,静态内部类,匿名内部类。

    包的基础(package)和垃圾回收机制基础。

    1. Object对象

    所有类的父类Object,因为任何一个类都是直接或者间接的继承Object类,都是Object的子类,Object是类层次结构的根类,存在java.lang.Object中。

    getClass可以获取对象的实际类型
    toString可以返回对象的地址
    equals可以判断两个对象是否相等

    对象和类的关系进行判断:instanceof

    class A {}
    class B extends A {}
    interface D{}
    class C extends B implements D {}
    B b = new C();
    b instanceof A --- true
    b instanceof B --- true
    b instanceof C --- true 
    b instanceof D --- true

    构造方法:public Object()

    • finalize()方法:java的垃圾回收时机
    • Object的toString()方法:返回的是对象的字符串形式
    • Object的equals()方法:比较两个对象是否相等

    复习:

    • 二进制:以0b/0B作为开头 (0~1,满2进1)
    • 八进制:以0作为开头(0~7,满8进1)
    • 十进制:没有特殊标识(0~9,满10进1)
    • 十六进制:以0X/0x作为开头(09,af,满16进1)

    进制间的转化

    • 十进制转二进制:不断除以2,然后取余数
    • 二进制转十进制:从最低位依次乘以2的位次次幂,然后求和

    同理:

    十进制转其他进制:除以对应的进制数,然后取余数
    其他进制转十进制:从最低位依次开始,按位次乘以进制的位次次幂,然后求和

    二进制转八进制,也是从低位开始,每三位二进制为一组,产生一个八进制数字,最高位不足三位,就补0,凑齐三位即可。

    口诀:三变一

    八进制转二进制,每一位八进制数都会产生三位二进制数字,不足三位就补0即可。

    口诀:一变三

    同理

    二进制转十六位进制:口诀为四变一
    十六位进制转二进制:口诀为一变四

    Bin为二进制,Oct为八进制,Dec为十进制,Hex为十六进制

    2. String类

    Java中的字符串属于对象,那么Java 中提供了 String 类来创建和操作字符串,即是使用对象;因为String类修饰的字符一旦被创建就不可改变,所以当对字符串进行修改的时候,需要使用到StringBufferStringBuilder 类。

    String类是用来修饰字符串的,字符串是一种特殊的对象,一旦初始化就不可被改变,用String修饰的字符串变量是不可以被改变的。

    例子:

    //定义一个字符串
    String str = "hello world";
    String str = new String("hello world");

    对于String类,存在java.lang.String中,String类代表字符串,如何实现字符串的字面值,就是用此类来实例的。

    String类,代表字符串的类,如何的字符串都是String的对象。字符串是作为常量,被双引号包着的为常量,被初始化即不可被更改。那么接下来举个例子效果。

    String i = "123";
    System.out.println("i="+i);
    //结果为
    i=123
    
    如果添加以下
    String i = "123";
    i = "12"
    System.out.println("i="+i);
    //结果为
    i=12
    
    // 看到这个效果,你会认为不是改了吗?
    // 其实不是的,而是新创建了一个对象而已。

    String中,对象是不可变的,但可以共享的。那么怎么理解是共享的呢?这里引出常量池的概念,如下:

    //多个引用指向同一个字符串
    String str1 = "dashu"
    String str2 = "dashu";
    System.out.println(str1==str2);
    //结果
    true

    true代表它们同时指向一个字符串,即为对象。创建了一个str1对象,字符串常理为"dashu",那么再次创建一个对象时,常理名相同,在常量池中发现有相同的"dashu",那么就同时指向一个值。

    常量池是放置常量的,如果有相同的值,就不用创建对象,第一个创建的字符串放在常量池中,如果要用的时候,就拿来用。

    // 字符串在底层是以字符数组形式来存储的
    String str = “ab”; 
    String str = new String(“ab”);
    String s = “a”;
    s = s + “b”;
    //内容相同,但是创建方式不同的情况
    String str3 = "abc"
    String str4 = new String ("abc");
    System.out.println(str3==str4);//false
    System.out.println(str3.equals(str4));//true
    //结果
    false
    true
    // 100个元素拼接成一个字符串,使用+进行拼接
    // 整个过程产生301个
    String[] arr = { /*100个元素*/ };
    // 为 1
    String str = “”;
    
    for(String s : arr){
    str += s; 
    // 每拼接1次,要多产生3个对象。
    // 一共100个元素,拼接100次,意味着要多产生300个元素
    }

    String代表是字符串的类,而字符串本身就是常量,字符串在底层是以字符数组形式存储的,字符串是共享的,在常量池中

    StringBuffer

    对于字符串是常量,它的值在创建后时不可以改变的,但字符串缓冲区支持可变的字符串。

    StringBuffer类为java.lang中,StringBuffer为字符串缓冲,StringBuffer为线程安全的可变字符序列,类似String的字符串缓冲区,缓冲区不能改,但里面可以改,通过某方法可以改变序列的长度和内容。

    StringBuffer提供了主要的两种方法,一,append() ,二, inset()

    StringBuffer为一个字符串缓冲区,相对于一个容器,长度是可变的,可以存储任意类型数据,是将任意数据转变为字符串进行存储,StringBuffer提供了对数据的很多的操作功能。

    例子:

    StringBuffer sb = new StringBuffer();
    sb.append("da");
    sb.append("shu");
    System.out.println(sb);
    //sb.append("da").append("shu");

    如果要操作数据,要转换为字符串。StringBuffer所有存储的元素都被转成字符串才可使用。

    String str = sb.append("da").append("shu").toString();

    在指定位置插入元素

    sb.insert(2,"hehe");//插入

    StringBuilder的效率要远高于用“+”,需要拼接多个字符串,建议使用StringBuilder

    StringBuffer和StringBuilder的区别

    StringBuilder是线程不安全的,StringBuffer是线程安全的

    StringBuilderjava.lang类,是一个可变的字符序列,提供了与StringBuffer兼容的APIStringBufferStringBuilder方法是一模一样的。

    StringBuilder不同步,不安全。如果同时append(),delete(),insert(),会导致出错,多线程访问不安全,添加修饰synchronized即可。在jdk1.5版本后,推出StringBuilder被用作一个StringBuffer的简易替换,用在字符串缓冲区被单个线程使用的时候。

    3. 装箱与拆箱

    封装类有:Byte , short , Integer , Character , long , Float , Double 记住这些类就可以了,这些都是Number的子类。

    包装类

    byte
    Byte
    short
    Short
    int
    Integer
    long
    Long
    float
    Float
    double
    Double
    char
    Character
    boolean
    Boolean
    void
    Void

    自动封箱/自动装箱

    底层默认调用valueOf方法进行封箱

    自动拆箱

    ***Value()进行拆箱

    自动封装,将基本类型的变量赋值给对应的引用类型对象
    自动拆箱,将引用类型的变量赋值给对应的基本类型变量

    public class Test{
     public static void main(String[] args){
      int i = 5;
      Integer integer = new Integer(i);//装箱
      //拆箱
      int i2 = integer.intValue();
     }
    }
    //
    public class Test{
     public static void main(String[] args){
      int i = 5;
      Integer integer = new Integer(i);
      Interger i2 = i;//自动装箱
      int i3 = integer;//自动拆箱
     }
    }
    //
    public class Test{
     public static void main(String[] args){
      char c = 'Vic';
      character c2 = c;
      c3 = c2;
      }
    }

    4. 类Date

    Date代表日期的类

    Date的构造方法

    Date(): 为分配Date对象,并初始化对象
    Date(int year, int month, int date)

    类 Calendar日历的类

    Calendar 类是一个抽象类

    public abstract class Calendar extends Object
    //Calendar 提供了一个类方法 getInstance
     Calendar rightNow = Calendar.getInstance();

    结语

    • 下面我将继续对JavaAndroid中的其他知识 深入讲解 ,有兴趣可以继续关注
    • 小礼物走一走 or 点赞
  • 相关阅读:
    进程与线程的区别
    信号列表详解
    同步与互斥
    互斥锁
    读写锁
    Redis QPS测试
    从分布式锁来看redis和zookpeer!
    JVM虚拟机调参
    log4j.properties配置详解与实例
    生产者消费者(消费者要消费完才能退出)
  • 原文地址:https://www.cnblogs.com/dashucoding/p/11932488.html
Copyright © 2011-2022 走看看