1,线程可以重用,提升运行效率,放到线程池中的线程必须实现Runnable或者Callable接口
2,使用线程池的最大原因就是可以根据系统的需求和硬件环境灵活控制线程的数量,可以对所有线程进行统一的管理和控制,从而提高系统的运行效率,降低系统运行压力
3,线程池的优势:
线程和任务分离,线程有了重用性
控制线程并发数量,降低服务器压力
使用线程池免去了创建线程和销毁线程所用的时间
vector线程同步,线程安全
Arraylist 线程异步,线程不安全, 多线程效率高
hashset 内部是二叉树和链表 每次运行后的顺序相同,(内部做了排序 (结合算法等...))
linkedhashset内部是链表
set存放引用数据类型可以重复(以不同的地址存放) 涉及到引用数据类型,任何操作默认的是比较地址.
集合和数组的区别:
1,数组固定,集合可变
2,集合只能是引用数据类型
3,数组只能存储同一种类型,集合可以存储不同类型
hashset:
底层数据结构采用哈希表实现,线程不安全,可以存储null元素,如果没有重写hashCode和equals方法,则无法保证元素的唯一性
实现唯一性的比较过程:
先比较hashcode值(使用hash算法函数生成的一个int类型的hashcode散列值)如果相等,再使用equals方法比较内容
* List:数据是有顺序(添加的先后顺序)的,数据是可以重复。
* ArrayList:内部结构是数组。比较适合做高频率的查找,遍历。
* LinkedList:双向链表。比较适合做高频率的新增和删除。
* Vector:和ArrayList几乎一模一样。
public class Ch01 {
public static void main(String[] args) {
// List<String> list = new LinkedList<>();
LinkedList<String> list = new LinkedList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 我们在创建对象的时候用的是多态
// 父类对象---子类引用
// 我们创建出来的对象只能够调用父类和子类中都有的方法
list.addFirst("z");
list.addLast("x");
list.removeFirst();
list.removeLast();
// 根据下标索引获取指定位置的元素
System.out.println(list.get(2));
System.out.println(list);
}
}
* 面试题:
* 1.Collection和Map接口的区别
* 2.ArrayList和LinkedList的区别
* 3.ArrayList和Vector的区别
* 4.List和Set的区别
* 5.HashSet和LinkedHashSet的区别和联系
* Collection接口:
* List:有顺序,元素可以重复,顺序指的是添加的先后顺序
* Set:没有顺序,元素不可以重复,顺序指的是添加的先后顺序
*
* Set其实是有顺序,内部有一个专门排序的算法。
* 1.所谓的无序不等于随机
* 2.所谓的无序指的是没有按照添加的先后顺序,其实内部是做了排序的。
public class Ch02 {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(Integer.valueOf(200));
set.add(4);
set.add(15);
set.add(38);
set.add(Integer.valueOf(200));
System.out.println(set);
}
}