常见集合类
Collection接口和Map接口是所有集合框架的父接口
Collection接口包括List和Set
Map接口具体有HashMap,TreeMap,HashTable,ConcurrentHashMap
Set接口实现类有:HashSet,TreeSet,LinkedHashSet
List接口实现类:Arraylist,Linkedlist, Stack,Vector
- 单列集合:Collection ,分为List,Set
List分为Arraylist和Linkedlist- .List和Set的区别
List集合元素有序且允许重复
Set集合元素无序且不允许重复 - Arraylist和Linkedlist的区别:
Arraylist底层数据结构是数组有索引,查询速度快,增删慢
Linkedlist底层数据结构是双向链表没有索引,查询速度慢,增删快
- .List和Set的区别
- 双列集合:Map,分为HashMap,HashTable,ConcurrentHashMap
- HashMap的数据结构:
jdk1.7由数组+链表组成,每一个entry(链表)对应着一个table(数组)的索引页
jdk1.8由数组+链表+二叉树
- HashMap的数据结构:
HashMap和HashTable的区别
HashMap没有考虑同步,是线程不安全的
HashTable使用了synchronized关键字,是线程安全的
HashMap允许K/V都为null,后者不允许
HashMap继承自AbstractMap类,后者继承自Directory类
HashMap的工作原理
底层存储着Entry对象,将K/Y传给put()方法时,调用hashCode计算hash值,从而得到对应在Table中的位置,如果存储key的hash值所对应的位置已经存在元素.HashMap通过链表将产生的碰撞冲突的元素组织起来.当冲突的元素超过8,使用红黑树来替换链表,从而提高速度.
Object类有哪些方法
static修饰的方法
用static修饰的方法,会单独存放在一块内存中,和函数,变量不在同一块内存中,在程序运行时已经加载好,程序结束时会释放,直接用类名方法调用,不需要new一个对象去访问这个方法.
public/protected/private 的区别
作用域.pngfinal修饰的作用
1.修饰变量:表示变量无法修改
2.修饰方式:继承可以直接拿来用,不能重写
3.修饰类:无法继承
抽象类和接口的区别和相同和各自应用场景
不同:
1.抽象类可以提供成员方法的实现细节,接口只能存在public abstract方法
2.抽象类的成员变量可以是各种类型,接口成员变量必须用public static final
3.抽象类中可以有静态代码块和静态方法,接口中不能有
4.一个类只能继承一个抽象类,却可以实现多个接口
相同:
1.不能被实例化
2.抽象方法都必须被子类实现
场景:
接口是对动作的抽象,抽象类是对事物本质的抽象
接口中的方法为什么不能用static,为什么要用public abstract修饰
public可以让所有用户访问到,abstract可以子类实现时必须重写(除非子类是抽象类)
不能用static是因为static和abstract不能同时有,因为static方法可以通过类名.方法名调用,而抽象方法又没有方法体,所以矛盾
ArrayList和Vector相同和不同
1.ArrayList和Vector都是基于Object[];
1.Vector是多线程安全的,Vector方法中有很多Synchronized修饰,导致了Vector效率比ArrayList低
2.Arraylist线程不安全,效率高
Object类
Object类.png对这些方法功能进行简单的描述:
(一)Object():默认构造方法
(二)clone():创建并返回此对象的一个副本
(三)equals():指示某个其他对象是否与此对象相等
(四)finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
(五)getClass():返回一个对象的运行时类
(六)hashCode():返回该对象的哈希值
(七)notify():唤醒此对象监视器上等待的单个线程
(八)notifyAll():唤醒此对象监视器上等待的所有线程
(九)toString():返回该对象的字符串表示
(十)wait():导致当前的线程等待,直到其它线程调用此对象的notify()或notifyAll()
(十一)wait(long timeout):导致当前的线程等待调用此对象的notify()或notifyAll()
(十二)wait(long timeout, int nanos):导致当前的线程等待,直到其他线程调用此对象的notify()或notifyAll(),或其他某个线程中断当前线程,或者已超过某个实际时间量
(十三)registerNatives():对本地方法进行注册
排序
https://www.jianshu.com/p/0e5cf7542c62
快速排序
public class QuickSort {
public static void main(String[] args) {
int[] a = {5, 8, 4, 2, 6, 1, -2, 8};
quicksort(a, 0, a.length - 1);
for (int i : a) {
System.out.print(i + " ");
}
}
private static void quicksort(int[] a, int low, int high) {
if (low < high) {
int index = getIndex(a, low, high);
quicksort(a, low, index - 1);
quicksort(a, index + 1, high);
}
}
private static int getIndex(int[] a, int low, int high) {
int tmp = a[low];
while (low < high) {
while (low < high && a[high] >= tmp)
high--;
a[low] = a[high];
while (low < high && a[low] <= tmp)
low++;
a[high] = a[low];
}
a[low] = tmp;
return low;
}
}
堆内存和栈内存
1.栈内存:在方法中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配.超过变量的作用域后,会自动释放该变量分配的内存空间.
2.堆内存:存放由new创建的对象和数组,由java自动回收器来管理.
网友评论