基础知识面试题(一)

文章详细介绍了JAVA中的基本数据类型及其内存占用,包括boolean、整数类型、浮点类型和字符类型。同时,讨论了String类的不可继承性,因其被final修饰。接着,对比了String、StringBuffer和StringBuilder的使用场景和性能差异。此外,解释了线程安全与线程不安全的概念,并分析了ArrayList和LinkedList两种列表的适用情况。最后,提到了HashMap、ConcurrentHashMap等Map类的特性和使用注意事项,以及它们在并发环境下的应用。
摘要由CSDN通过智能技术生成

1、JAVA 中的几种基本数据类型是什么,各自占用多少字节。

java语言中有8中数据类型,分为四大类型:

逻辑类型:boolean

整数类型:

byte,分配1字节内存,占8位

short,分配2字节内存,占16位

int,分配4字节内存,占32位

long,分配8字节内存,占64位

浮点类型:

float,分配4字节,占32位,实际储存8位有效数字

double,分配8字节内存,占64位,实际存储16位有效数字

字符类型:

char,分配2字节内存,占15位,变量范围:0-65535

2、String 类能被继承吗,为什么。

不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。

3、String,Stringbuffer,StringBuilder 的区别。

String:String的值是不可变的,这就导致每次对String操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间。

String是不可变的,即一旦一个String对象被创建以后,包含在这个对象中的字符串序列是不可改变的,直至这个对象被销毁;重新赋值后,并不是对原来堆中实例对象进行重新赋值,而是生成一个新的实例对象,之前的实例对象仍然存在,如果没有被再次引用,则会被垃圾回收。

StringBuffer:StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象,每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。

线程安全的,多线程操作字符串。

StringBuilder:可变类,速度更快,线程不安全,单线程操作字符串。

运行速度比较:StringBuilder>StringBuffer>String。

如果要操作少量的数据用String,多线程操作字符串缓冲区下操作大量数据StringBuffer,单线程操作字符串缓冲区下操作大量数据StringBuilder。

4、什么是线程安全的,什么是线程不安全的

线程安全:指的是多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果是一样的,不存在执行线程时出现意外结果。

线程不安全:是指不提供加锁保护机制,有可能出现多个线程先后更改数据造成所得到的的数据是脏数据。

线程安全是编程中的术语,指某个函数,函数库在并发环境中被调用时,能够正确处理多个线程之间的共享变量,使程序功能正确完成。

5、ArrayList 和 LinkedList 有什么区别

数据结构不同,ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构,当ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动,代价比较高,适合随机查找和遍历,不适合插入和删除。LinkedList适合数据的动态插入和删除,随机访问和遍历速度比较慢,另外,它还提供了List接口中没有定义的方法,专门操作表头和表位元素,可以当作堆栈、队列和双向队列使用。

6、讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函 数,字段,当 new 的时候,他们的执行顺序。

父类静态变量-父类静态代码块-子类静态变量-子类静态代码块-父类非静态变量(父类实例成员变量)-父类构造函数-子类非静态变量(子类实例成员变量)-子类构造函数。

7、用过哪些 Map 类,都有什么区别,HashMap 是线程安全的吗,并发下使用的 Map 是什 么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。

HashMap根据键的hashCode值存储数据,非线程安全,如果需要满足线程安全,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap;HashMap最多只允许一条记录的键为null,允许多条记录的值为null;HashMap里面是一个数组,然后数组中每个元素是一个单向链表,每个元素是嵌套类Entry的实例,Entry包含四个属性:key,value,hash值和用于单向链表的next

capacity:当前数组容量,始终保持2^n,可以扩容,扩容猴数组大小为当前的2倍

loadFactor:负载因子,默认为0.75

threshold:扩容的阈值,等于capacity*loadFactor

java8对HashMap进行了一些修改,最大的不同就是利用了红黑树,所以其由数组+链表+红黑树组成。

ConcurrentHashMap支持并发操作,整个ConcurrentHashMap由一个个Segment分段锁组成,Segment通过继承ReentrantLock来进行加锁,实现线程安全,并行度默认是16。

HashTable继承自Dictionaryl类,线程安全的,不允许记录的键或值为空,支持线程的同步,即任一时刻只有一个线程能写HashTable,因此也导致了HashTable在写入时会比较慢。

TreeMap实现SortedMap接口,能够把保存的记录根据键排序,默认是按键值的升序排序,当用Iterator遍历TreeMap时,得到的记录是排过序的。

LinkHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。一般在遍历的时候会比HashMap慢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值