st-java基础

1.String、StringBuffer、Stringbuilder有什么区别

得分点 :字符串是否可变,  StringBuffer、StringBuilder线程安全问题

标准回答:

String不可变。 StringBuffer、 StringBuilder对象,当一个StringBuffer对象被创建之后,我们可以通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()、等方法来改变这个字符串对象的字符序列。当通过StringBuffer得到期待中字符序列的字符串时,就可以通过toString()方法将其转换为String对象。

StringBuilder类和StringBuffer类相比,二者无论是构造器还是方法都基本相同,不同的一点是,StringBuilder没有考虑线程安全问题,也正因如此,StringBuilder比StringBuffer性能略高。因此,如果是在单线程下操作大量数据,应优先使用StringBuilder类;如果是在多线程下操作大量数据,应优先使用StringBuilder类。

2.请你说一下抽象类和接口的区别

得分点 :接口与抽象类的方法,接口与抽象类的常量与变量,单继承多实现

标准答案 :

相同点有:

- 接口和抽象类都不能被实例化,用于被其它类实现和继承

- 接口和抽象类都可以有抽象方法,实现接口或继承抽象类的普通子类都必须都实现这些抽象方法

差异:

- 接口里只能包含抽象方法和默认方法,不包含普通方法;抽象类则可以包含普通方法。

- 接口里只能定义静态常量,不能定义普通成员变量;抽象类里既可以定义普通成员变量,也可以定义静态常量

- 接口里不包含构造器;抽象类可以包含构造器,但抽象类的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作

- 接口里不能包含初始化块,抽象类则可以包含初始化块

- 抽象类单继承;接口多实现。通过实现多个接口可以弥补Java单继承的不足

3.请你说说String类,以及new string和使用字符串直接量

String类被final修饰,所以不能被继承。创建String对象时可以使用字符串直接量,如String str="1abc", 另一种String str=new String("1abc"),前者使用常量池来管理,后者先判断常量池中是否已存在此字符串,不存在就也在常量池创建,再在堆内存创建一个新的对象,因此后者开销更大。

4.请你说说Java的特点和优点,为什么要选择Java?

1,吸收了c++的优点,摒弃了c++多继承和指针的复杂使用。不需要对内存进行,具有垃圾回收机制。 2.面向对象,易于开发和理解。 3.跨平台,因为jvm即java虚拟机,同一个代码可以在不同的平台机器上运行,.java文件通过编译成.class字节码文件再由jvm转成机器能识别的机器码。 4.内含大量的库,简化编写工作。 5.适合用于开发web,如servelt,jsp等。

st-线程、进程

1.请你说说多线程

得分点 线程和进程的关系、为什么使用多线程

标准回答 :进程是资源分配的最小单位,线程是CPU调度的最小单位,真正利用资源在cpu执行的是线程。线程可以让一个进程并发地处理多个任务,也叫轻量级进程。所以,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈、局部变量,并且能够共享进程内的资源。由于共享资源,处理器便可以在这些线程之间快速切换,从而让使用者感觉这些线程在同时执行(并发)。 总的来说,操作系统可以同时执行多个任务,每个任务就是一个进程。进程可以同时执行多个任务,每个任务就是一个线程。

使用多线会给开发人员带来显著的好处,而使用多线程的原因主要有以下几点:

更多的CPU核心 现代计算机追求更多的核心发展,所以处理器的核心数量会越来越多,充分地利用处理器的核心则会显著地提高程序的性能。而程序使用多线程技术,就可以将计算逻辑分配到多个处理器核心上,显著减少程序的处理时间。

更快的响应时间 使用多线程技术,就可以将数据一致性不强的操作派发给其他线程处理。这样响应用户请求的线程就能够尽快地完成处理,大大地缩短了响应时间,从而提升了用户体验。

2.请你说说线程和进程的区别

得分点 地址空间、开销、并发性、内存 标准回答 :

进程是操作系统资源分配的基本单位,而线程是处理器(cpu)任务调度和执行的基本单位

进程有独立的地址空间,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间;

进程和线程切换时,需要切换进程和线程的上下文,进程的上下文切换时间开销远远大于线程上下文切换时间,耗费资源较大,效率要差一些;

进程的并发性较低,线程的并发性较高;

每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制;

系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了 CPU 外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源;

一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

3.说说怎么保证线程安全

‘’线程安全‘问题是指在‘多线程背景’下,线程没有按照我们的预期执行,导致操作 共享变量  出现异常。

4.请你说说死锁定义及发生的条件

死锁是:两个或两个以上的‘进程’在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

产生死锁的四个必要条件:

互斥条件:互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

请求和保持条件:请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有

不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放;

环路等待条件:循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

5.请你说说进程间的通信方式

1.管道:管道本质是内核中维护的一块内存缓冲区。2.命名管道:因为无名管道只适用于具有亲缘关系的线程,所以就衍生出来命名管道,这样就可以实现了非亲缘关系进程之间的通信。3.信号:一种通知机制。4.消息队列:是一个消息链表,既可以读消息,也可以写消息。5.共享内存:多个线程共享一片内存区域。6.内存映射:就是将磁盘文件数据映射到内存,通过修改内存就能修改磁盘文件。7socket接口,socket接口一般用于不同主机上进程之间的通信

​st-collection、map

1.请你说说ArrayList和LinkedList的区别
得分点 数据结构、访问效率 
标准回答 :
 ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。 
     对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标,而LinkedList依靠地址指针。 
     对于插入和删除操作,LinkedList要优于ArrayList
      LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

2.请你说说ConcurrentHashMap
得分点 数组+链表+红黑树、锁的粒度 
标准回答:
ConcurrentHashMap的底层数据结构与HashMap一样,也是采用“数组+链表+红黑树”的形式。底层数据结构的逻辑可以参考HashMap的实现,下面我重点介绍它的线程安全的实现机制。
    采用锁定头节点的方式降低了锁粒度,以较低的性能代价实现了线程安全。 三、实现机制:1. 初始化数组或头节点时,ConcurrentHashMap并没有加锁,而是CAS的方式进行原子替换 2. 插入数据时会进行加锁处理,但锁定的不是整个数组,而是槽中的头节点。所以,ConcurrentHashMap中锁的粒度是槽,而不是整个数组,并发的性能很好。 3. 扩容时会进行加锁处理,锁定的仍然是头节点。并且,支持多个线程同时对数组扩容,提高并发能力。 4. 在扩容的过程中,依然可以支持查找操作。

3.请你说说HashMap底层原理
得分点 数据结构、put()流程、扩容机制 
标准回答 :
数据结构  HashMap底层是采用“数组+链表+红黑树”来实现的。 HashMap是基于哈希算法来确定元素的位置(槽)的,当我们向集合中存入数据时,它会计算传入的Key的哈希值,并利用哈希值取余来确定槽的位置。如果元素发生碰撞,也就是这个槽已经存在其他的元素了,则HashMap会通过链表将这些元素组织起来。如果碰撞进一步加剧,某个链表的长度达到了8,则HashMap会创建红黑树来代替这个链表,从而提高对这个槽中数据的查找的速度。 HashMap中,数组的默认初始容量为16,这个容量会以2的指数进行扩容。具体来说,当数组中的元素达到一定比例的时候HashMap就会扩容,这个比例叫做负载因子,默认为0.75。
自动扩容机制,是为了保证HashMap初始时不必占据太大的内存,而在使用期间又可以实时保证有足够大的空间。采用2的指数进行扩容,是为了利用位运算,提高扩容运算的效率。 
 加分回答 HashMap是非线程安全的,在多线程环境下,多个线程同时触发HashMap的改变时,有可能会发生冲突。所以,在多线程环境下不建议使用HashMap,可以考虑使用Collections将HashMap转为线程安全的HashMap,更为推荐的方式则是使用ConcurrentHashMap。

4.请你说说HashMap和Hashtable的区别
得分点 线程安全、null 
标准回答 :
HashMap和Hashtable都是典型的Map实现,它们的区别在于是否线程安全,是否可以存入null值。
    Hashtable在实现Map接口时保证了线程安全性,而HashMap则是非线程安全的。所以,Hashtable的性能不如HashMap,因为为了保证线程安全它牺牲了一些性能。
    Hashtable不允许存入null,无论是以null作为key或value,都会引发异常。而HashMap是允许存入null的,无论是以null作为key或value,都是可以的。
    加分回答 虽然Hashtable是线程安全的,但仍然不建议在多线程环境下使用Hashtable。因为它从Java 1.0开始就出现了,它的同步方案还不成熟,性能不好。如果要在多线程环下使用HashMap,建议使用ConcurrentHashMap它不但保证了线程安全,也通过降低锁的粒度提高了并发访问时的性能。

5.HashMap是线程安全的吗?如果不是该如何解决?
得分点 Hashtable、Collections、ConcurrentHashMap 
标准回答:
 HashMap是非线程安全的,在多线程环境下,多个线程同时触发HashMap的改变时,有可能会发生冲突。
    想要使用线程安全的HashMap,一共有三种办法:使用Hashtable、使用Collections将HashMap包装成线程安全的HashMap、使用ConcurrentHashMap,其中第三种方式最为高效,是我们最推荐的方式。     
    Hashtable, HashMap和Hashtable都是典型的Map实现,而Hashtable是线程安全的。Hashtable它的同步方案还不成熟、性能不好,甚至官方都给出了不推荐使用的建议。 
    Collections, Collections类中提供了synchronizedMap()方法,可以将我们传入的Map包装成线程同步的Map。
     ConcurrentHashMap, ConcurrentHashMap是线程安全且高效的HashMap,并且进一步降低了锁的粒度,从而提高了并发的能力。ConcurrentHashMap的底层数据结构为“数组+链表+红黑树”,但是为了进一步降低锁的粒度,JDK8取消了段的设定,而是直接在Map的槽内存储链表或红黑树。并发插入时它锁定的是头节点,相比于段头节点的个数是可以随着扩容而增加的,所以粒度更小。引入红黑树,则是为了在冲突剧烈时,提高查找槽内元素的效率。

st-反射

得分点 反射概念,通过反射机制可以实现什么 、
反射的概念:
       大家都知道,要让java程序能够运行,那么就得让java类要被java虚拟机加载。java类如果不被java虚拟机加载,是不能正常运行的。现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。
        java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类。这样的特点就是反射。
        java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

标准回答:
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
 具体来说,通过反射机制,我们可以实现如下的操作: - 程序运行时,可以通过反射获得任意一个类的Class对象,并通过这个对象查看这个类的信息; - 程序运行时,可以通过反射创建任意一个类的实例,并访问该实例的成员; - 程序运行时,可以通过反射机制生成一个类的动态代理类或动态代理对象。
加分回答 Java的反射机制在实际项目中应用广泛,常见的应用场景有: 
- 使用JDBC时,如果要创建数据库的连接,则需要先通过反射机制加载数据库的驱动程序; 
- 多数框架都支持注解/XML配置,从配置中解析出来的类是字符串,需要利用反射机制实例化; 
- 面向切面编程(AOP)的实现方案,是在程序运行时创建目标对象的代理类,这必须由反射机制来实现。

st-jvm

1.说说你了解的JVM内存模型
得分点 类加载子系统、执行引擎、运行时数据区 标准回答 JVM由三部分组成:类加载子系统、执行引擎、运行时数据区。 1. 类加载子系统,可以根据指定的全限定名来载入类或接口。 2. 执行引擎,负责执行那些包含在被载入类的方法中的指令。 3. 当程序运行时,JVM需要内存来存储许多内容,例如:字节码、对象、参数、返回值、局部变量、运算的中间结果,等等,JVM会把这些东西都存储到运行时数据区中,以便于管理。而运行时数据区又可以分为方法区、堆、虚拟机栈、本地方法栈、程序计数器。 加分回答 运行时数据区是开发者重点要关注的部分,因为程序的运行与它密不可分,很多错误的排查也需要基于对运行时数据区的理解。在运行时数据区所包含的几块内存空间中,方法区和堆是线程之间共享的内存区域,而虚拟机栈、本地方法栈、程序计数器则是线程私有的区域,就是说每个线程都有自己的这个区域。

2.说说JVM的垃圾回收机制
得分点 新生代收集、老年代收集、混合收集、整堆收集 标准回答 当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则。而分代收集理论,建立在如下三个分代假说之上,即弱分代假说、强分代假说、跨代引用假说。依据分代假说理论,垃圾回收可以分为如下几类: 1. 新生代收集:目标为新生代的垃圾收集。 2. 老年代收集:目标为老年代的垃圾收集,目前只有CMS收集器会有这种行为。 3. 混合收集:目标为整个新生代及部分老年代的垃圾收集,目前只有G1收集器会有这种行为。 4. 整堆收集:目标为整个堆和方法区的垃圾收集。 加分回答 HotSpot虚拟机内置了很多垃圾收集器,其中针对新生代的垃圾收集器有Serial、ParNew、Parallel Scavenge,针对老年代的垃圾收集器有CMS、Serial Old、Parallel Old。此外,HotSpot还内置了面向整堆的G1收集器。在上述收集器中,常见的组合方式有: 1. Serial + Serial Old,是客户端模式下常用的收集器。 2. ParNew + CMS,是服务端模式下常用的收集器。 3. Parallel Scavenge + Parallel Old,适用于后台运算而不需要太多交互的分析任务。

3.说说类加载机制

得分点
加载、验证、准备、解析、初始化
标准回答:

一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中验证、准备、解析三个部分统称为连接,而前五个阶段则是类加载的完整过程。

在加载阶段JVM需要在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。
        验证阶段大致上会完成下面四个阶段的检验动作:文件格式验证、元数据验证、字节码验证、符号引用验证。
        准备阶段是正式为类中定义变量(静态变量)分配到内存并设置类变量初始值的阶段,这些变量所使用的内存都应当在方法区中进行分配,但必须注意到方法区本身是一个逻辑上的区域。
        解析阶段是Java虚拟机将常量池内的符号替换为直接引用的过程,符号引用以一组符号来描述所引用的目标,直接引用是可以直接指向目标的指针、相对偏移量或者一个能间接定位到目标的句柄。
        类的初始化阶段是类加载过程的最后一个步骤,直到初始化阶段,Java虚拟机才真正开始执行类中编写的Java程序代码,将主导权移交给应用程序。本质上,初始化阶段就是执行类构造器`<clinit>()`的过程。`<clinit>()`并不是程序员在Java代码中直接编写的方法,它是Javac编译器的自动生成物。</clinit></clinit>

4.说说JVM的垃圾回收算法

垃圾回收算法有三种,一般常用的有两种。 标记清除:先标记,后清理,这样会产生大量的内存碎片,存储大对象的时候,可能会提前触发FULLGC。 复制:将堆内存分为两块,一块使用,一块用来放置将来存活的对象,这样会造成空间浪费,后来改进,因为对象都是朝圣夕死的,将堆内存分为三块,Eden,s1,s2,这样来使用,每次空闲的内存只需要一小块。大多在新生代中使用。 标记整理:标记存活的对象,然后让它们向内存的一端聚集,然后清除边界的未被标记的对象。

5.请你说说内存溢出

内存溢出:指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出。

引起内存溢出的原因:1.内存加载的数据量过于庞大。如一次从数据库取出的过多的数据。2.代码中存在死循环或者死循环中产生大量的对象实体。3.启动内存值设定过小。解决内存溢出的方案:修改JVM启动参数,直接增加内存。2.检查错误日志,查看“OutOfMemory”错误之前是否存在异常。3.对代码进行debug分析。4.使用内存工具动态查看内存使用情况。

常见的内存溢出出现在:1.堆。对象创建过多    2.栈溢出   3.方法区和运行时常量池;创建大量动态类。

6.请你说说内存泄漏

内存泄露:内存泄露也称作“存储渗漏”,用动态存储分配函数动态开辟空间,在使用完毕后为释放,结果导致一直占据该内存单元,直到程序结束。其实说白了就是该内存空间使用完毕后未回收。

老老实实准备一下java面试(java基础)相关推荐

  1. 推荐一个很牛逼的 Github 项目:本人历时半年完成的【Java 面试 + Java 后端技术学习指南】,已拿大厂offer

    今天给大家分享一份[Java 面试 + Java 后端技术学习指南]:一份通向理想互联网公司的面试指南,包括 Java,技术面试必备基础知识.Leetcode.计算机操作系统.计算机网络.系统设计.分 ...

  2. 十一郎专栏 | java面试八股文-基础篇

    最近发现全网都在找八股文,看来最近面试的人真的很多. 铁汁们对于面试八股文的需求很大,但是资料是这里凑一点那里凑一点,不够系统化. 我根据自己的面试经验,以及拉了几个大佬+面试官讨论了一下,基础篇就出 ...

  3. JAVA面试相关基础知识

    1.面向对象的特征有哪些方面  1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽 ...

  4. Java面试--Java内存模型

    面试题:你了解Java内存模型吗?(顺丰面试题) 面试题:程序内存的分布,五个部分(360面试题) 一.Java程序的执行过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件 ...

  5. Java面试宝典————基础篇

    参考原文:<Java面试题全集(上)> 1.Java中的基本数据类型有哪些? 类型:byte short int long float double boolean char 字节:1  ...

  6. Java面试java基础,重庆java哪家培训班好

    所以,我认为在你选择之前不妨好好想想什么是Java?你适不适合从事这份工作? Java开发是近20多年来最热门的编程语言,就业市场确实比较大,入门的难度也比C和C++要低,结合各方面来说,你选择Jav ...

  7. Java面试面向对象三大特征,Java面试经典基础问答三

    1. 写clone()方法时,通常都有一行代码,是什么? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对 ...

  8. java面试要点---基础部分CoreJava,基础及语法

    4.float型floatf=3.4是否正确?[基础] 答:不正确:精度不准确,应该用强制类型转换,如下所示:floatf=(float)3.4.    Java中带有小数点的默认的是double型的 ...

  9. java 面试 —— java 基础

    1. char => int char 类型转换为 int 类型时,是转换为其 ascii 码或 unicode 码(比如中文) char ch = 'A'; int i = ch; // (i ...

  10. Java面试的基础题20190301

    1. Excption与Error包结构.OOM你遇到过哪些情况,SOF你遇到过哪些情况. Java将可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException), ...

最新文章

  1. oracle12测试骤,Oracle中SQL语句解析的步骤
  2. iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解
  3. mysql 升序 字段值为NULL 排在后面
  4. php连接数据库封装函数,PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】...
  5. 使用docker安装elasticsearch
  6. CF896E Welcome home,Chtholly/[Ynoi2018]五彩斑斓的世界(并查集+第二分块)
  7. web.config连接mysql_web.config中配置数据库连接的方式
  8. viewsource和viewparsed_(Summary)Developer Tools:IE9的F12,Chrome的Ctrl+Shift+J比较
  9. 通用权限管理平台--数据模型定义
  10. 数值计算方法matlab课后答案,《现代的数值计算方法matlab版》习题解答.pdf
  11. 26局部与分割-平均背景法和codebook背景学习法
  12. C/C++编码:无锁编程
  13. mysql中rownumber用法_MySQL中row_number的实现
  14. C语言dnf辅助开发,自己会写辅助:10台机器,稳赚额外收入
  15. 一文带你走进车联网安全
  16. AI语音红外遥控配网教程
  17. 关于Android开发者的简历
  18. bazel 链接第三方动态库_谷歌携手OPPO共同开发CameraX技术,第三方拍照应用有福了...
  19. c语言第五章答案许合利,C语言习题答案贾宗璞许合利较全-.doc
  20. 计算机无法连接蓝牙键盘,蓝牙鼠标连接不上电脑怎么办?

热门文章

  1. CTF必备取证神器(volatility、PTF、取证大师、Magnet AXIOM)
  2. 跑步为什么不能过量(对身体的危害)
  3. html图片旁边加文字
  4. 范德堡大学计算机科学专业,美国范德堡大学的专业排名
  5. html给图片添加边框
  6. selenium调用javascript代码的方法
  7. 挥手2015,笑迎2016
  8. 【趣味实践】Stable Diffusion绘制中秋美景
  9. 新手gxf学python---文件操作之登录、注册功能
  10. WORD打印时显示错误,未定义标签?