java基础面试
文章平均质量分 64
丢丢diu丢
CSDN,做笔记用的……
展开
-
Java数据结构—String
1.String为什么用final修饰?1.为了实现字符串常量池首先你要理解final的用途,在分析String为什么要用final修饰,final可以修饰类,方法和变量,并且被修饰的类或方法,被final修饰的类不能被继承,即它不能拥有自己的子类,被final修饰的方法不能被重写, final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。final修饰的String,代表了String的不可继承性,final修饰的char[]代表了被存储的数据不可更改性。但是:虽然原创 2021-10-14 00:30:58 · 238 阅读 · 0 评论 -
力扣树——满二叉树、完全二叉树、平衡二叉树、二叉搜索树、最优二叉树、红黑树
1.满二叉树深度为h,那节点数为:2^h-12.完全二叉树深度为h,那么前h-1层都是满的,只有第h层不满,而且是从左向右紧密排列的。3.平衡二叉树1.它可以是1棵空树;2.首先它是二叉搜索树,而且它的左右子树的深度之差绝对值不能超过1;4.二叉搜索树1.它可以是空树2.若不空,那么它中序遍历(左中右)必须是严格递增序列,不存在相同的元素;5.最优二叉树给定N个权值作为N个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树。哈夫曼原创 2021-09-16 22:04:50 · 374 阅读 · 0 评论 -
java的main方法中的参数有什么用
1.main方法的参数作用:参数String[ ] args的作用就是可以在main方法运行前将参数传入main方法中。(这个作用,完全可以通过配置文件来取代。)特点:1.传入n个参数,args就是长度为n的字符串数组。2.当传入参数为0个时,即没有传参数时,args 是长度为0的字符串数组程序的入口方法是规定好的了,程序运行的时候最先执行的就是它,如果你不按规定进行的话,即使方法名字叫做main,编译的时候不会出现错误,运行的时候程序就找不到入口了,因为这时候会把这个main方法当作普通的方法原创 2021-09-15 00:46:30 · 3362 阅读 · 0 评论 -
Java——4种访问权限、4种内部类
1.访问权限范围比较:public > protected > 默认 > private属性\方法:这4个都能去修饰类:public、默认可以去修饰接口:public、默认可以去修饰修饰符同类同包子类任意位置public√√√√protected√√√×默认√√××private√×××2.Java的内部类有哪些Java的四种内部类1.成员内部类不能存在static关键字;可以直接访问原创 2021-09-05 15:23:54 · 485 阅读 · 0 评论 -
synchronized编程实践
1.两个方法加 synchronized,一个线程进去sleep,另一个线程可以进入到另一个方法吗?答案:不能,因为synchronized会锁住当前实例对象,除非另一个方法没有synchronized修饰。如下程序,先输出22222222,再输出111111111.不加synchronized的方法是不受影响的。public class Main { public static void main(String[] args) { Test test = new Te原创 2021-09-05 13:17:10 · 221 阅读 · 0 评论 -
Java类加载的过程
Java:类加载过程1.加载——3件事1.通过全类名获取定义此类的二进制字节流(eg:从jar、war中获取);2.将字节流所代表的静态存储结构转换为方法区的运行时数据结构;3.在内存中生成一个代表该类的Class对象,作为方法区这些数据的访问入口。2.连接加载阶段和连接阶段的部分内容是交叉进行的,加载尚未结束,连接阶段可能就开始运行了。2.1.验证2.2.准备准备阶段:正式为类变量分配内存并设置类变量初始值的阶段,这些内存在方法区分配。注意:1.这时候进行内存分配的仅包括类变原创 2021-09-04 22:56:09 · 600 阅读 · 4 评论 -
CAS、Synchronized、ReentrantLock使用场景
1.CAS——读多写少对于资源竞争较少(线程冲突较轻)的情况此时如果使用synchronized,那么用户态、内核态的频繁切换会耗费很多资源;CAS自旋几率小,性能更高。2.Synchronized——写冲突多,强一致性的场景写入频繁的场景,线程冲突严重。此时CAS自旋概率大,会浪费更多CPU资源。3.ReentrantLocksynchronized的锁升级是不可逆的。如果是一个打车软件,那过了打车高峰期,还是重量级锁,就会降低效率;此时如果用Reentratlock就比较好。原创 2021-09-04 21:16:45 · 1193 阅读 · 0 评论 -
Hash——Hash分布式存储、一致性哈希问题
1.什么是Hash表?其实Hash表存储的位置,是连续的存储空间,和数组一样。链表不是连续的存储空间。以链地址法为例:它是通过Hash函数,直接根据Key计算出数据存储的地址,一个数组下标index。1.根据key,计算index = Hash(key);2.如果数组[index]不为空,则查找成功(当然链地址法还要比较equal)为空,则查找失败2.Hash冲突怎么办?链地址法拉链法公共溢出区法找一个公共的地方存放冲突的key-value。(如果冲突的数量很多,查原创 2021-09-02 17:54:13 · 535 阅读 · 1 评论 -
Java数据结构——HashMap、ConcurrentHashMap
HashMap的31个问题1:说说HashMap 底层数据结构是怎样的?jdk8前:HashMap 底层是 hash 数组和单向链表实现;jdk8后:采用hash数组+链表+红黑树的数据结构。2:谈一下HashMap的特性?我们通过put和get存储和获取对象。当我们给put()方法传递键和值时:先对键做一个hashCode()的计算,来得到它在bucket数组中的位置来存储Entry对象。当获取对象时,通过get获取到bucket的位置,再通过键对象的equals()方法找到正确的键值原创 2021-08-26 17:59:23 · 309 阅读 · 0 评论 -
java数据结构——HashMap的3种遍历方式
1.keySet遍历1.先把map的key单独取出,存进一个新的Set;2.再用foreach根据map.get(key),遍历出value。 Set set = map.keySet(); for (Object obj: set) { System.out.print(obj + "=" + map.get(obj) + ","); }2.Entry遍历1.使用map.entrySet(),获取Entry<>数组,存入一个新的Set;2.根据foreach.原创 2021-08-26 17:11:51 · 235 阅读 · 0 评论 -
Java关键字—volatile、乐观锁、悲观锁、synchronized
1.JMM与内存可见性问题问题1:这个程序,主线程Main永远不会输出东西,因为线程testVolitile在自己的工作内存(即高速缓存)中把标志位flag更新为true,并写回主内存后,主线程main的工作内存中存的flag仍然是new TestVolatile()时的默认值false,并没有从主内存中获取最新的flag值true。public class Main { public static void main(String[] args) { TestVolati原创 2021-08-15 18:35:46 · 798 阅读 · 1 评论 -
Java垃圾回收机制——从JVM、JMM讲起,包含FullGC及其解决方案
1.JVM、JMM2.运行时数据区域3.垃圾回收1.JVM、JMM1.什么是JVMJVM是1个规范,它包括:方法区堆区虚拟机栈本地方法栈程序计数器2.什么是JMMJMM:它规定了线程和内存之间的一些关系。根据JMM的设计,系统存在1个主内存,java中所有的变量都存在主内存中,对于所有线程都是共享的。每个线程都有自己的工作内存,该工作内存中保存的是主存中某些变量的copy,线程中的所有操作都是在工作内存中进行的,线程之间无法直接相互访问,变量传递需要通过主内.原创 2021-04-22 20:10:36 · 283 阅读 · 1 评论 -
Java数据结构——Arraylist
1.Arraylist1.底层原理、特点ArrayList底层是用数组实现的存储。默认初始化容量:10。特点:查询效率高,随机增删效率低,线程不安全。使用频率很高。2.为啥线程 不安全还使用他呢?正常使用的场景中,都是用来查询,不涉及太频繁的增删,如果涉及频繁的增删,可以使用LinkedList,如果你需要线程安全就使用Vector,这就是三者的区别了,实际开发过程中还是ArrayList使用最多的。3.他随机增删很慢,你能说一下ArrayList在增删的时候是怎么做的么?ad..原创 2021-04-19 20:32:04 · 292 阅读 · 0 评论 -
Comparator接口,与vector重写实现排序二维数组
1.Comparable接口源码:public interface Comparable<T> { public int compareTo(T o);}一维数组实现返回值等于0:o1=o2返回值>0则o1>o2返回值<0则o1<o2比较时:o1在前是升序,o2在前是降序Vector<Integer> comPare = new Vector<>(); comPare.add(3);原创 2021-04-19 18:09:26 · 223 阅读 · 0 评论 -
Java基础面试——抽象类、接口、多态、继承
1.抽象类、接口1.抽象类1.抽象类使用abstract修饰,它和常规类一样具有数据域、方法的构造方法,但不可以new实例;2.抽象类中不一定有”抽象方法“,”抽象方法“必须在”抽象类‘中;3.“非抽象类”在继承“抽象类”时,必须覆盖/实现所有的“抽象方法”,否则会违反规则2;4.abstract与final无法联合使用,否则子类无法继承;5.抽象类的子类可以是抽象类,这就不必取实现所有抽像方法;//动物类(抽象类)abstract class Animal{ private S原创 2021-04-16 21:44:46 · 276 阅读 · 0 评论