1java基础

1,Java的基本数据类型有哪些

byte,short,int,long,float,double,boolean,char

2,浅拷贝和深拷贝的区别

浅拷贝只是拷贝了基本数据类型,引用数据类型复制后则会发生引用(引用类型只是拷贝的地址值)

3,重载和从写的区别

重载:只能发生在同一个类中,两个方法名称相同,但是返回值或入参的个数或顺序不同

重写:一般都发生在子父类中,子类重写父类中的方法,方法名,返回值,参数都必须一致,方法体可以不同

4,==与equals的区别

==:用于基本类型比较,比较的是内容,用于引用类型比较的是地址值

equals:主要用于引用类型比较,比较的是地址值,如果该类重写了tostring比较的则是内容,包装类,string都重写了tostring;

如果用==则对比的是在内存中的地址值,用equals则会对比两个封装类型中的具体值

基本数据类型和包装类型之间可以用==来比较,会自动拆箱

两个Interger == 比较,由于都是对象类型,所以不会拆箱比较

Integer i1= -128;的第二步自动装箱时,要调用valueOf(),Integer作为常量时,对于-128到127之间的树,会进行缓存。第二次创建 i2的时候,直接取出缓存,所以相等。而超出范围就是new了新对象了,所以不等。

5,String,StringBuffer,StringBuilder的区别

String是一个不可变的对象,每次String类型进行改变的时候,其实新创建了一个String对象

StringBuffer是线程安全的,也是可变的,每次改变的时候不会新建

StringBuider是线程不安全的,但是速度较快,适合单线程使用

  1. 操作少量的数据 => String
  2. 单线程操作字符串缓冲区下操作大量数据 =>StringBuilder
  3. 多线程操作字符缓冲区下操作大量数据 => StringBuffer
6,final关键字的作用

final主要用在类,变量,方法这三个地方

当final修饰一个类,则表示这个类为最终状态,不能被继承,这个类中的方法也会间接的被定义为final方法

当final修饰一个变量,则表示这个变量在初始化的时候就要指定值,且后续不能对这个值进行修改

使用final的原因有两个:

  1. 把方法锁定,以防止继承类修改方法的含义
  2. 节省效率

现在版本中只要对方法,变量设置为private,则会自动赋值为final

7,接口和抽象类的区别是什么

接口是抽象类的一种特例,接口中所有的方法必须都是抽象的

  1. 抽象类中可以有构造方法,接口中不能有构造方法
  2. 抽象类中可以有普通成员变量,接口中只能定义常量
  3. 接口中的方法默认public修饰,抽象类中可以是任意的
  4. 一个类可以实现多个接口,但是只能继承一个抽象类
  5. 抽象类的子类使用extends来继承,接口必须使用implements来实现接口
8,throw和throws的区别

throw:主要用在方法体中,进行抛出异常的行为

throws:

  1. 主要用于方法声明后,表示这个方法有可能会抛出哪些异常,但是并不代表这个方法一定会抛出这些异常
  2. 在throws可以指定多个异常类型
9,常见的5个RuntimeException

NullPointerException:空指针

ClassNotException:找不到指定类

NumberFormatException:转换为数字时产生异常

IndexOutOfBoundsException:数组下标越界异常

ClassCastException:数据类型转换异常

10,Set,List,Map有什么区别
  1. Set,List是存储单列数据的集合,Map是存储键值对类型的双列数据集合
  2. List存储是有序的且可重复,Map中存储的key不能重复,value可重复,Set是不能重复且无序的
  3. Set也可以说是有序的,元素在集合中的位置由元素的hashcode决定,位置是固定的,但是不能人为控制,所以对用户来说set是无序的
11,往ArrayList集合加入一万条数据,应该怎么提高效率
  1. 在初始化ArrayList 的时候就指定好具体的容量
  2. ArrayList 默认容量是 10 ,如果初始化时一开始指定了容量,或者通过集合作为元素,则容量为指定的大小或参数集合的大小。每次扩容为原来的1.5倍,如果使用无参构造器初始化容量只有 10,后面要扩容,扩容有比较伤性能,因为涉及到数组的复制和移动,将原来的数组复制到新的存储区域中去
12,HashMap,Hashtable,ConcurrentHashMap区别

        1,线程安全不同

  • HashMap是非线程安全的,只是用于单线程环境下
  • ConcurrentHashMap是线程安全的,多线程环境下可用
  • Hashtable是线程安全的,能用于多线程环境中

        2,包含contains方法不同

  • HashMap是没有contais方法的,而包括containsValue和containsKey方法
  • Hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法

        3,是否允许null值

  • HashMap允许key和value为null值,containsValue和containsKey方法判断是否包含对应键值对
  • HashTable键值对都不能为空,否则会空指针异常
13,ArrayList的扩容机制
  • 直接使用ArrayList() 的无参构造,则长度是为0
  • ArrayList(int initialCapacity)可以指定容量
  • add(Object o) 在添加的时候,首次扩容为10,后续扩容上一次的1.5倍
  • addAll(Collection c) 没有元素时,扩容 Math.max(10,实际元素个数),有元素为 Math.max(原容量1.5倍,实际元素个数)
  • 实际元素个数 = 当前个数 + 添加个数
14,fail-fast fail-safe
  • ArrayList 是 fail-fast 典型代表,遍历的同时不能修改,尽快失败
  • CopOnWriteArrayList 是 fail-safe 的典型代表,遍历的同时可以修改,原理读写分离
  • 所以 ArrayList 是非线程安全的,CopyOnWriteArrayList 线程安全
15,ArrayList 与 LinkedList 的比较(数据结构,效率方法)

        数据结构方法

                ArrayList是基于数组实现的,LinkedList是基于链表实现的

        效率方面

                ArrayList更适合随机查找,因为是用数组实现的,可以直接指定下标来查找

                ListedList更适合删除和添加(头部),因为LinkedList 默认保存的有头部位置和尾部位

                置,可以直接指定头部位置,然后放到头部位置前面,ArrayList 是需要整体往后挪,空

                出一个位置,所以添加头部的时候比ArrayList 要快一些

                查询,添加,删除的时间复杂度不同

16,HahMap底层的数据结构
  • 在 1.7 及以前,使用的是数组 + 链表
  • 在 1.8 及以后,使用的是数组 + (链表或红黑树)
17,jdk8 HashMap底层设计为什么加入红黑树

红黑树用来避免DOS攻击,防止链表超长时性能下降,树化应当是偶然情况,正常情况下概率非常低

18,HashMap 什么时候会触发树化

添加数据时,只有数组的长度大于64的时候,且索引位置元素个数大于8个的时候,才会树化

19,HashMap 什么时候会触发树退化
  • 扩容时,原来红黑树上部分数据可能会转移到别的槽中,当红黑树中的元素小于等于6时,退化成链表
  • 调用remove 方法删除数据时,删除之前校验红黑树节点 左儿子 左孙子 右儿子 是否存在,如果有一个不存在,退化链表
20,HashMap为什么要进行二次哈希

为了防止一次哈希,尤其是在数组长度较小的情况下,造成分布不均匀的情况

21,HashMap数组的长度为什么是2的n次幂
  • 为了保证:%运算 和 &运算 的结果一致,提高计算效率
  • 扩容时,hash & oldCap == 0 的元素留在原来位置,否则新的位置 = 旧位置索引 + 旧数组长度,可以提高扩容时重新计算存储索引位置的效率
22,&&与&区别
  • &&和 | | 是短路运算符,& 和 | 是非短路运算符
  • && 与 & 区别:两者都表示 “ 与 ” 运算,但是 && 运算符第一个表达式不成立的话,后界面的表达式不运算,直接返回。而 & 对所有表达式都判断
  • | | 与 | 区别:两者都表示 “ 或 ” 运算,但是 | | 运算符第一个表达式成立的话,后界面的表达式不运算,直接返回。而 | 对所有表达式都判断
23,Java中的值传递和引用传递
  • 值传递 在方法调用时,传递的参数是按值得拷贝传递
  • 引用传递 在方法调用时,传递得是参数是按引用进行传递,其实传递得引用得地址,也就是变量所对应得内存空间的地址
24,char 类型变量为社么能存储一个中文汉字

char变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char变量中可以存储汉字。如果某个特殊的汉字没有被包含在Unicode编码字符集中,那么,这个char变量就不能存储这个特殊汉字。

unicode编码占用两个字节,所以,char类型的变量也占用两个字节

24,error 和 exception 的区别
  • Error类对象由 JVM生成并抛出,大多数错误与代码编写者所执行的操作无关
  • Exception又分为RunTimeException和其他Exception。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值