牛客网 java大题

    xiaoxiao2022-07-05  178

    java抽象类和接口的区别

    1、抽象类有构造方法,接口没有 2、抽象类可以有普通成员变量,接口没有,接口变量默认都是public static final 3、抽象类可以包含非抽象方法,接口的方法必须都是抽象的 4、抽象类的抽象方法可以是public、protected,接口只能是public,默认public abstract 5、抽象类可以包含静态方法,接口中不能包含静态方法 6、抽象类和接口都可以包含静态成员变量, 抽象类访问类型可以是任意,接口默认public 7、一个类可以实现多个接口,只能实现一个类

    list和ArrayList,ArrayList和HashSet区别

    list是接口,ArrayList实现list接口 ArrayList底层是动态数组,有序重复 hashset底层hash表,会比较hash和equals,无序不可重复

    java内存结构是什么,全局变量,临时变量、静态变量分别存在哪里

    内存结构分成堆内存,方法区,栈 全局变量存放在堆,临时变量存放在栈,静态变量存在方法区 新生代包含一块Eden和两块surviver区,默认8:1:1

    c++和java区别

    java c++ 指针 X V 字符串 V X goto X V 操作符重载 X V 异常机制 V X 继承 单 多 内存管理 自动回收 析构函数 类型转换 强制 自动 预处理器 import 预处理器

    请问怎么判断哪些对象时可以删除的,可达是什么

    判断一个对象是否被回收有两个方法:引用计数法和可达性分析法 可达性分析:从gcroot入口有个引用链,如果堆内一个对象没有任何引用链引用链,则视为需要被垃圾回收的对象

    java中线程如何实现,如何实现多线程?线程安全在java中是如何实现的,线程的工作区是哪里

    多线程的实现:继承thread类,实现Runnbale接口,实现Callable接口。 前两种没有返回值,后一种有返回值 线程不安全的原因:线程是不拥有资源的,进程是拥有资源的。 而线程是由进程创建的,一个进程可以创建多个线程,这些线程共享着进程的资源。 所以,当线程一起并发并发运行时,同时对一个数据进行修改,就可能造成数据的不一致性 线程安全的解决机制: 1 加锁 a.锁能是其保护的代码其串行的形式访问,当给一个复合操作加锁后,能使其成为原子操作 b.加锁需要考虑性能问题,不能一味加synchronize,应将不影响共享状态的代码并且执行时间长得代码分离出去 c.加锁不仅仅为了互斥,还包括可见性。为了保证所有线程都能看见最新值,读和写操作必须使用同样的锁对象 2 不共享状态 a.无状态对象:无状态对象一定是线程安全的,因为不会影响到其他线程 b.线程关闭:仅在单线程环境下使用 3 不可变对象 可以使用final修饰对象保证线程安全

    内存溢出和内存泄漏是怎么回事

    内存溢出:内存不足,无法申请新的内存 内存泄漏:指已经无用的对象仍被引用,导致无法被垃圾回收器回收

    hashmap和hashtable,concurrentHashMap

    区别:线程安全,同步,速度 hashmap:线程不安全,不同步,可以接受null值 hashtable:线程安全,同步,不接受null java 5提供了concurrentHashMap,它是HashTable的替代品。1.7之前使用segment,实现锁分段于读写分离来实现线程安全,1.8中引用红黑树这一数据结构

    Hashset有什么特性,hashset判断存入的对象是否重复是如何比较的

    HashSet里面存储的数据具有无序性 底层是采用HashMap来进行存储的,HashSet存入的对象被存放在了HashMap的Key里面。 在进行元素插入的时候会进行key的hashcode的计算以及equal方法在HashMap里面判断原有元素中是否已存在相同元素。

    反射的主要作用,泛型的主要作用

    反射主要用它来获取运行期的对象数据 1、各种开发框架中,如spring 2、创建数据库链接时,如Class class=Class.forName("com.java.dbtest.TestConnection") 3、在IDE中对象,属性,这时用到反射 泛型:定义安全的数据结构

    类加载器的理解

    分3类:启动类加载器,扩展类加载器,应用程序类加载器 启动类加载器是虚拟机的一部分,而其它的类加载器独立于虚拟机的外部。 类的加载遵循双亲委派模型,除了顶层的启动类外,其余类加载器都应该有自己的父类。 每种加载器收到请求后都传到父类加载器去完成,所以最后都会传到启动类加载器中。 只有父类加载器无法完成加载请求,子类才会尝试自己去加载。

    java多态

    多态分为运行时多态和编译时多态。运行时多态一般通过方法的重写实现,需要那种形态,父类引用就指向子类的那个对象 编译时多态是通过方法的重载来实现,同样的方法不同参数可以显示不同的形态

    异常处理机制都有什么

    error和except都继承了throwable接口, error是系统内部出现的问题,不能用程序解决,比如内存,jvm问题 except是程序造成的 可以通过try catch来处理可能出现的异常,throw抛出一个异常或new一个异常手动抛出

    多线程是什么

    进程中运行的程序,线程是进程的内部的一个执行序列。进程是资源分配的单元,线程是执行行单元。 进程间切换代价大,线程间切换代价小。进程拥有资源多,线程拥有资源少。多个线程共享进程的资源

    有哪几种垃圾回收算法

    四种,标记清除算法,复制算法,标记整理算法,分代整理算法

    GC Root可以是哪些

    1、虚拟机栈(本地变脸表)引用的对象 2、方法区静态属性引用的对象 3、方法区常量引用的对象 4、本地方法栈JNI中引用的对象

    类加载机制

    1、加载 主要将.class文件中的二进制字节流读入jvm中 2、验证 确保加载进来的字节流符合jvm规范 3、准备 为静态变量在方法取分配内存,并设置默认初始值 4、解析 jvm将常量池内的符号引用替换为直接引用 5、初始化 根据程序中的赋值语句主动为类变量赋值

    volatile

    volatile用来修饰变量,可以保证变量的可见性,不能保证同步性,变量值会在内存中视为所有线程共享,当一个线程对它做出修改后,会立即刷新内存中的值

    死锁的原因,如何查看死锁状态

    死锁是线程之间互相等待对方已经占用的锁。 通过打印堆栈信息可以看到异常信息

    强引用和弱引用

    强引用是使用最普遍的引用。 如果一个对象具有强引用,那垃圾回收器绝不会回收它。如:Object o = new Object(); 当内存不足,jvm宁愿抛出错误,也不会随意回收具有强引用的对象来解决内存不足的问题。 如果不适用时,通过如下方式来弱化引用,如:o=null;//帮助回收器回收此对象 弱引用是描述非必需对象,一旦发现只具有弱引用的对象,不管内存空间十分足够,都会回收它的内存。

    java里面的内存管理机制

    内存管理由JVM完全负责,java的垃圾回收器负责自动回收无用对象占据的内存资源,减少了内存管理上花费的时间。 但java还存在垃圾回收器无法回收的内存情况。 java的垃圾回收是不能保证一定发生的,除非jvm面临内存耗尽的情况

    int和Integer的区别

    1、integer是int的包装类,int是java的一种基本数据类型 2、integer变量必须实例化后才能使用。int不需要 3、integer实际是对象的引用(堆),int是直接存储数据值(栈) 4、integer的默认值是null,int的默认值是0

    方法结束对象怎么回收

    jvm通过可达性分析,判断这个对象是否可达到

    map的分类和常见情况

    接口java.util.Map,实现类分别是HashMap Hashtable LinkedHashMap和TreeMap。 map主要用于存储键值对,根据键得到值,不允许重复键。 HashMap:根据键的HashCode值存储数据,根据键直接获取值,访问速度快,遍历时,取得数据的顺序是随机的。 最多只允许记录一个键的null,线程不同步 Hashtable不允许键或值为null,线程同步 LinkedHashMap是HashMap的子类,保存了记录的插入顺序,在Iterator遍历时,先得到的记录肯定也是先插入的。 遍历速度与实际数据有关,与容量无关。HashMap遍历速度与容量相关 TreeMap能够把它保存的记录根据键排序,默认升序,遍历时得到的

    java8的新特性

    Lambda表达式

    十进制的数在内存中是怎么存的

    二进制补码

    为何出现4.0-3.6=0.400001

    在二进制中无法精确表示小数,如果数值计算中不允许有任何舍入误差,就使用BigDecimal类

    Array和ArrayList的区别

    Array可以包含基本数据类型和对象类型,ArrayList只能包含对象类型 Array大小是固定的,ArrayList的大小是可变的,扩容1.5倍 ArrayList提供了更多的方法和特性。

    如何输出一个某种编码的字符串

    String t =new String(str.getBytes(),"UTF-8")
    最新回复(0)