欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java学习第12天

程序员文章站 2022-05-10 11:02:25
...

容器

容器与数组的区别:

  • 容器:长度可变,任意数据类型的数据的集合;
  • 数组:长度不可变,数据类型需要完全相同,有序,有索引,查找效率较高

集合Collection:

  • 成员方法:
    *容器可以存储任意类型的数据
    *泛型的数据类型只能是引用类型,基本数据类型会发生非自动装箱操作

  • 遍历:
    *增强 for:因为不存在索引,所以不使用普通 for 遍历。
    *迭代器 :Iterator<…> it = new Iterator<>();

  • List接口: 有序的,可重复的
    *新增功能:新增关于索引的一些操作的方法
    *List接口遍历:
    ----普通 for;
    ----for…each;
    ----迭代器;

public class ListDemo04 {
	public static void main(String[] args) {
		List<Integer> list=new ArrayList();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		
		//普通for
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i)); 
		}
		
		//增强for
		for(Integer i:list){
			System.out.println(i);
		}
		
		//迭代器
		//1)获取迭代器对象
		for(Iterator it=list.iterator();it.hasNext();){
			System.out.println(it.next());
		}
		
	}
}

LIst接口下的ArrayList:

  • 有序且可以重复(此处的重复表示两个变量可以相互equals());
  • 底层:数组实现。进行动态扩容,每次使用copyOf方法进行扩容,每次扩容后的容量是之前的1.5倍;
  • 优点:随机获取或者遍历效率高;
  • 缺点:增删效率低,线程不安全

Vector:

  • 底层:数组实现,使用copyOf方法进行动态扩容,每次扩容后的容量是原容量的2倍,线程安全的,效率低

LinkedList:

  • 底层:双向链表实现
  • 优点:做增删效率高
  • 缺点:查询和遍历效率低
  • 新增功能: 新增了一些操作与头部和尾部的方法:
    —void addFirst(E e) ,将指定元素插入此列表的开头。
    —void addLast(E e) , 将指定元素添加到此列表的结尾。

以上List部分总结:

List 底层 优缺 如何选用
ArrayList 数组实现,每次使用copyOf方法进行扩容,每次扩容后的容量是之前的1.5 随机获取或者遍历效率高;但是增删效率低,线程不安全 线程不安全但是查找较多时
LinkedList 双向链表实现 增删效率高,查询和遍历效率低 线程不安全,增删较多时
Vector 数组实现,使用copyOf方法进行动态扩容,每次扩容后的容量是原容量的2 线程安全的,效率低 线程安全时

Set接口:

  • 无序的,不可重复
  • 放入数据的顺序和内部真实存储的顺序不一致,内部有自己的存储顺序,一旦确定了存储顺序不会发生改变:

Set接口下的TreeSet:

  • 底层:红黑树;
  • 优点:升序排序

HashSet;

  • 底层:哈希表结构(数组+链表+红黑树)
  • 优点:查询,添加,删除,修改效率高
  • 缺点:无序
  • 如果两个对象的hashcode值不相同,两个对象肯定不相同,如果值相同,可能不是相同对象,可以是相同对象
  • 对对象类型数据进行去重:要重写hashCode和equals方法
  • 先比较hashCode:
    ----如果值不同,不会调用equals方法
    ----如果值相同才会调用equals方法