Java基础常见面试题(自记)
1,集合的体系架构。list集合的常用方法。
分为单列集合和双列集合。单列集合分为List和Set,List(ArrayList、LinkedList)无序有索引可重复,Set(HashSet)有序无索引元素唯一,双列集合有Map(HashMap)。
add():添加元素;indexOf():获取指定元素第一次出现的索引;set():更改指定索引的元素;get():获取指定索引的元素;remove():删除元素
2,string有什么方法。string,stringbuff和stringBuilder有什么区别。
length():获取字符串长度;indexOf():获取某个字符在字符串中的位置;charAt():求某个位置的值;split():根据正则分割字符串;substring():截取字符串;trim():去除空白;equals():比较字符串是否相同;replace():替换字符;format():格式化字符串;toLowerCase():大写变小写;toUpperCase():小写变大写。
string不可变,对已经存在的string对象修改是创建一个新对象再把新值存进去。stringBuff可变,往stringBuff里赋值使用append方法,线程安全,多线程操作数组。stringBuilder线程不安全,单线程操作数组。
效率:string<stringBuff<stringBuilder
3,避免死锁: 设置加锁顺序;设置加锁时长;死锁检测算法
4,hashmap key-value hashcode()添加元素 equals()检索元素
5,hashMap:允许key,value值为null;继承AbstractMap;
hashtable:不允许值为null;继承dictionary;遍历方式Enumeration;线程安全
6,List的子类特点
ArrayList:
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
Vector:
底层数据结构是数组,查询快,增删慢
线程安全,效率低
LinkedList:
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
7,final:修饰符。修饰的变量不可被修改,类不可被继承,方法不可被重写
finally:处理异常时使用,总会被执行的代码块
finanize:方法名。垃圾回收器将对象从内存中清理之前进行的清理工作
8,hashSet:哈希表实现,无序,只能放入一个null值
treeSet:二叉树实现,有序,不允许null值
9,;equals:基本数据类型都是比较值;引用数据类型如果没有重写equals方法,都是比较的内存地址,因为equals的底层源码实现就是。如果重写了,==比较的是内存地址,equals比较的是值。
10,&和&&:&是位运算符;&&是逻辑运算符,与
11,sleep()和wait():sleep()不会释放锁,wait()会释放锁,调用notify()或者notifyAll()。
12,线程5中状态:初始(new),运行(runnable),阻塞(blocked),等待(waitting),终结(termimated)
13,线程如何同步和通讯:synchronized(同步代码块和同步方法);通讯,wait()、notify()、notifyAll()。
14,多线程的几种实现方式:继承Thread类;实现Runnable接口,实现run()方法;实现Callable接口;通过线程池创建。
线程池核心类,ThreadPoolExecutor。
15,成员变量(实例变量),局部变量,静态变量(类变量)的区别:
成员变量(实例变量)&局部变量区别:
(1)作用域
成员变量:针对整个类有效。
局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)
(2)存储位置
成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。
当方法调用完,或者语句结束后,就自动释放。
(3)初始值
成员变量:有默认初始值。
局部变量:没有默认初始值,使用前必须赋值。
成员变量(实例变量)&静态变量(类变量)区别:
A:调用方式
静态变量也称为类变量,可以直接通过类名调用。也可以通过对象名调用。
这个变量属于类。
成员变量也称为实例变量,只能通过对象名调用。这个变量属于对象。
B:存储位置
静态变量存储在方法区长中的静态区。
成员变量存储在堆内存。
C:生命周期
静态变量随着类的加载而存在,随着类的消失而消失。生命周期长。
成员变量随着对象的创建而存在,随着对象的消失而消失。
D:与对象的相关性
静态变量是所有对象共享的数据。
成员变量是每个对象所特有的数据。
16.final修饰的变量,是引用不能变还是引用的对象不能变?
引用变象不能变,变量里所指向的对象中的值是可以改变的。当final修饰的是基本类型的变量时,相当于是常量不能被改变;当final修饰的是引用数据类型时,内存地址不能变,但该内存地址指向的对象内容是可以改变的。