当前位置:主页 > 查看内容

Java 基础

发布时间:2021-06-10 00:00| 位朋友查看

简介:Java 基础 1.JDK 和 JRE 有什么区别 java development kitjava开发工具包提供开发环境和运行环境 java runtime environmentjava运行环境为java的运行提供了所需的环境 2. 和 equals 的区别是什么 基本类型比较的是值是否相同 引用类型比较的是引用是否相同 e……

Java 基础

1.JDK 和 JRE 有什么区别?

java development kit:java开发工具包,提供开发环境和运行环境

java runtime environment:java运行环境,为java的运行提供了所需的环境

2.== 和 equals 的区别是什么?

==

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

equals不重写的话本质上就是==,其源码就是用的==

总结来说== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是属性值是否相等。

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

不对,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

可以自己重写hashcode(),可以自己定义哈希码的生成规则

object中定义的hashcode方法生成的哈希码和对象本身的属性值无关

hashmap中,借助equals和hashcode方法来完成数据的存储

4.final 在 java 中有什么作用?

final修饰的类不能继承

final修饰的方法不能被重写

final修饰的变量叫常量,常量的值必须初始化,且初始化的值不能被修改

5.java 中的 Math.round(-1.5) 等于多少?

值为-1,round()方法在实现四舍五入的时候实际上是不论正负的,它会先将这个数加上0.5然后在像下取整.

6.String 属于基础的数据类型吗?

不属于,只有8种基础类型,String属于对象

7.java 中操作字符串都有哪些类?它们之间有什么区别?

String:生成的是不可变对象,每调用一次都会创建新的对象,将指针指向新的String

StringBuffer 线程是安全的,适用于多线程

StringBulider线程不安全,适用于单线程

后两者都可以对原有的对象进行操作

8.String str="i"与 String str=new String(“i”)一样吗?

不一样,因为前者生成的数据被存放在常量池中,后者则是放在堆当中

9.如何将字符串反转?

使用StringBuffer或StringBulider的reverse()方法

10.String 类的常用方法都有那些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的 byte 类型数组。
  • length():返回字符串长度。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。
  • equals():字符串比较。

11.抽象类必须要有抽象方法吗?

抽象类不一定需要抽象方法,但有抽象方法的类一定会是抽象类

12.普通类和抽象类有哪些区别?

普通类不能含有抽象方法,抽象类则不一定

抽象类不能实例化,普通类可以实例化

13.抽象类能使用 final 修饰吗?

不能,定义抽象类是为了让其他类继承的,final修饰的类不能被继承

14.接口和抽象类有什么区别?

实现:抽象类继承使用extends,接口则需要使用implements

构造函数:抽象类可以有,接口不能有

main方法:抽象类可以有可以运行,接口类不能有main方法

实现数量:类可以实现多个接口;但是只能继承一个抽象类

访问修饰符:接口中使用的public,抽象类中都可以使用

15.java 中 IO 流分为几种?

分为输入流和输出流

分为字节流(8进制),字符流(16进制)

16.BIO、NIO、AIO 有什么区别?

  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

17.Files的常用方法都有哪些?

  • Files.exists():检测文件路径是否存在。

  • Files.createFile():创建文件。

  • Files.createDirectory():创建文件夹。

  • Files.delete():删除一个文件或目录。

  • Files.copy():复制文件。

  • Files.move():移动文件。

  • Files.size():查看文件个数。

  • Files.read():读取文件。

  • Files.write():写入文件。

    集合类怎么解决高并发问题?

    线程中的非安全的集合类ArrayList、HashSet我们用到的比较多

    普通的安全集合类

    juc

    ConcurrentHashMap

    hashmap线程安全的方式?

    1.通过collections.sychronizedMap()方式,会使用封装类来实现安全,使用sychroized锁住

    2.concurrentmap通过对hashmap重写,使用的是新的锁机制,使用的是NonfaieSync

    描述一下Object类中的常用方法

    toString :返回一个字符串,定义一个对象的字符串表现形式,可以重写方法

    hashCode:

    equals:

    clone:返回一个对象的副本(比创建一个对象方便) 深克隆和浅克隆 重写是要实现Cloneable方法

    finalized:回收

    1.8新特性:

    Lambda表达式(内部类)函数式接口 函数式编程

    重写 重载的区别

    重写:继承中对父类的方法进行重写

    重载:在同一个类当中发生的,减少方法名

    java中的自增是线程安全吗,如何实现线程安全的自增?

    不是安全的

    增加syncahronized进行线程同步

    使用lock、unlock处理Reetrantent锁进行锁定

    hashmap在1.8后的改变

    数据结构:1.7中使用的数据+单向链表1.8中使用数据+单向链表+红黑树1

    链表插入节点的方式:1.7中是头插法1.8尾插法

    为什么hashmap扩容的是两倍?

    1.8扩容之后,需要重新计算元素位置,其中计算时用的与数组长度-1和hash码进行与运算,防守hash冲突

    解决hash冲突的方法

    1.开放定址法2.再哈希法

    3.链地址法,将每一个hash表的next的指针,构成一个单向链表

    4.建立公共溢出区

    用红黑树不用AVL树

    Hashmap为什么使用红黑树?

    在链表长度大于8(泊松分布)的时候,将后面的数据存在红黑树中,加快检索速度

    保证红黑树的查找、插入、删除的时间复杂度最坏为o(log2n)加快检索速度

    AVL平衡度要求高高,会需要使用旋转,左旋,红黑树旋转的次数少,插入删除等效率高

    Tomcat为什么要重写加载类

    类加载器的双亲委派:一次向上询问,然后依次向下回答

    java运行时数据区

    反射,反射会不会影响性能

    运行中可以动态的获取对象,动态的获取信息获取功能就是反射

    反射方式实例化对象比正常的要慢,偶尔使用反射,反射的影响可以忽略不计

    sleep和wait区别

    1.方法所属的类不一样一个是thread中的wait是object类中

    2.暂停了执行指定的时间,让出cpu,sleep不会释放锁

    3.wait会放弃锁

    4.sleep用thread调用,在非同步的状态也可以调用

    syncahroized(jvm)和reentrantlock(jdk)

    相同点:

    1.都用来协调多线程共享对象、变量的访问

    2.都是可重入锁,同一线程可以多次获得同一个锁

    不同点:

    1.reentrantlock可以显式获得释放锁,syncahroized隐式的

    2.在异常中reentrantlock要放在final语句中syncahroized是一个关键字会自动释放线程占有的锁

    3.lock可以让等待锁的线程响应中断,而syncahroized会一直等待下去

    4.lock可以提高多个线程进行读取的效率。多个线程使用共享锁,写线程用的排它锁

    trylock和lock和lockinterruptibly的区别

    1.trylock能获得锁就返回true,不能就立即返回false

    2.lock能获得锁就立刻返回ture,不能的话就一直等待获得锁

    3.lock和lockinterruptibly,若中断两个线程,lock不会抛出异常,后一个会抛出异常

    单例模式有哪些实现方法优缺点

    单例模式:一个类只有能产生一个对象,提高工作效率,减少资源的占用

    组成部分:

    1.私有的构造方法

    2.私有的当前类的对象作为静态属性

    3.共有的向外界提供当前类的对象的静态方法

    有饿汉式,懒汉式,内部式

    饿汉式:上来就直接new一个对象,然后返回这个对象,无法实现延迟类的加载

    懒汉式:当调用的时候先检测是否有这个对象,如果没有就创建对象然后返回,多线程的情况下会同时new多个对象,因此就会加个锁来限制,但是需要判断两次对象是否为空,双重检测锁机制(volatile)定义对象需要加

    静态内部类单例模式:定义一个静态内部的类,然后当使用一个方法时才会静态调用这个内部类的方法

    序列化

    将对象序列化表示为字节序列,方便存入文件数据库,或者读取

    使用的时候:需要通过网络之间发送的话,都需要使用

    实体类都要实现序列化接口

    使用transient关键字可以使对象不序列化

    java基础语法知识

    java运行过程
    1.编译javac,把Java源文件编译成class字节码文件
    2.运行java
    标识符
    1.以字母、下划线 开 头 2. 其 余 部 分 可 以 是 字 母 下 划 线 开头 2.其余部分可以是字母下划线 2.线
    3.不能为关键字

    变量

    1.局部变量:定义在方法内或语句内。从属于方法或语句块,使用之前必须手动初始化

    2.成员变量(实例变量):定义在类里面、方法外面。从属于对象,若没有手动初始化变量,系统会自动初始化。

    数字:0.0,0 布尔:false char:、\u0000

    3.静态变量:定义在类里面、方法外面、使用static修饰从属于类

    数据类型

    1.基本数据类型

    a)数字:整数:byte(1字节)short(2个字节)int默认该类型(4字节)long(8字节)

    浮点数:float(4个字节)double(8字节)默认类型

    byte short char可以自动转化为int 其余则是用强制类型转化

    b)字符char(2个字节)

    c)布尔 boolean(1位)

    2.引用类型(4个字节)

    a)数组

    b)对象

    c)接口

    表达式:

    1.类型的自动提升

    如果有long(double),结果就是long(double)

    2.强制转型

    运算符:

    1.算术运算符

    2.关系运算符

    3.逻辑运算符(与或非)&&,||,!(左右两边均是布尔型)

    &,| (3&4)

    4.位运算符

    &,|,<<(左移一位相当于乘以2),>>>(右移一位相当于除以2)

    5.扩展运算符

    6.三目运算符

    (布尔表达式)?A:B

    控制语句:

    1.顺序结构

    2.选择结构:if if else if else if else switch 多值选择 表达式:int、char short byte

    3.循环结构

    面向对象基础:

    1.对象的进化史

    a)基本数据类型阶段 数据少 无数据结构管理时代

    b)数组 数据多了,将同类型数据放在一起 弱数据管理时代

    c)结构体 数据多了,复杂了。将不同的数据类型的数据放在一起 强管理

    d)对象 数据多了、类型复杂了、行为也复杂了。将不同类型的数据放在一起

    2.对象和类:对象是具体的,类是抽象的。类是一个模板,通过类的模板new对象

    定义类:

    (public)class(类名){

    //属性

    private 修饰 //建议增加相应的getter、seeter方法

    //方法

    //构造方法

    }

    构造方法:

    1.方法名必须和类名一致

    2.无返回类型

    3.通过new来调用

    4.无参构造器问题

    a)如果为手动定义构造器,系统将会自动添加一个无参的构造器

    b)如果定义过则不会添加

    5.构造方法的第一句总是super,就是调用直接父类的构造方法,有继承关系的构造方法调用顺序

    方法的重载(overload):

    两同(同一个类、同一个方法名)三不同(参数不同:类型、个数、顺序)

    返回值不同不能构成重载

    形参名称不同不能构成重载

    this:普通方法中,调用本方法的对象。构造方法中,正要初始化的对象

    还可以用来调用其他的构造方法

    super:就是调用直接父类的构造方法,有继承关系的构造方法调用顺序

    static:修饰的变量和方法,变成静态变量和静态方法。从属于类 。通过类名可调用实际存储在方法区中

    package:位于非注释行的第一句

    import:引入类

    final:修饰变量:常量(命名规范:全部大写,多个单词之间通过下划线隔开)

    修饰方法:不能被重写

    修饰类:不能被继承

    面向对象的三大特征:

    封装

    通过private、public、default、protected关键字实现属性或者方法的封装

    高内聚、低耦合

    继承

    通过extends 优点:1.代码重用2.通过继承实现对现实世界更加准确的建模

    类只能单继承,没有c++的多继承

    方法的重写:=:方法名保持一致>=子类的权限可以大于等于父类<=子类的返回值类型小于等于父类的类型。子类声明的异常类型不能超过父类的类型

    Object类:

    1.根基类

    2.toString

    3.equal、hashcode

    4.wait、notify、notifyAll

    多态

    三个必要条件:继承、方法的重写、父类引用指向子类对象

    动态绑定、静态绑定:java比较慢

    抽象类:

    1.包含抽象方法的类,一定是抽象类

    2.抽象类不能被new

    3.抽象类可以包含:普通方法、成员变量、构造方法

    接口:

    1.interface

    2.类实现接口:implements 可以实现多个接口

    3.接口可以多继承

    内存机制:

    栈1.存放局部变量2.不可以被多个线程共享3.空间连续、速度快

    堆1.存放对象2.可以被多个线程共享3.空间不连续速度慢但是灵活

    方法区

    1.存放类的信息:代码、静态变量、字符串常量等

    2.可以被多个线程共享

    垃圾回收器(GC Garbage Collection):

    1.程序员无法调用垃圾回收器。但是可以通过system。gc建议回收

    2.finallize:一般不会调用

    异常机制:

    1.try catch finally

    2.声明抛出异常:throws

    3.手动抛出异常:throw

    4.自定义异常extends Exception或者他的子类

    数组:

    1.长度固定,不可变

    2.所有元素的类型一致

    3.元素类型可以为任意类型

    4.Arrays类:包含了对数组的排序、查找

    容器:1.Collection

    a)list(有序可重复)

    ArrayList底层用数组实现。线程不安全,效率高

    LinkedList:底层用双向链表实现。线程不安全,效率高

    Vector:底层用数组实现。线程安全,效率低

    b)Set(无序,不可重复)

    HashSet(内部使用HashMap实现)

    2.Map

    采用“key-value”来存储数据

    a)HashMap线程不安全,效率高

    b)HashTable线程安全,效率低

    3.iterator

    用过它可以实现遍历容器中的元素

    4.泛型

    5.Collections工具类

    常用类:

    1.包装类:实现了基本数据类型和对象的相互转化。自动装箱、自动拆箱

    2.String/StringBulider/StringBuffer

    String:不可变字符序列

    StringBulider:可变字符序列,线程不安全

    StringBuffer:可变字符序列,线程安全

    3.时间:Date、DateFormat、Calendar

    Date:使用毫秒数来表示时间

    DateFormat:实现Date对象和String对象相互转化(根据制定格式转化)

    Calendar:日期类。实现人的日期和Date相互转化

    4.File(文件)

    5.math

    6.枚举,若定义一组常量就是使用枚举

;原文链接:https://blog.csdn.net/qq_43789254/article/details/115565184
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐