Tips:预约千锋免费试听课程,点击文末“阅读原文”进行报名!
至今为止,Java已经悄悄收获了非常广泛的应用市场,它的生态系统几乎涵盖了目前市面上所有的软硬件,Java几乎是万能的,你能想到的,Java基本都能实现。因此,Java开发也因着有强大的功能,加上企业的需求量不断增加,而吸引了很多年轻人加入其中学习!但是,对于零基础学习Java的小伙伴而言,到底Java需要学习哪些知识点呢?▼▼▼
今天,小千就带大家了解关于Java开发需要掌握好的一些基本知识:
ArrayList和LinkedList有什么区别?简单的区别:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。(LinkedList是双向链表,有next也有previous)2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。深度的区别:1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。3.LinkedList不支持高效的随机元素访问。4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。讲讲类的实例化顺序比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序是什么呢?答案:类加载器实例化时进行的操作步骤(加载–连接-初始化)。父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量(父类实例成员变量)、父类构造函数、子类非静态变量(子类实例成员变量)、子类构造函数。用过哪些Map类,都有什么区别比如HashMap是线程安全的吗,并发下使用的Map是什么?他们内部原理分别是什么?比如存储方式,hashcode,扩容,默认容量等。答案:不安全,并发下使用ConcurrentHashMap。JAVA8的ConcurrentHashMap为什么放弃了分段锁原因:通过JDK的源码和官方文档看来,他们认为的弃用分段锁的原因有以下几点:1、加入多个分段锁浪费内存空间。2、生产环境中,map在放入时竞争同一个锁的概率非常小,分段锁反而会造成更新等操作的长时间等待。3、为了提高GC的效率既然弃用了分段锁,那么一定由新的线程安全方案,我们来看看源码是怎么解决线程安全的呢?首先通过hash找到对应链表过后,查看是否是第一个object,如果是,直接用cas原则插入,无需加锁,然后如果不是链表第一个object,则直接用链表第一个object加锁。这里加的锁是synchronized,虽然效率不如ReentrantLock,但节约了空间,这里会一直用第一个object为锁,直到重新计算map大小,比如扩容或者操作了第一个object为止。ConcurrentHashMap(JDK1.8)为什么要使用synchronized而不是如ReentranLock这样的可重入锁?可以从下面几个方面讲述:锁的粒度,首先锁的粒度并没有变粗,甚至变得更细了。每当扩容一次,ConcurrentHashMap的并发度就扩大一倍。Hash冲突JDK1.7中,ConcurrentHashMap从过二次hash的方式(Segment-HashEntry)能够快速的找到查找的元素。在1.8中通过链表加红黑树的形式弥补了put、get时的性能差距。扩容JDK1.8中,在ConcurrentHashmap进行扩容时,其他线程可以通过检测数组中的节点决定是否对这条链表(红黑树)进行扩容,减小了扩容的粒度,提高了扩容的效率。为什么是synchronized,而不是可重入锁减少内存开销假设使用可重入锁来获得同步支持,那么每个节点都需要通过继承AQS来获得同步支持。但并不是每个节点都需要获得同步支持的,只有链表的头节点(红黑树的根节点)需要同步,这无疑带来了巨大内存浪费。
获得JVM的支持可重入锁毕竟是API这个级别的,后续的性能优化空间很小。synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。这就使得synchronized能够随着JDK版本的升级而不改动代码的前提下获得性能上的提升。
●●●
有没有有顺序的Map实现类,如果有,他们是怎么保证有序的
Hashmap和Hashtable都不是有序的。TreeMap和LinkedHashmap都是有序的。(TreeMap默认是key升序,LinkedHashmap默认是数据插入顺序)TreeMap是基于比较器Comparator来实现有序的。LinkedHashmap是基于链表来实现数据插入有序的。抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么区别:1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。2、抽象类要被子类继承,接口要被类实现。3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。6、抽象方法只能申明,不能实现。abstractvoidabc();不能写成abstractvoidabc(){}。7、抽象类里可以没有抽象方法8、如果一个类里有抽象方法,那么这个类只能是抽象类9、抽象方法要被实现,所以不能是静态的,也不能是私有的10、接口可继承接口,并可多继承接口,但类只能单根继承。类不能继承多个类,接口可以继承多个接口,类可以实现多个接口。◆◆◆◆◆
反射的原理,反射创建类实例的三种方式是什么//创建Class对象的方式一:(对象.getClass()),获取类中的字节码文件Classclass1=p1.getClass();//创建Class对象的方式二:(类.class:需要输入一个明确的类,任意一个类型都有一个静态的class属性)Classclass3=Person.class;//创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可)//通过Class类的一个forName(StringclassName)静态方法返回一个Class对象,className必须是全路径名称;//Class.forName()有异常:ClassNotFoundExceptionClassclass4=Class.forName("cn.xbmchina.Person");描述动态代理的几种实现方式,分别说出相应的优缺点原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换如何强制使用CGLIB实现AOP?(1)添加CGLIB库,SPRING_HOME/cglib/*.jar(2)在spring配置文件中加入aop:aspectj-autoproxyproxy-target-class="true"/JDK动态代理和CGLIB字节码生成的区别?(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法因为是继承,所以该类或方法最好不要声明成finalfinal的用途1、被final修饰的类不可以被继承2、被final修饰的方法不可以被重写3、被final修饰的变量不可以被改变(切记不可变的是变量的引用而非引用指向对象的内容。)4、被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如能确定方法不会被继承,那么尽量将方法定义为final的,具体参见运行期优化技术的方法内联部分5、被final修饰的常量,在编译阶段会存入调用类的常量池中,具体参见类加载机制最后部分和Java内存区域
Java编程语言有着很大的发展前景,对于零基础入门或者转行而来的人来说,有机会选择学习Java技术,通过培训,获得更多的项目实战经验,其实是很有利自己后期的高薪就业的!
千锋深圳Java培训课程内容不断升级,技术点进行了+项的增加与优化,紧贴主流互联网公司小前台、大中台的战略,以培养Java大中台研发工程师为目标。Java技术点覆盖广泛,除基础知识点外,还包括更深层次的技术点,以JavaEE的深度为主,横向及纵向延伸学员的专业技能。充实自己,就现在
长达两周免费试听课程
扫描下方