美文网首页
java基础面试知识点

java基础面试知识点

作者: AR7_ | 来源:发表于2017-06-30 21:33 被阅读93次

    1、

    JRE=JVM(虚拟机)+核心类库
    JDK=JRE+JAVA开发工具
    

    2、

    基本数据类型(4类8种)
    
    整数型
         byte 一个字节(-128~127)
        short 两个字节(-2^15~2^15-1)
        int   四个字节(-2^31~2^31-1)
        long  八个字节(-2^63~2^63-1)
    
    浮点型
        float 四个字节 单精度
        double 八个字节 双精度
    
    字符型
        char 两个字节 (0~65535)
    
    布尔型
        ture 理论上占有八分之一个字节,但是JAVA中没有明确指定大小
        false
    
    从小到大排序为:
        byte,char,short < int < long < float < double
    

    3、

    单独使用:(++i和i--)
         放在操作数的前面和后面效果一样。
    
    参与运算使用:
         放在操作数的前面,先自增或者自减,然后再参与运算。
         放在操作数的后面,先参与运算,再自增或者自减。
    

    4、

    ^的特点:一个数据对另一个数据位异或两次,该数本身不变。
    

    5、

    if语句和三元运算符的区别
    
        三元运算符实现的,都可以采用if语句实现。反之不成立。
    
        什么时候if语句实现不能用三元改进呢?
    
            当if语句控制的操作是一个输出语句的时候就不能。
            为什么呢?因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。
    

    6、switch

    基本数据类型可以接受byte short char int;
    引用数据类型可以接受枚举(JDK1.5),String字符串(JDK1.7)
    
        1、break可以省略吗?
                最后一个可以省略,其他最好不要省略
                会出现一个现象:case穿透。
                最终我们建议不要省略
            
        2、default一定要在最后吗?
                不是,可以在任意位置。但是建议在最后。
            
        3、switch语句的结束条件
                a:遇到break就结束了
                b:执行到switch的右大括号就结束了
    

    7、switch语句和if语句的各自使用场景

        switch建议判断固定值的时候用
        if建议判断区间或范围的时候用
    

    8、for循环和while循环的区别:

    如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。
    
    不知道用谁就用for循环。因为变量及早的从内存中消失,可以提高内存的使用效率。
    

    9、面向对象(成员变量和局部变量的区别)

    A:在类中的位置不同
        成员变量:在类中方法外
        局部变量:在方法定义中或者方法声明上
    
    B:在内存中的位置不同
        成员变量:在堆内存(成员变量属于对象,对象进堆内存)
        局部变量:在栈内存(局部变量属于方法,方法进栈内存)
    
    C:生命周期不同
        成员变量:随着对象的创建而存在,随着对象的消失而消失
        局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
    
    D:初始化值不同
        成员变量:有默认初始化值
        局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
    

    10、静态变量和成员变量的区别

    静态变量也叫类变量  成员变量也叫对象变量
    
    A:所属不同
         静态变量属于类,所以也称为为类变量
         成员变量属于对象,所以也称为实例变量(对象变量)
    
    B:内存中位置不同
         静态变量存储于方法区的静态区
         成员变量存储于堆内存
    
    C:内存出现时间不同
         静态变量随着类的加载而加载,随着类的消失而消失
         成员变量随着对象的创建而存在,随着对象的消失而消失
    
    D:调用不同
         静态变量可以通过类名调用,也可以通过对象调用
         成员变量只能通过对 象名调用
    

    11、封装好处

         1、隐藏实现细节,提供公共的访问方式
         2、提高了代码的复用性
         3、提高安全性
    

    12、private关键字特点(private只是封装的一种表现形式,不能说封装就是private)

         a:是一个权限修饰符
         b:可以修饰成员变量和成员方法
         c:被其修饰的成员只能在本类中被访问
    

    13、final修饰特点

         修饰类,类不能被继承
         修饰变量,变量就变成了常量,只能被赋值一次
         修饰方法,方法不能被重写
    

    14、static关键字的特点

        a:随着类的加载而加载
        b:优先于对象存在
        c:被类的所有对象共享
        d:可以通过类名调用
            其实它本身也可以通过对象名调用。
            推荐使用类名调用。
            静态修饰的内容一般我们称其为:与类相关的,类成员
    

    13、常见代码块的应用

        a:局部代码块 
             在方法中出现;限定变量生命周期,及早释放,提高内存利用率
        b:构造代码块 (初始化块)
             在类中方法外出现;多个构造方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
        c:静态代码块 
             在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。
             一般用于加载驱动
        c:同步代码块 
    

    14、

    A:继承的好处
    
        a:提高了代码的复用性
        b:提高了代码的维护性
        c:让类与类之间产生了关系,是多态的前提
    
    B:继承的弊端
    
        类的耦合性增强了。
        开发的原则:高内聚,低耦合。
        耦合:类与类的关系
        内聚:就是自己完成某件事情的能力
    

    15、this和super都代表什么?

        this:代表当前对象的引用,谁来调用我,我就代表谁
        super:代表当前对象父类的引用
    

    16、方法重写的面试题

     Override和Overload的区别?Overload能改变返回值类型吗?
    
        overload可以改变返回值类型,只看参数列表
        方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的
        方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。
    

    17、多态前提

        a:要有继承关系。
        b:要有方法重写。
        c:要有父类引用指向子类对象。
    

    18、多态中的成员访问特点

        成员变量
            编译(报不报错)看左边(父类),运行(输出结果)看左边(父类)。
    
        成员方法
            编译看左边(父类),运行看右边(子类)。
    
        静态方法
            编译看左边(父类),运行看左边(父类)。
            (静态和类相关,算不上重写,所以,访问还是左边的)
            只有非静态的成员方法,编译看左边,运行看右边 
    

    19、一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

           1、可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
    
        2、abstract不能和哪些关键字共存?
    
            abstract和static
                被abstract修饰的方法没有方法体
                被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的
            abstract和final
                被abstract修饰的方法强制子类重写
                被final修饰的不让子类重写,所以他俩是矛盾
            abstract和private
                被abstract修饰的是为了让子类看到并强制重写
                被private修饰不让子类访问,所以他俩是矛盾的
    

    20、接口成员特点

        成员变量;只能是常量,并且是静态的并公共的。
                默认修饰符:public static final
                建议:自己手动给出。
    
        构造方法:接口没有构造方法。
    
        成员方法:只能是抽象方法。
                默认修饰符:public abstract
                建议:自己手动给出。
    

    21、内部类访问特点

        a:内部类可以直接访问外部类的成员,包括私有。
        b:外部类要访问内部类的成员,必须创建对象。
        外部类名.内部类名 对象名 = 外部类对象.内部类对象;
    

    22、局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?

        因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法
        弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果
        用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
        但是jdk1.8取消了这个事情,所以我认为这是个bug
    

    23、

    1、==是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值。
    
    2、equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重写Object类中的equals方
    法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性
    

    24、

      A:int -- String
        a:和""进行拼接
        b:public static String valueOf(int i)
        c:int -- Integer -- String(Integer类的toString方法())
        d:public static String toString(int i)(Integer类的静态方法)
    
    B:String -- int
        a:String -- Integer -- int
        b:public static int parseInt(String s)
    

    25、JDK5的新特性

        1、自动装箱:把基本类型转换为包装类类型
           自动拆箱:把包装类类型转换为基本类型
        2、泛型
        3、可变参数
        4、静态导入
        5、增强for循环
        6、互斥锁
        7、枚举
    

    26、JDK7新特性

        A:二进制字面量
        B:数字字面量可以出现下划线
        C:switch 语句可以用字符串
        D:泛型简化,菱形泛型
        E:异常的多个catch合并,每个异常用或|
        F:try-with-resources 语句 1.7版本自动关流的
    

    26、

    A:字符类
        [abc] a、b 或 c(简单类) 
        [^abc] 任何字符,除了 a、b 或 c(否定) 
        [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) 
        [0-9] 0到9的字符都包括
    
    B:预定义字符类
        . 任何字符。
        \d 数字:[0-9]
        \w 单词字符:[a-zA-Z_0-9]
    
    C:Greedy 数量词 
        X? X,一次或一次也没有
        X* X,零次或多次
        X+ X,一次或多次
        X{n} X,恰好 n 次 
        X{n,} X,至少 n 次 
        X{n,m} X,至少 n 次,但是不超过 m 次 
    

    27、数组和集合的区别

        区别1 : 
            数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
            集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
        区别2:
            数组长度是固定的,不能自动增长
            集合的长度的是可变的,可以根据元素的增加而增长
    

    28、List集合的特有功能概述

        void add(int index,E element)
        E remove(int index)
        E get(int index)
        E set(int index,E element)
    

    29、List的三个子类的特点(有序(存取一致),有索引,可以存重复对象)

        ArrayList:
            底层数据结构是数组,查询快,增删慢。
            线程不安全,效率高。
        Vector:
            底层数据结构是数组,查询快,增删慢。
            线程安全,效率低。
    
        Vector相对ArrayList查询慢(线程安全的)
        Vector相对LinkedList增删慢(数组结构)
    
        LinkedList:
            底层数据结构是链表,查询慢,增删快。
            线程不安全,效率高。
    
        Vector和ArrayList的区别
            Vector是线程安全的,效率低
            ArrayList是线程不安全的,效率高
        共同点:都是数组实现的
    
        ArrayList和LinkedList的区别
            ArrayList底层是数组结果,查询和修改快
            LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
        共同点:都是线程不安全的
    

    30、set集合两个子类(HashSet和TreeSet)(无序(存取不一致),无索引,不可以存储重复对象)

        HashSet保证元素唯一,重写hashcode方法和equals方法 (子类LinkedHashSet 可以保证怎么存就怎么取)
        TreeSet实现Comparable接口,或者传入比较器Comparator;
    

    31、

    a.自然顺序(Comparable)
        * TreeSet类的add()方法中会把存入的对象提升为Comparable类型
        * 调用对象的compareTo()方法和集合中的对象比较
        * 根据compareTo()方法返回的结果进行存储
    b.比较器顺序(Comparator)
        * 创建TreeSet的时候可以制定 一个Comparator
        * 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
        * add()方法内部会自动调用Comparator接口中compare()方法排序
        * 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
    c.两种方式的区别
        * TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
        * TreeSet如果传入Comparator, 就优先按照Comparator
    

    32、

      1.List
        a.普通for循环, 使用get()逐个获取
        b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
        c.增强for循环, 只要可以使用Iterator的类都可以用
        d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
    
    2.Set
        a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
        b.增强for循环, 只要可以使用Iterator的类都可以用
    
    3.普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除   
        普通for循环可以删除,不过索引要减减;
        迭代器可以删除,不过要用自身的方法
        增强for循环不能删除
    

    33、Map接口和Collection接口的不同

        Map是双列的,Collection是单列的
        Map的键唯一,Collection的子体系Set是唯一的
        Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
    

    34、HashMap和Hashtable的区别

        相同点:底层都是哈希算法,都是双列集合
        Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
        Hashtable不可以存储null键和null值,HashMap可以存储null键和null值
    

    35、Java中的异常被分为两大类:编译时异常和运行时异常。

        1、所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
    
        2、编译时异常
            Java程序必须显示处理,否则程序就会发生错误,无法通过编译
        3、运行时异常
            无需显示处理,也可以和编译时异常一样处理
    

    36、throws和throw的区别

        1、throws
            用在方法声明后面,跟的是异常类名
            可以跟多个异常类名,用逗号隔开
            表示抛出异常,由该方法的调用者来处理
        2、throw
            用在方法体内,跟的是异常对象名
            只能抛出一个异常对象名
            表示抛出异常,由方法体内的语句处理
    

    37、final,finally和finalize的区别

        1、final修饰类,不能被继承
                修饰方法,不能重写
                修饰变量,只能赋值一次
    
        2、finally是try语句中的一个语句体,不能单独使用,用来释放资源
    
        3、finalize是一个方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾器调用此方法
    

    38、异常注意事项

        a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
    
        b:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
    
        c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
    

    39、流按流向分为两种:输入流,输出流。

        流按操作类型分为两种:
            字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
            字符流 : 字符流只能操作纯字符数据,比较方便。
    

    40、IO流常用父类

        1、字节流的抽象父类:
              InputStream 
              OutputStream
    
        2、字符流的抽象父类:
              Reader 
              Writer    
    

    41、read()方法读取的是一个字节,为什么返回是int,而不是byte?

      因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取
    都返回byte,有可能在读到中间的时候遇到111111111,那么这11111111是byte类型的-1,我们的程序是遇到-1就会停
    止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上,24个0凑足4个字
    节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型
    

    42、IO流(flush和close方法的区别)

    flush()方法
        用来刷新缓冲区的,刷新后可以再次写出 
    close()方法
        用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出 
    

    43、字符流不可以拷贝非纯文本的文件

        因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去
        如果是?,直接写出,这样写出之后的文件就乱了,看不了了  
    

    44、并行、并发

        1、并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)
     2、并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。
    

    45、多线程(两种方式的区别)

      查看源码的区别:
        a.继承Thread : 由于子类重写了Thread类的run(), 当调用start()时, 直接找子类的run()方法
        b.实现Runnable : 构造函数中传入了Runnable的引用, 成员变量记住了它, start()调用run()方法时内部判断成员变
          量Runnable的引用是否为空, 不为空编译时看的是Runnable的run(),运行时执行的是子类的run()方法
    
        继承Thread
            好处是:可以直接使用Thread类中的方法,代码简单
            弊端是:如果已经有了父类,就不能用这种方法
        实现Runnable接口
            好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
            弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂
    

    46、线程的五种状态

        新建-就绪-运行-阻塞-死亡
    

    47.加载

        加载就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。
    

    48、类加载器

        1、类加载器的分类
    
            Bootstrap ClassLoader 根类加载器
            Extension ClassLoader 扩展类加载器
            Sysetm ClassLoader 系统类加载器
    
        2、类加载器的作用
            Bootstrap ClassLoader 根类加载器
            也被称为引导类加载器,负责Java核心类的加载
            比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
    
        Extension ClassLoader 扩展类加载器
            负责JRE的扩展目录中jar包的加载。
            在JDK中JRE的lib目录下ext目录
    
        Sysetm ClassLoader 系统类加载器
            负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径
    

    49、三种方式

        a:Object类的getClass()方法,判断两个对象是否是同一个字节码文件
        b:静态属性class,锁对象
        c:Class类中静态方法forName(),读取配置文件
    

    50、一个类的实例化过程有哪些步骤?(*面试题)

    Student s = new Student(); 在内存中到底执行了哪些步骤。
    1,加载 Sutdent.class 文件进内存(类加载器),加载类的字节码文件。
    2,在栈内存为 s 变量申请一个空间
    3,在堆内存为 Student 对象申请空间
    4,对类中的成员变量进行默认初始化
    5,对类中的成员变量进行显示初始化
    6,有构造代码块就先执行构造代码块,如果没有,则省略
    7,执行构造方法,通过构造方法对对对象数据进行初始化
    8,堆内存中的数据初始化完毕,把内存值复制给 s 变量
    

    51、抽象类和接口的区别? (*面试题)

    A:成员区别
        抽象类:
            成员变量:可以是变量,也可以是常量。
            构造方法:有。
            成员方法:有,可以是抽象的,也可以是非抽象的。
        接口:
            成员变量:只能是常量。默认修饰符:publci static final
            构造方法:没有,子类数据的初始化默认走的是 Ojbect 类的构造方法。
            成员方法:只能是抽象的,默认修饰符是:publci abstract
    
    B:类与接口的关系区别
    
        类与类:
            继承关系,单继承。
        类与接口:
            实现关系,单实现、多实现。
        接口与接口:
            继承关系,单继承、多继承。
    
    C:设计理念的区别
    
        抽象类被继承体现的是:is a 的关系。抽象类中一般定义的是整个继承结构的共性功能。
        接口被实现体现的是:like a 的关系。接口中一般定义的是整个继承结构的扩展功能。
    

    52、String s1 = new String("hello");和 String s2 = "hello";的区别?(*面试题)

        有区别,区别是:前者创建了两个对象,后者创建了一个对象。
    

    53、String、StringBuffer、StringBuilder 的区别?(*面试题)

        String:字符长度是固定的。
        StringBuffer/StringBuilder:字符长度是可变的。
        StringBuffer:安全的,但效率较低一些。
        StringBuilder:不安全的,但效率较高一些。
        StringBuffer 和 StringBuilder 兼容。
    

    54、集合和数组有什么区别?(*面试题)

    集合:
        长度可以发生改变。
        只能存储对象类型,引用类型。
        可以存储任意类型的对象。
    数组:
        长度固定。
        可以存储基本类 型,也可以存储对象类型。
        只能存储同一种类型的元素。
    

    55、用迭代器遍历集合的时候,用集合修改集合有没有问题?如果有,怎么解决?(*面试
    题)

        有问题,因为会出现并发修改异常。
        解决方法有多种,比如,我们可以不通过集合来修改集合,而使用迭代器来修改集合。
        像 ListIterator 迭代器就有添加方法。
    

    56、HashSet 如何保证元素唯一性的呢?

        底层数据结构是哈希表(散列表)。具体的是由一个元素是单向链表的数组组成。
        它依赖于两个方法:hashCode()和 equals()方法。
        执行顺序:先判断 hashCode()是否相同,
        如果相同,继承执行 equals()方法,看其返回值:true:元素重复,不存储。false:元素不重复,存储。
        如果不同,存储。
        记住:看到 HashXxx 结构的集合,就要知道,被该集合存储的元素要重写 hashCode()和 equals()方
        法。而且,是自动生成的。
    

    57、TreeSet 底层数据结构是什么?如何保证元素的唯一性的呢?

        底层数据结构是二叉树。根据比较的返回值是否是 0 来决定。
        如何保证元素的排序的呢?
        A:自然排序 元素具备比较性让集合中被存储的元素所属的类实现 Comparable 接口。
        B:比较器排序 集合具备比较性在创建集合对象的时候,让构造方法接收一个Comparator接口的子类对象。
    

    58、LinkedHashSet 底层数据结构是什么?如何保证元素的唯一性的呢?

        底层由链表和哈希表组成。由链表保证有序。由哈希表保证唯一。
    

    59、什么是可变参数?

        针对在写一个方法的时候,不知道具体要有多少个形式参数的时候。
        java 提供了可变参数的用法。
        注意:
            A、变量其实是该数据类型的一个数组。
            B、形式参数如果有多个的话,可变参数只能是最后一个。C:数据类型要一致。
    

    60、Map 和 Collection 集合的区别?(*面试题)

        A:Map 集合存储的是键值对形式的元素。
          Collection 集合存储的是单个的元素。
    
        B:Map 集合的键是唯一的。
          Collection 的儿子 Set 集合元素是唯一的。
    
        C:Map 集合的值是可以重复的。
          Collection 的儿子 List 集合的元素是可以重复的。
    

    61、Hashtable 和 HashMap 的区别?(面试题)

        A:HashMap 线程不安全,效率高。允许 null 键和 null 值。
        B:Hashtable 线程安全,效率低。不允许 null 键和 null 值。
    

    62、Collection 和 Collections 有什么区别?

        Collection:是集合的顶层接口,定义了集合的通用方法。
        Collections:是一个工具类,里面定义了对集合进行操作的一些常见方法,排序,查找。
    

    63、什么是递归?使用递归需要注意哪些?

        递归就是方法定义中调用方法本身的现象。
            A:递归一定要有出口,否则就是死递归。
            B:递归的次数不能太多,否则内存溢出。
            C:构造方法不能递归使用。
    

    64、基本的 IO 流有哪些?(*面试题)

        字节流:InputStream、OutputStream、FileInputStream、FileOutputStream、
        字符流:Writer、Reader、FileWriter、FileReader、
        高效字节流:BufferedInputStream、BufferedOutputStream
        高效字符流:BufferedWriter、BufferedReader
        最开始的时候,只有字节流,但是后来由于中文字符或者其他字符的出现,用两个字节才能表示。
        如果用字节流也是可以读写字符文件的数据的,但是比较麻烦。为了简化这种操作,就提供了字符流。
    

    65、启动线程调用的是 run()还是 start()方法?run()和 start()的区别是什么?(*面试题)

        启动线程调用的是 start()
        run()封装了被线程执行的代码,start()是启动线程并调用 run()方法。
    

    66、线程的生命周期? (*面试题)

        新建: 创建线程对象
        就绪: 具备 cup 执行资格,没有执行权,随时准备执行
        运行: 具备执行资格,执行权,执行 run()中的代码
        堵塞: 是当线程运行到符合某个我们定义的条件时,它会停止下来等待唤醒
        死亡: run()结束了。
    

    67、多线程为什么会出现安全问题?怎么解决呢?(*面试题)

        如果满足以下条件,那么就会出现安全问题:
            A:是多线程程序。
            B:有共享的数据。
            C:针对共享数据有多条语句操作。
        只要我们把多线程环境中,把操作共享数据的操作,变成单线程就没有问题了。
        Java 针对这种情况,就提供了同步技术:
            A:同步代码块
            B:同步方法
            C:JDK5 以后的 Lock 锁。
    

    68、同步的锁对象分别是?(*面试题)

        代码块:任意对象
        方法:this
        静态方法:类名.class
    

    69、sleep()和 wait()的区别?(*面试题)

        sleep():必须指定时间,不释放锁对象。
        wait():可以指定时间,也可以不指定。释放锁对象。
    

    70、线程死锁是什么,为什么有死锁,怎么解决死锁?(*面试题)

        为了解决程序因占用资源,出现资源争抢,而出现的程序进入等待的状态(死锁)。
    
        举例:有 A 和 B 两个线程,有 CD 两把锁, A 和 B 嵌套 CD 锁,A 线程中有 C,D 锁,B 线程
        中有 D C 两把锁,当两个线程运行时,就可能会出现死锁导致程序停滞的情况。
    
        怎么解决:真正意义上来说,死锁是不能被解决的,死锁是多线程中的一个需要避免的重大的问题,当
        我们在编写程序时,可以给共享的资源加上另外一个把锁,控制资源的动态,同时可以设置线程的优先
        级使线程之间协调合理的利用 CPU 的时间。
    

    71、线程间的通信是什么?

        等待唤醒机制,不同种类的线程针对同一个资源的操作。
    

    72、什么是网络编程?

        用编程语言来实现计算机的资源共享和信息传递,就叫做网络编程。
    

    73、网络通信三要素是什么? (*面试题)

        A:IP 地址
            计算机在网络中的唯一标识。
            现在使用的是:"点分十进制"
        B:端口
            应用程序的的标记。
        C:协议
            通信的规则。
    

    74、UDP 和 TCP 的区别? (*面试题)

        UDP:不建立连接,数据打包传输,数据有限制 64K,数据不可靠,速度快。
        TCP:通过三次握手建立连接,数据无限制,数据可靠,速度慢。
    

    75、反射是什么?反射获取字节码文件的三种方式?反射的好处?(*面试题)

        在运行状态下,通过 class 文件对象(Class 的对象),去使用构造方法,成员变量,成员方法。就是反射。
    
        3 种方法:
            A.用 Object 类的 getClass 方法得到。
            B.用任意数据类型的静态 class 属性可以得到
            C.用 Class 类的静态方法 forName(String className)方法得到
    
        好处:只要有一个类或者一个类的对象,就可以得到这个类或对象的所有属性和方法。包括私有的。
    

    76、集合总结

    (有好的内容继续添加。。。)

    相关文章

      网友评论

          本文标题:java基础面试知识点

          本文链接:https://www.haomeiwen.com/subject/ecwicxtx.html