zoukankan      html  css  js  c++  java
  • java基础

     
     
    1、说一下Java中的8种基本数据类型
    • java八种基本数据类型分为四类八种,四类分别为整型、浮点型、布尔型、字符型;八种分别为byte、short、int、long、float、double、boolean、char;
    • java八种基本数据类型的字节数:分别为1、2、4、8个字节;1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double);
    • 整数的默认类型为int,浮点数的默认类型为double;
    • 八种基本数据类型的包装类:除了char的是Character、int类型的是Integer,其他都是首字母大写
    关于值的范围问题,需要注意char类型是无符号的,不能为负,所以是0开始的;
     
     
    2、基本数据类型和string有什么区别?
    0
    (1)从存储位置上来说:
    基本数据类型存储在栈区,String属于对象类型存储在堆区。
    (2)从参数传递方面来说:
    基本数据类型采用的是值传递,而String采用的是引用传递。
    不过由于String内部实现采用了final关键字,这就导致对于String的每次更改都是在创建新的String对象,所以如果一个函数对传进来的String类型做了更改实际上是不会影响到传进来前的String对象的值得。
     
    3、说一下jvm并且对各个部分进行一下解释和自己的理解;
     
    0
    程序计数器:当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。
    Java虚拟栈:存放基本数据类型、对象的引用、方法出口等,线程私有。
    Native方法栈:和虚拟栈相似,只不过它服务于Native方法,线程私有。
    Java堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享。
    方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享
     
    4、了解垃圾回收算法吗?说一下新生代的垃圾回收算法和FULL gc
     
    • Java堆 = 老年代 + 新生代
    • 新生代 = Eden + S0 + S1
    • 当 Eden 区的空间满了, Java虚拟机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor区。
    • 大对象(需要大量连续内存空间的Java对象,如那种很长的字符串)直接进入老年态;
    • 如果对象在Eden出生,并经过第一次Minor GC后仍然存活,并且被Survivor容纳的话,年龄设为1,每熬过一次Minor GC,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。即长期存活的对象进入老年态。
    • 老年代满了而无法容纳更多的对象,Minor GC 之后通常就会进行Full GC,Full GC 清理整个内存堆 – 包括年轻代和年老代。
    • Major GC 发生在老年代的GC,清理老年区,经常会伴随至少一次Minor GC,比Minor GC慢10倍以上。
    5、hashmap和hashtable的区别解释一下
    (1).继承父类不同
    Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类;但二者都实现了Map接口。
    (2)线程的安全性
    • 1. HashTable是同步(方法中使用了Synchronize)的;而HashMap是未同步(方法中缺省Synchronize)的。
    • 2.Hashtable 线程安全,因为它每个方法中都加入了Synchronize,在多线程并发的环境下,可以直接使用Hashtable,不需自己在加同步;
    • HashMap线程不安全,因为HashMap底层是一个Entry数组,当发生hashmap冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。
    (3)是否有contains方法
    • 1.HashTable有一个contains(Object value)方法,功能和containsValue方法(Object value)功能一样。
    • 2.HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。
    (4)可否允许有null值
    key、value都是对象,但是不能拥有重复key值,value值可以重复出现。
    • 1.Hashtable中,key和value都不允许出现null值。
    • 2.HashMap允许null值(key和value都可以),因为在HashMap中null可以作为健,而它对应的值可以有 多个null。
    (5)遍历方式内部实现不同
    1.HashTable使用Enumeration,HashMap使用Iterator。
    (6)hash值不一样
    1.HashTable直接使用对象的hashCode,如下:
    //hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    2.HashMap要重新计算key值和hash值,如下:
     
    复制代码
    int hash = hash(k);
    int i = indexFor(hash, table.length);
     
    static int hash(Object x) {
      int h = x.hashCode();
     
      h += ~(h << 9);
      h ^= (h >>> 14);
      h += (h << 4);
      h ^= (h >>> 10);
      return h;
    }
    static int indexFor(int h, int length) {
      return h & (length-1);
    }
     
    (7)数组初始化和扩容不同
    • 1.HashTable中hash数组默认大小是11,增加的方式是 arr*2+1。
    • 2.HashMap中hash数组的默认大小是16,而且一定是2的指数。
     
    0
     
    0
     
    6、抽象类和接口
    接口和抽象类 是java面向对象设计的两个基础机制;
    接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到api定义和实现分离的目的;接口不能实例化;不能包含任何非常量成员;同时没有非静态方法的实现,也就是说要么都是抽象方法,要么是静态方法。java标准类库中,定义了非常多的接口,比如java.util.List
     
    抽象类是不能被实例化的类,使用abstract关键字修饰class,其目的主要是代码重用,除了不能实例化,形式上和一般的java类并没有太大的区别,可以有一个或者多个抽象方法,也可以没有抽象方案,抽象类大多数用户抽取相关的java类的共用方法实现或者共同的成员变量,然后通过继承的方式达到代码重用的目的java标准库中,比如collection 框架,很多通用部分就被抽取成为抽象类,例如:java.util.AbstractList
     
    java类实现interface 使用implement关键词,继承abstract class 则是使用extends关键词。
     
    0
     
    接口和抽象类有什么区别? - 产品哥的回答 - 知乎 https://www.zhihu.com/question/20149818/answer/153188511
     
     
    7、多线程:synchronize和lock的作用是什么
     
    8、多个线程同时读一个数组的数据需要加锁吗?假如有别的线程需要修改数组数据,不加锁会怎样
    那么问题来了,多线程执行程序一定比单线程快吗?答案是不一定。
    1.多线程增大了CPU上下文切换的开销,会导致程序执行变慢
    2.若同步不当,会有死锁的后果,导致程序瘫痪
     
    9、类的属性(其实就是面向对象的特性)
     
    10、String、StringBuilder和StringBuffer的区别
    String 是java语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑,它是典型的Immutable类,被声明成为final calss,所有的属性也都是final的,也由于它的不可变性,类似拼接,裁剪字符串等动作,都会产生新的String对象,由于字符串的普遍性,所以相关操作的效率往往对应用性能有明显的影响。
     
    StringBuffer是为解决上面提到拼接产生太多中间对象的问题而提供的一个类,我们可以用append或者add的方法,把字符串添加到已有序列的末尾或者指定位置,StringBuffer本质上是一个线程安全的可修改的字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者,StringBuilder.
     
    StringBuilder 是java1.5中新增的,在能力上和StringBuffer没有本质区别,但是它去掉了线程安全的部分,有效减少了开销,是绝大部分情况下进行字符串拼接的首选。
     
     
     
    常考基础:
    • Java中的int和Integer
    int是我们常说的整形数字,是java的8个原始数据类型(byte、short、int、long、boolean、char、float、double)之一,java语言虽然号称一切都是对象,但是原始数据类型是例外。
    Integer 是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学运算,int和字符串之间的转换等,在java5中引入了自动装箱和自动拆箱功能,java可以根据上下文,自动进行转换,极大地简化了相关编程。
     
    关于Integer 的值缓存,这涉及到java5中另外一个改进,构建Interger对象的传统方式是直接调用构造器,直接new一个对象,但是根据实践,我们发现大部分数据操作都是集中在有限的,较小的数值范围,因而,在java5中新增了静态工厂方法valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进,按照Javadoc,这个值默认缓存是-128到127之间。
     
    • String、StringBuffer、StringBuilder的区别
    • Vector、ArrayList、LinkedList的区别
    • List、set的区别
    • CurrentHashMap 、hashMap 、hashtable、TreeMap的区别
    • hashmap相关 (hash算法、entry数组、红黑树链表转化、负载因子扩容)
    • 接口和抽象类的区别与理解
    • Java异常体系,exception和error的区别
    • Java的权限修饰符(public、private、default、protect的作用域)
    深入加强:
    • jvm组成、GC调优;垃圾处理器 和垃圾清除算法
    • 双亲委派机制 、类加载过程
    • 多线程、并发相关(常问,加分项,小编直接说不太会)
    • 强引用、软引用、弱引用、幻想引用的区别
    • 知道哪些设计模式,手写单例等
    • Spring 相关,ioc 、 aop的理解
  • 相关阅读:
    springMVC学习 十二 拦截器
    SpringMVC 学习 十一 springMVC控制器向jsp或者别的控制器传递参数的四种方法
    SpringMVC 学习 十 SSM环境搭建(三)springMVC文件配置
    iconfont 在项目中的简单使用
    CSS实现带阴影效果的三角形
    前端以数组的方式传参
    JQuery的ajaxFileUpload的使用
    layer弹出层的关闭问题
    e.target与事件委托简例
    SpringBoot项目在IntelliJ IDEA中实现热部署(简单方式)
  • 原文地址:https://www.cnblogs.com/huantianxing/p/15017166.html
Copyright © 2011-2022 走看看