当前位置: 首页 > news >正文

货代一般都去哪个网站找客户wordpress集中页面地址

货代一般都去哪个网站找客户,wordpress集中页面地址,软文写作发布,腾讯公众号小程序作者#xff1a;逍遥Sean 简介#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话#xff0c;可以三连支持一下~ 如有需要我的支持#xff0c;请私信或评论留言#xff01; Java基础常考知识点… 作者逍遥Sean 简介一个主修Java的Web网站\游戏服务器后端开发者 主页https://blog.csdn.net/Ureliable 觉得博主文章不错的话可以三连支持一下~ 如有需要我的支持请私信或评论留言 Java基础常考知识点 基础JDK、JRE、JVM之间的区别hashCode()与equals()之间的关系String、StringBuffer、StringBuilder的区别泛型中extends和super的区别和equals⽅法的区别重载和重写的区别深拷⻉和浅拷⻉什么是字节码采⽤字节码的好处是什么Java中有哪些类加载器说说类加载器双亲委派模型 集合List和Set的区别ArrayList和LinkedList区别谈谈ConcurrentHashMap的扩容机制Jdk1.7到Jdk1.8 HashMap 发⽣了什么变化(底层)?说⼀下HashMap的Put⽅法HashMap的扩容机制原理CopyOnWriteArrayList的底层原理是怎样的 异常Java中的异常体系是怎样的在Java的异常处理机制中什么时候应该抛出异常什么时候捕获异常 JVMJVM中哪些是线程共享区项⽬如何排查JVM问题⼀个对象从加载到JVM再到被GC清除都经历了什么过程怎么确定⼀个对象到底是不是垃圾JVM有哪些垃圾回收算法什么是STW 本文收集Java核心的面试常考知识点码起面试之前复习 基础 JDK、JRE、JVM之间的区别 JDK(Java SE Development Kit)Java标准开发包它提供了编译、运⾏Java程序所需的各种⼯具和资源包括Java编译器、Java运⾏时环境以及常⽤的Java类库等JRE( Java Runtime Environment) Java运⾏环境⽤于运⾏Java的字节码⽂件。JRE中包括了JVM以及JVM⼯作所需要的类库普通⽤户⽽只需要安装JRE来运⾏Java程序⽽程序开发者必须安装JDK来编译、调试程序。JVM(Java Virtual Mechinal)Java虚拟机是JRE的⼀部分它是整个java实现跨平台的最核⼼的部分负责运⾏字节码⽂件。 我们写Java代码⽤txt就可以写但是写出来的Java代码想要运⾏需要先编译成字节码那就需要编译器⽽JDK中就包含了编译器javac编译之后的字节码想要运⾏就需要⼀个可以执⾏字节码的程序这个程序就是JVMJava虚拟机专⻔⽤来执⾏Java字节码的。 如果我们要开发Java程序那就需要JDK因为要编译Java源⽂件。 如果我们只想运⾏已经编译好的Java字节码⽂件也就是*.class⽂件那么就只需要JRE。JDK中包含了JREJRE中包含了JVM。 另外JVM在执⾏Java字节码时需要把字节码解释为机器指令⽽不同操作系统的机器指令是有可能不⼀样的所以就导致不同操作系统上的JVM是不⼀样的所以我们在安装JDK时需要选择操作系统。另外JVM是⽤来执⾏Java字节码的所以凡是某个代码编译之后是Java字节码那就都能在JVM上运⾏⽐如Apache Groovy, Scala and Kotlin 等等。 hashCode()与equals()之间的关系 在Java中每个对象都可以调⽤⾃⼰的hashCode()⽅法得到⾃⼰的哈希值(hashCode)相当于对象的指纹信息通常来说世界上没有完全相同的两个指纹但是在Java中做不到这么绝对但是我们仍然可以利⽤hashCode来做⼀些提前的判断⽐如 如果两个对象的hashCode不相同那么这两个对象肯定不同的两个对象如果两个对象的hashCode相同不代表这两个对象⼀定是同⼀个对象也可能是两个对象如果两个对象相等那么他们的hashCode就⼀定相同 在Java的⼀些集合类的实现中在⽐较两个对象是否相等时会根据上⾯的原则会先调⽤对象的hashCode()⽅法得到hashCode进⾏⽐较如果hashCode不相同就可以直接认为这两个对象不相同如果hashCode相同那么就会进⼀步调⽤equals()⽅法进⾏⽐较。⽽equals()⽅法就是⽤来最终确定两个对象是不是相等的通常equals⽅法的实现会⽐较重逻辑⽐较多⽽hashCode()主要就是得到⼀个哈希值实际上就⼀个数字相对⽽⾔⽐较轻所以在⽐较两个对象时通常都会先根据hashCode想⽐较⼀下。 所以我们就需要注意如果我们重写了equals()⽅法那么就要注意hashCode()⽅法⼀定要保证能遵守上述规则。 String、StringBuffer、StringBuilder的区别 String是不可变的如果尝试去修改会新⽣成⼀个字符串对象StringBuffer和StringBuilder是可变的StringBuffer是线程安全的StringBuilder是线程不安全的所以在单线程环境下StringBuilder效率会更⾼ 泛型中extends和super的区别 ? extends T表示包括T在内的任何T的⼦类 ? super T表示包括T在内的任何T的⽗类 和equals⽅法的区别 如果是基本数据类型⽐较是值如果是引⽤类型⽐较的是引⽤地址equals具体看各个类重写equals⽅法之后的⽐较逻辑⽐如String类虽然是引⽤类型但是String类中重写了equals⽅法⽅法内部⽐较的是字符串中的各个字符是否全部相等。 重载和重写的区别 重载(Overload) 在⼀个类中同名的⽅法如果有不同的参数列表⽐如参数类型不同、参数个数不同则视为重载。重写(Override) 从字⾯上看重写就是 重新写⼀遍的意思。其实就是在⼦类中把⽗类本身有的⽅法重新写⼀遍。⼦类继承了⽗类的⽅法但有时⼦类并不想原封不动的继承⽗类中的某个⽅法所以在⽅法名参数列表返回类型都相同(⼦类中⽅法的返回值可以是⽗类中⽅法返回值的⼦类)的情况下 对⽅法体进⾏修改这就是重写。但要注意⼦类⽅法的访问修饰权限不能⼩于⽗类的。 深拷⻉和浅拷⻉ 深拷⻉和浅拷⻉就是指对象的拷⻉⼀个对象中存在两种类型的属性⼀种是基本数据类型⼀种是实例对象的引⽤。 浅拷⻉是指只会拷⻉基本数据类型的值以及实例对象的引⽤地址并不会复制⼀份引⽤地址所指向的对象也就是浅拷⻉出来的对象内部的类属性指向的是同⼀个对象深拷⻉是指既会拷⻉基本数据类型的值也会针对实例对象的引⽤地址所指向的对象进⾏复制深拷⻉出来的对象内部的属性指向的不是同⼀个对象 什么是字节码采⽤字节码的好处是什么 编译器(javac)将Java源⽂件(.java)⽂件编译成为字节码⽂件(.class)可以做到⼀次编译到处运⾏windows上编译好的class⽂件可以直接在linux上运⾏通过这种⽅式做到跨平台不过Java的跨平台有⼀个前提条件就是不同的操作系统上安装的JDK或JRE是不⼀样的虽然字节码是通⽤的但是需要把字节码解释成各个操作系统的机器码是需要不同的解释器的所以针对各个操作系统需要有各⾃的JDK或JRE。 采⽤字节码的好处⼀⽅⾯实现了跨平台另外⼀⽅⾯也提⾼了代码执⾏的性能编译器在编译源代码时可以做⼀些编译期的优化⽐如锁消除、标量替换、⽅法内联等。 Java中有哪些类加载器 JDK⾃带有三个类加载器bootstrap ClassLoader、ExtClassLoader、AppClassLoader。 BootStrapClassLoader是ExtClassLoader的⽗类加载器默认负责加载%JAVA_HOME%lib下的jar包和class⽂件。ExtClassLoader是AppClassLoader的⽗类加载器负责加载%JAVA_HOME%/lib/ext⽂件夹下的jar包和class类。AppClassLoader是⾃定义类加载器的⽗类负责加载classpath下的类⽂件。 说说类加载器双亲委派模型 JVM中存在三个默认的类加载器 BootstrapClassLoaderExtClassLoaderAppClassLoader AppClassLoader的⽗加载器是ExtClassLoaderExtClassLoader的⽗加载器是BootstrapClassLoader。 JVM在加载⼀个类时会调⽤AppClassLoader的loadClass⽅法来加载这个类不过在这个⽅法中会先使⽤ExtClassLoader的loadClass⽅法来加载类同样ExtClassLoader的loadClass⽅法中会先使⽤ BootstrapClassLoader来加载类如果BootstrapClassLoader加载到了就直接成功如果BootstrapClassLoader没有加载到那么ExtClassLoader就会⾃⼰尝试加载该类如果没有加载到那么则会由AppClassLoader来加载这个类。 所以双亲委派指得是JVM在加载类时会委派给Ext和Bootstrap进⾏加载如果没加载到才由⾃⼰进⾏加载。 集合 List和Set的区别 List有序按对象插⼊的顺序保存对象可重复允许多个Null元素对象可以使⽤Iterator取出所有元素在逐⼀遍历还可以使⽤get(int index)获取指定下标的元素Set⽆序不可重复最多允许有⼀个Null元素对象取元素时只能⽤Iterator接⼝取得所有元素在逐⼀遍历各个元素 ArrayList和LinkedList区别 ⾸先他们的底层数据结构不同ArrayList底层是基于数组实现的LinkedList底层是基于链表实现的由于底层数据结构不同他们所适⽤的场景也不同ArrayList更适合随机查找LinkedList更适合删除和添加查询、添加、删除的时间复杂度不同另外ArrayList和LinkedList都实现了List接⼝但是LinkedList还额外实现了Deque接⼝所以LinkedList还可以当做队列来使⽤ 谈谈ConcurrentHashMap的扩容机制 1.7版本 1.7版本的ConcurrentHashMap是基于Segment分段实现的每个Segment相对于⼀个⼩型的HashMap每个Segment内部会进⾏扩容和HashMap的扩容逻辑类似先⽣成新的数组然后转移元素到新数组中扩容的判断也是每个Segment内部单独判断的判断是否超过阈值 1.8版本 1.8版本的ConcurrentHashMap不再基于Segment实现当某个线程进⾏put时如果发现ConcurrentHashMap正在进⾏扩容那么该线程⼀起进⾏扩容如果某个线程put时发现没有正在进⾏扩容则将key-value添加到ConcurrentHashMap中然 后判断是否超过阈值超过了则进⾏扩容ConcurrentHashMap是⽀持多个线程同时扩容的扩容之前也先⽣成⼀个新的数组在转移元素时先将原数组分组将每组分给不同的线程来进⾏元素的转移每个线程负责⼀组或 多组的元素转移⼯作 Jdk1.7到Jdk1.8 HashMap 发⽣了什么变化(底层)? 1.7中底层是数组链表1.8中底层是数组链表红⿊树加红⿊树的⽬的是提⾼HashMap插⼊和查询整体效率1.7中链表插⼊使⽤的是头插法1.8中链表插⼊使⽤的是尾插法因为1.8中插⼊key和value时需要判断链表元素个数所以需要遍历链表统计链表元素个数所以正好就直接使⽤尾插法1.7中哈希算法⽐较复杂存在各种右移与异或运算1.8中进⾏了简化因为复杂的哈希算法的⽬的就是提⾼散列性来提供HashMap的整体效率⽽1.8中新增了红⿊树所以可以适当的简化哈希算法节省CPU资源 说⼀下HashMap的Put⽅法 先说HashMap的Put⽅法的⼤体流程 根据Key通过哈希算法与与运算得出数组下标如果数组下标位置元素为空则将key和value封装为Entry对象JDK1.7中是Entry对象JDK1.8中 是Node对象并放⼊该位置如果数组下标位置元素不为空则要分情况讨论 a. 如果是JDK1.7则先判断是否需要扩容如果要扩容就进⾏扩容如果不⽤扩容就⽣成Entry对 象并使⽤头插法添加到当前位置的链表中 b. 如果是JDK1.8则会先判断当前位置上的Node的类型看是红⿊树Node还是链表Node ⅰ.如果是红⿊树Node则将key和value封装为⼀个红⿊树节点并添加到红⿊树中去在这个过程中会判断红⿊树中是否存在当前key如果存在则更新value ⅱ. 如果此位置上的Node对象是链表节点则将key和value封装为⼀个链表Node并通过尾插法插⼊到链表的最后位置去因为是尾插法所以需要遍历链表在遍历链表的过程中会判断是否存在当前key如果存在则更新value当遍历完链表后将新链表Node插⼊到链表中插⼊到链表后会看当前链表的节点个数如果⼤于等于8那么则会将该链表转成 红⿊树 ⅲ. 将key和value封装为Node插⼊到链表或红⿊树中后再判断是否需要进⾏扩容如果需要 就扩容如果不需要就结束PUT⽅法 HashMap的扩容机制原理 1.7版本 1. 先⽣成新数组 2. 遍历⽼数组中的每个位置上的链表上的每个元素 3. 取每个元素的key并基于新数组⻓度计算出每个元素在新数组中的下标 4. 将元素添加到新数组中去 5. 所有元素转移完了之后将新数组赋值给HashMap对象的table属性1.8版本 1. 先⽣成新数组 2. 遍历⽼数组中的每个位置上的链表或红⿊树 3. 如果是链表则直接将链表中的每个元素重新计算下标并添加到新数组中去 4. 如果是红⿊树则先遍历红⿊树先计算出红⿊树中每个元素对应在新数组中的下标位置a. 统计每个下标位置的元素个数b. 如果该位置下的元素个数超过了8则⽣成⼀个新的红⿊树并将根节点的添加到新数组的对应位置c. 如果该位置下的元素个数没有超过8那么则⽣成⼀个链表并将链表的头节点添加到新数组的对应位置 5. 所有元素转移完了之后将新数组赋值给HashMap对象的table属性CopyOnWriteArrayList的底层原理是怎样的 ⾸先CopyOnWriteArrayList内部也是⽤过数组来实现的在向CopyOnWriteArrayList添加元素时会复制⼀个新的数组写操作在新数组上进⾏读操作在原数组上进⾏并且写操作会加锁防⽌出现并发写⼊丢失数据的问题写操作结束之后会把原数组指向新数组CopyOnWriteArrayList允许在写操作时来读取数据⼤⼤提⾼了读的性能因此适合读多写少的应⽤场景但是CopyOnWriteArrayList会⽐较占内存同时可能读到的数据不是实时最新的数据所以不适合实时性要求很⾼的场景 异常 Java中的异常体系是怎样的 Java中的所有异常都来⾃顶级⽗类Throwable。Throwable下有两个⼦类Exception和Error。Error表示⾮常严重的错误⽐如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError通常这些错误出现时仅仅想靠程序⾃⼰是解决不了的可能是虚拟机、磁盘、操作系统层⾯出现的问题了所以通常也不建议在代码中去捕获这些Error因为捕获的意义不⼤因为程序可能已经根本运⾏不了了。Exception表示异常表示程序出现Exception时是可以靠程序⾃⼰来解决的⽐如NullPointerException、IllegalAccessException等我们可以捕获这些异常来做特殊处理。Exception的⼦类通常⼜可以分为RuntimeException和⾮RuntimeException两类RunTimeException表示运⾏期异常表示这个异常是在代码运⾏过程中抛出的这些异常是⾮检查异常程序中可以选择捕获处理也可以不处理。这些异常⼀般是由程序逻辑错误引起的程序应该从逻辑⻆度尽可能避免这类异常的发⽣⽐如NullPointerException、IndexOutOfBoundsException等。⾮RuntimeException表示⾮运⾏期异常也就是我们常说的检查异常是必须进⾏处理的异常如果不处理程序就不能检查异常通过。如IOException、SQLException等以及⽤户⾃定义的Exception异常。 在Java的异常处理机制中什么时候应该抛出异常什么时候捕获异常 异常相当于⼀种提示如果我们抛出异常就相当于告诉上层⽅法我抛了⼀个异常我处理不了这个异常交给你来处理⽽对于上层⽅法来说它也需要决定⾃⼰能不能处理这个异常是否也需要交给它的上层。 所以我们在写⼀个⽅法时我们需要考虑的就是本⽅法能否合理的处理该异常如果处理不了就继续向上抛出异常包括本⽅法中在调⽤另外⼀个⽅法时发现出现了异常如果这个异常应该由⾃⼰来处理那就捕获该异常并进⾏处理。 JVM JVM中哪些是线程共享区 堆区和⽅法区是所有线程共享的栈、本地⽅法栈、程序计数器是每个线程独有的 项⽬如何排查JVM问题 对于还在正常运⾏的系统 可以使⽤jmap来查看JVM中各个区域的使⽤情况可以通过jstack来查看线程的运⾏情况⽐如哪些线程阻塞、是否出现了死锁可以通过jstat命令来查看垃圾回收的情况特别是fullgc如果发现fullgc⽐较频繁那么就得进⾏调优了通过各个命令的结果或者jvisualvm等⼯具来进⾏分析⾸先初步猜测频繁发送fullgc的原因如果频繁发⽣fullgc但是⼜⼀直没有出现内存溢出那么表示fullgc实际上是回收了很多对象了所以这些对象最好能在younggc过程中就直接回收掉避免这些对象进⼊到⽼年代对于这种情况就要考虑这些存活时间不⻓的对象是不是⽐较⼤导致年轻代放不下直接进⼊到了⽼年代尝试加⼤年轻代的⼤⼩如果改完之后fullgc减少则证明修改有效同时还可以找到占⽤CPU最多的线程定位到具体的⽅法优化这个⽅法的执⾏看是否能避免某些对象的创建从⽽节省内存 对于已经发⽣了OOM的系统 ⼀般⽣产系统中都会设置当系统发⽣了OOM时⽣成当时的dump⽂件-XX:HeapDumpOnOutOfMemoryError -XX : HeapDumpPath /usr/local/base我们可以利⽤jsisualvm等⼯具来分析dump⽂件根据dump⽂件找到异常的实例对象和异常的线程占⽤CPU⾼定位到具体的代码然后再进⾏详细的分析和调试 总之调优不是⼀蹴⽽就的需要分析、推理、实践、总结、再分析最终定位到具体的问题 ⼀个对象从加载到JVM再到被GC清除都经历了什么过程 ⾸先把字节码⽂件内容加载到⽅法区然后再根据类信息在堆区创建对象对象⾸先会分配在堆区中年轻代的Eden区经过⼀次Minor GC后对象如果存活就会进⼊Suvivor区。在后续的每次Minor GC中如果对象⼀直存活就会在Suvivor区来回拷⻉每移动⼀次年龄加1当年龄超过15后对象依然存活对象就会进⼊⽼年代如果经过Full GC被标记为垃圾对象那么就会被GC线程清理掉 怎么确定⼀个对象到底是不是垃圾 引⽤计数算法 这种⽅式是给堆内存当中的每个对象记录⼀个引⽤个数。引⽤个数为0的就认为是 垃圾。这是早期JDK中使⽤的⽅式。引⽤计数⽆法解决循环引⽤的问题。可达性算法 这种⽅式是在内存中从根对象向下⼀直找引⽤找到的对象就不是垃圾没找到的对象就是垃圾。 JVM有哪些垃圾回收算法 标记清除算法 a. 标记阶段把垃圾内存标记出来 b. 清除阶段直接将垃圾内存回收。 c. 这种算法是⽐较简单的但是有个很严重的问题就是会产⽣⼤量的内存碎⽚。复制算法为了解决标记清除算法的内存碎⽚问题就产⽣了复制算法。复制算法将内存分为⼤⼩相等的两半每次只使⽤其中⼀半。垃圾回收时将当前这⼀块的存活对象全部拷⻉到另⼀半然后当前这⼀半内存就可以直接清除。这种算法没有内存碎⽚但是他的问题就在于浪费空间。⽽且他的效率跟存活对象的个数有关。标记压缩算法为了解决复制算法的缺陷就提出了标记压缩算法。这种算法在标记阶段跟标记清除算法是⼀样的但是在完成标记之后不是直接清理垃圾内存⽽是将存活对象往⼀端移动然后将边界以外的所有内存直接清除。 什么是STW STW: Stop-The-World是在垃圾回收算法执⾏过程当中需要将JVM内存冻结的⼀种状态。在STW状态下JAVA的所有线程都是停⽌执⾏的-GC线程除外native⽅法可以执⾏但是不能与JVM交互。GC各种算法优化的重点就是减少STW同时这也是JVM调优的重点。
http://www.zqtcl.cn/news/401277/

相关文章:

  • 成都公司的网站制作网站建设网店名字
  • 网站备案医疗保健审批号是什么基于asp.net网站开发
  • 生活做爰网站如何用织梦做网站
  • 网站拒绝被百度收录c#+开发网站开发
  • 营销网站竞品分析报告东莞网页制作网站
  • 东莞手机手机端网站建设云企网站
  • 网站中弹出广告怎么做网站建设实践报告
  • 站长工具seo综合查询隐私查询导航网站诚信备案
  • 亳州做网站哪家好网站开发的现实意义
  • 创意视觉网站济南网站建设招标
  • 厦门市建设局报表网站南通网站建设计划书
  • 深圳网站建设_模板网站seo
  • 云虚拟主机做网站简单的电商网站开发
  • 注销网站和取消接入深圳建设工程信息价
  • 上海专业网站建设公司站霸网络中国住房和城乡建设部
  • 邯郸做移动网站找谁广西茶叶学会 网站建设
  • 湛江建设网站美乐乐网站首页如何修改
  • 小刘网站建设网络推广和优化是什么意思
  • 特卖网站设计seo优化关键词挖掘
  • 绍兴市交通建设有限公司网站陕西建设分行网站
  • 如何套用别人网站做页面自己创建app
  • 建国内外网站有什么区别永久免费视频会议服务器
  • 个人网站备案成功后怎么做网站开发要学哪些知识
  • 论文写作数据网站餐饮招商
  • 嘉祥网站建设公司小企业网站建设多少钱
  • 做设计.不抠图网站114在线查询电话
  • 上饶网站制作需要多少钱网站百度地图标注
  • 微信网站二次开发广州番禺人才网
  • 支部网站及活动室建设免费建设网站有哪些
  • 深圳福田专业网站推广互联网网站开发有哪些职位