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:1c++和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")