1.Java中的Static
2.String,StringBuffer,StringBulider的区别
String、StringBuffer、StringBuilder
String : final修饰,所以是不可变的,即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。
StringBuilder : 它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比StringBuffer 要高。
3.什么是内部类?有什么用?
内部类( Inner Class ):就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
内部类的主要作用如下:
1.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2.内部类的方法可以直接访问外部类的所有数据,包括私有的数据
3.内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
内部类可分为以下几种:
1.成员内部类
运行结果:
2.静态内部类
1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
2、
如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
样例:
//外部类
public class HelloWorld {
// 外部类中的静态变量score
private static int score = 84;
// 创建静态内部类
public static class SInner {
// 内部类中的变量score
int score = 91;
public void show() {
System.out.println("访问外部类中的score:" + HelloWorld.score );//访问外部类中的score就要使用对应public的内部类的类型
System.out.println("访问内部类中的score:" + score);//访问内部类中的score可以直接调用
}
}
// 测试静态内部类
public static void main(String[] args) {
// 直接创建内部类的对象
SInner si=new SInner();
// 调用show方法
si.show();
}
}
3.方法内部类:
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
一定要注意哦:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
4.匿名内部类:是内部类的一种特殊情况。它只有一个实例,而且没有引用。所以,一般在能用内部类实现,但是实例只用一次的情况下使用它(可以减少资源开销)
4.Files的常用方法都有哪些?
创建:
createNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false。
mkdir() 在指定位置创建一个单级文件夹。
mkdirs() 在指定位置创建一个多级文件夹。
删除:
delete()
判断:
exists() 文件或文件夹是否存在。
isFile() 是否是一个文件,如果不存在,则始终为false。
isDirectory() 是否是一个目录,如果不存在,则始终为false。
isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
获取:
getName() 获取文件或文件夹的名称,不包含上级路径。
5.Java中的容器有哪些
Collection:
Map:
6.List,Set,Map的比较
List(列表)
List的元素以线性方式存储,可以存放重复对象,List主要有以下两个实现类:
ArrayList : 长度可变的数组,可以对元素进行随机的访问,向ArrayList中插入与删除元素的速度慢。
JDK8 中ArrayList扩容的实现是通过grow()方法里使用语句
newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍扩容)计算容量,
然后调用Arrays.copyof()方法进行对原数组进行复制。
LinkedList: 采用链表数据结构,插入和删除速度快,但访问速度慢。
Set(集合)
Set中的对象不按特定(HashCode)的方式排序,并且没有重复对象,Set主要有以下两个实现类:
HashSet: HashSet按照哈希算法来存取集合中的对象,存取速度比较快。
当HashSet中的元素个数超过数组大小*loadFactor(默认值为0.75)时,
就会进行近似两倍扩容(newCapacity = (oldCapacity << 1) + 1)。
TreeSet:TreeSet实现了SortedSet接口,能够对集合中的对象进行排序。
Map(映射)
Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一个键对象和值对象。Map主要有以下两个实现类:
HashMap:HashMap基于散列表实现,其插入和查询<K,V>的开销是固定的,可以通过构造器设置容量和负载因子来调整容器的性能。
LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得<K,V>的顺序是其插入次序, 或者是最近最少使用(LRU)的次序。
TreeMap:TreeMap基于红黑树实现。查看<K,V>时,它们会被排序。TreeMap是唯一的带有subMap()方法的Map,subMap()可以返回一个子树。
7.HashMap 和 Hashtable 有什么区别?
Hashtable是早期Java类库提供的一个哈希表实现,本身是线程安全的,不支持null键和值。由于线程安全导致的性能开销,所以已经很少被推荐使用。
HashMap是应用更加广泛的哈希表实现,行为上大致与Hashtable一致,主要区别在于HashMap不是线程安全的,且支持null键和值等。通常情况下,HashMap进行put或者get操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选。
8.如何决定使用 HashMap 还是 TreeMap?
Map | 使用情况 | 原因 |
---|---|---|
HashMap | 查询 | 基于散列表实现(推荐作为常规Map使用) |
TreeMap | 增加、快速创建 | 基于红黑树实现 |
9.如何实现数组和 List 之间的转换?
link
List转数组:
List.toArray()方法;
数组转List:
Arrays.asList()方法
10.Array 和 ArrayList 有何区别?
1、存储内容比较:
Array 数组可以包含基本类型和对象类型,
ArrayList却只能包含对象类型。
Array 数组在存放的时候一定是同种类型的元素。ArrayList 就不一定了 。
2、空间大小比较: Array 数组的空间大小是固定的,所以需要事前确定合适的空间大小。
ArrayList的空间是动态增长的,而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。
3.方法上的比较: ArrayList方法上比 Array更多样化,比如添加全部 addAll()、删除全部 removeAll()、返回迭代器 iterator() 等。
11.哪些集合类是线程安全的?
Vector:就比Arraylist多了个同步化机制(线程安全)。
Hashtable:就比Hashmap多了个线程安全。
ConcurrentHashMap:是一种高效但是线程安全的集合。
Stack:栈,也是线程安全的,继承于Vector。
enumeration:枚举,相当于迭代器