2021-3 牛客网题解 6

2021-3 牛客网题解 6

1. Java修饰符的访问权限

java中有四大修饰符,分别为private,default,protected,public,下面主要是四者之间的区别:

  • private(私有的)
    • private可以修饰成员变量,成员方法,构造方法,不能修饰类(此刻指的是外部类,内部类不加以考虑)。
    • 被private修饰的成员只能在其修饰的本类中访问,在其他类中不能调用,但是被private修饰的成员可以通过set和get方法向外界提供访问方式
  • default(默认的)
  • defalut即不写任何关键字,它可以修饰类,成员变量,成员方法,构造方法。
  • 被默认权限修饰后,其只能被本类以及同包下的其他类访问。
  • protected(受保护的)
    • protected可以修饰成员变量,成员方法,构造方法,但不能修饰类(此处指的是外部类,内部类不加以考虑)。
    • 被protected修饰后,只能被同包下的其他类访问。
    • 如果不同包下的类要访问被protected修饰的成员,这个类必须是其子类。
  • public(公共的)
  • public是权限最大的修饰符,他可以修饰类,成员变量,成员方法,构造方法。
  • 被public修饰后,可以再任何一个类中,不管同不同包,任意使用。
publicprotecteddefaultprivate
本类能不能访问访问
同一个包(Package)下的其他类能不能访问×
不同包(Package),但是作为子类××
不同包,不是子类×××

2.volatile与synchronized的区别:

synchronized很强大,既可以保证可见性,又可以保证原子性,而volatile不能保证原子性

  • volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,
  • synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
  • volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
  • volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.
  • volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
  • volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.

3. JVM命令

  • jps:查看本机java进程信息。
  • jstack:打印线程的信息,制作线程dump文件。
  • jmap:打印内存映射,制作dump文件
  • jstat:性能监控工具
  • jhat:内存分析工具
  • jconsole:简易的可视化控制台
  • jvisualvm:功能强大的控制台

4. 线程安全关键字

  • synchrozied关键字称作同步,主要用来给方法、代码块加锁,被加锁的代码段,同一时间内多线程同时访问同一对象的加锁方法/代码块时,只能有一个线程执行能执行方法/代码块中的代码,其余线程必须等待当前线程执行完以后才执行该方法/代码块。

  • volatile关键字

    • 保证了不同线程对该变量操作的内存可见性.(当一个线程修改了变量,其他使用次变量的线程可以立即知道这一修改)。
    • 禁止了指令重排序.
  • Lock接口提供了与synchronized关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。

  • transient关键字 简单地说,就是让某些被修饰的成员属性变量不被序列化

5. java语言的几种数组复制方法效率

复制的效率System.arraycopy>clone>Arrays.copyOf>for循环

  • System.arraycopy():native方法+JVM手写函数,在JVM里预写好速度最快
  • clone():native方法,但并未手写,需要JNI转换,速度其次
  • Arrays.copyof():本质是调用System.arraycopy()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YlkskyTr-1616659183791)(2021-3 牛客网题解 6.assets/image-20210325124109803.png)]

  • for():
    • 下标表示法每次都从起点开始寻位到指定下标处(现代编译器应该对其有进行优化,改为指针)
    • 另外就是它每一次循环都要判断一次是否达到数组最大长度和进行一次额外的记录下标值的加法运算

6. 表达式的数据类型自动提升

  • 所有的byte,short,char型的值将被提升为int型;
  • 如果有一个操作数是long型,计算结果是long型;
  • 如果有一个操作数是float型,计算结果是float型;
  • 如果有一个操作数是double型,计算结果是double型;
  • 声明为final的变量会被JVM优化

7. 属于被动引用不会触发子类初始化

  • 子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化
  • 通过数组定义来引用类,不会触发此类的初始化
  • 常量在编译阶段会进行常量优化,将常量存入调用类的常量池中, 本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。

8. 序列化和反序列化

  • 序列化:将数据结构转换称为二进制数据流或者文本流的过程。序列化后的数据方便在网络上传输和在硬盘上存储
  • 反序列化:与序列化相反,是将二进制数据流或者文本流转换称为易于处理和阅读的数据结构的过程。本质其实还是一种协议,一种数据格式,方便数据的存储和传输。

9. 四种引用类型

JDK1.2 之前,一个对象只有“已被引用”和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。

所以在 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。

一, 强引用

Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收 obj = null; //手动置null

只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了

二,软引用

软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。

在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用。

三,弱引用

弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。

四,虚引用

虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。

10. 面向对象的五大基本原则

  • 单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
  • 开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
  • Liskov替换原则(Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
  • 依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
  • 接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值