java学习-day15-泛型.集合(一)ArrayList .LinkedList. HashSet

泛型

标志是 <> 通常配合集合一起使用
好处: 1. 约束集合元素的类型,进行安全检查,把错误显示在编译期
2. 代码通用性更强

类型安全检查
import java.util.ArrayList;
public class test1 {
	public static void main(String[] args) {
		int[] a = new int[3];
		//1、泛型就想模拟  数组,在编译时期,就检查数据的类型有没有符合要求
		//a[0] = 9.9 ;
		//a[1] = "jack" ;
		  a[2] = 10 ;			
		//创建集合
		//2、来意:是约束集合中的元素的  类型。
		//ArrayList list = new ArrayList();//没有约束
		//3、泛型中,只能写 引用类型,不能是基本类型。
		ArrayList<Integer> list = new ArrayList<>();//有约束		
		//向集合中存放元素
		//4、在编译期就会报错,提前了报错时机。
		//list.add(9.9);   //报错,不符合泛型的类型检查。
		//list.add("rose");   //报错,不符合泛型的类型检查
		list.add(10);		
		}	
}

foreach循环
语法: for(数据的类型 变量名 : 要遍历的数据)

代码通用性更强
public class test2 {
	public static void main(String[] args) {
		Integer[] a = {1,2,3,4,5};
		Double[] b = {1.1,2.2,3.3,4.4,5.5};
		String[] c = {"h","e","l","l","o"};
		print(a);
		print(b);
		print(c);
	}
	//1、泛型可以使用在类(接口)上,也可以使用在方法上(返回值前+参数列表)
	//2、约束了参数类型是泛型类型
	//普通for循环 foreach :效率上foreach > 普通for 语法上foreach更简洁
	//foreach循环 
	//语法: for(数据的类型 变量名 : 要遍历的数据)
	public static <E> void print(E[] e) {
		for(E c:e) {
			System.out.println(c);
		}
	}
	//传统方式通过重载多态实现,方法同名,参数类型不同。
//	public static void print(Integer[] a) {
//		for(Integer c:a) {
//			System.out.println(c);
//		}
//	}
//	public static void print(Double[] b) {
//		for(Double c:b) {
//			System.out.println(c);
//		}
//	}
//	public static void print(String[] c) {
//		for(String s:c) {
//			System.out.println(s);
//		}
//	}
}

集合

存放多个数据? 数组
数组的缺点: 只能存放相同类型数据,长度不可变,遍历方式单一
所以产生了集合

Collection接口

Collection是根接口。
在这里插入图片描述

常用方法
boolean add(E e)

添加元素。

boolean addAll(Collection  c)

把小集合添加到大集合中 。

boolean contains(Object o)

如果此 collection 包含指定的元素,则返回 true。

boolean isEmpty();

如果此 collection 没有元素,则返回 true。

Iterator<E> iterator();

返回在此 collection 的元素上进行迭代的迭代器。

boolean remove(Object o);

从此 collection 中移除指定元素的单个实例。

int size();

返回此 collection 中的元素数。

Objec[] toArray();

返回对象数组

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;

//这个类用来测试 Collection 接口
public class test3 {
	public static void main(String[] args) {
		// 1、创建对象
		Collection<String> col = new ArrayList();
		// 2、常用方法
		col.add("jack");// 添加元素
		col.add("rose");
		col.add("hanmeimei");
		// col.clear();//清空集合
		System.out.println(col.contains("jack"));//判断集合中是否包含指定元素
		System.out.println(col.equals("韩梅梅"));//判断集合是否和指定元素相等
		System.out.println(col.hashCode());//返回集合对象在内存中的哈希码值
		System.out.println(col.isEmpty());//判断集合是否为空
		System.out.println(col.remove("rose"));//返回是否删除成功
		System.out.println(col.size());//获取集合的长度
		System.out.println(   Arrays.toString(  col.toArray()  )   );//把集合转成Object[]
		// 集合间的操作
		Collection<String> col2 = new ArrayList();
		col2.add("1");
		col2.add("2");
		col2.add("3");
		System.out.println(col.addAll(col2));//向col集合中添加col2集合的元素
		System.out.println(col.containsAll(col2));//判断col中是否包含col2的元素
		//System.out.println(col.removeAll(col2));//删除col2的元素
		//System.out.println(col.retainAll(col2));//删除col集合的元素
		// 迭代器:迭代/遍历集合中的元素
		Iterator it = col.iterator();
		while( it.hasNext()  ) {//hasNext()判断集合中有下一个元素吗
				System.out.println(  it.next()  ); //next()获取遍历到的元素
		}	
	}
}

List 接口

有序的Collection,此接口的用户可以对列表中每个元素的插入位置进行准确的控制,用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素
特点:元素都有索引,元素可以重复,元素有序
常用方法:

  1. 从 Collection接口继承过来的方法
  2. List 接口特有的方法
 void add(int index, E element)
 boolean addAll(int index, Collection<? extends E> c)  

在列表的指定位置插入指定元素(可选操作)

E get(int index) 

返回列表中指定位置的元素。

int indexOf(Object o)

返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。

int lastIndexOf(Object o)

返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。

ListIterator<E> listIterator()

返回此列表元素的列表迭代器(按适当顺序)。

E remove(int index)

移除列表中指定位置的元素(可选操作)。

E set(int index, E element) 

用指定元素替换列表中指定位置的元素(可选操作)。

List<E> subList(int fromIndex, int toIndex)

返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。

package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class test4 {
	public static void main(String[] args) {
		//1、创建对象
		List<String> list  = new ArrayList();		
		//2、常用方法
		//从Collection接口继承过来的方法  - 略,同Test2_Collection.java。
		list.add("xiongda");
		list.add("xionger");
		list.add("guangtouq");
		list.add("xionger");
		list.add("guangtouq");
		//List接口特点:元素都有序   +  允许存放重复元素   
		System.out.println(list);//[xiongda, xionger, guangtouq]
		System.out.println();
		//3、List接口的特有方法---都是可以按照索引操作的方法
		System.out.println(list);
		list.add(3,"钢铁侠");//在指定下标处添加元素
		System.out.println(list);
		System.out.println(   list.get(2)  );//获取指定下标对应的元素
		System.out.println(   list.indexOf("xionger")  );//获取指定元素  第一次 出现的 下标值
		System.out.println(   list.lastIndexOf("guangtouq")  );//获取指定元素  最后一次 出现的 下标值
		System.out.println(   list.remove(1)  );//删除指定下标的元素,并返回
		System.out.println(   list.set(0,"hanmeimei") );//把指定下标  的元素  替换成指定元素
		System.out.println(list);
		List<String> newList = list.subList(1, 3);//截取子List,含头不含尾[1,3)
		System.out.println(newList);
		List<String> list2  = new ArrayList();
		list2.add("99");
		list2.add("98");
		list2.add("97");
		System.out.println(  list.addAll(2, list2)    );//在指定下标处  添加集合
		System.out.println(list);
		//4、迭代器
		//普通for循环  for( 1; 2; 3){ ?  }
		for(int i = 0 ; i< list.size()   ; i++) {
			System.out.println(  list.get(i) );//根据下标i获取元素
		}
		//foreach
		for( String str : list ) {
			System.out.println(str);
		}
		//继承Collection接口iterator()
		Iterator<String> it = list.iterator() ;
		while(  it.hasNext() ) {//hasNext() 判断有没有下个元素
			String s = it.next();//next()获取元素
			System.out.println(s);
		}
		//Collection接口 iterator()  ---      返回值 Iterator (父接口)
		//List接口           listIterator()  ---返回值  ListIterator(子接口)--继承了父接口的所有功能的同时,又有功能扩展
		ListIterator<String> it2 = list.listIterator();
		while( it2.hasNext() ) {  // 判断后面有没有元素
			String str = it2.next() ;//获取元素
			System.out.println(str);
		}		
	}
}

ArrayList

特点:
底层维护了一个数组,默认初始容量是10。
初始容量不够会自动按照1.5倍的方式扩容
ArrayList底层维护很多操作的方法,本质上就是对数组的操作。
适合用于查询多增删少的场景。

LinkedList

双向链表,两端效率高。底层维护了一个链表结构,适用于增删多而查询少的场景。
常用方法:
1.继承 List 接口的方法
2.特有方法

void addFirst(E e)

将指定元素插入此列表的开头。

void addLast(E e)

将指定元素添加到此列表的结尾。

E getFirst()

返回此列表的第一个元素。

E getLast()

返回此列表的最后一个元素

E removeFirst()

移除并返回此列表的第一个元素

E removeLast()

移除并返回此列表的最后一个元素

boolean offer(E e)

将指定元素添加到此列表的末尾(最后一个元素)

boolean offerFirst(E e) 

在此列表的开头插入指定的元素

boolean offerLast(E e)

在此列表末尾插入指定的元素

E peek()

获取但不移除此列表的头(第一个元素)

E peekFirst()

取但不移除此列表的第一个元素;如果此列表为空,则返回 null

E peekLast()

获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null

E poll()

获取并移除此列表的头(第一个元素)

E pollFirst()

获取并移除此列表的第一个元素;如果此列表为空,则返回 null

E pollLast()

获取并移除此列表的最后一个元素;如果此列表为空,则返回 null

import java.util.LinkedList;
public class test5 {
	public static void main(String[] args) {
		LinkedList<Integer> list = new LinkedList<>();
		//特点:和List一样,元素有序,可以重复
		list.add(100);
		list.add(200);
		list.add(300);
		list.add(null);
		list.add(null);
		list.addFirst(0);//添加首元素
		list.addLast(99);//添加尾元素
		System.out.println(list.getFirst());//获取首元素
		System.out.println(list.getLast());//获取尾元素
		System.out.println(list.removeFirst());//移除首元素
		System.out.println(list.removeLast());//移除尾元素
		System.out.println(list);
	}
}

Set 接口

特点:元素无序,不可重复,没有索引
常用方法: 同Collection接口一样

HashSet 实现类

特点: 此类实现 Set 接口,由哈希表/散列表(实际上是一个 HashMap 实例)支持
它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素
构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75

import java.util.HashSet;
import java.util.Set;
public class test6 {
	public static void main(String[] args) {
		Set<Integer> set = new HashSet<>();
		set.add(10);
		set.add(2);
		set.add(3);
		set.add(4);
		set.add(5);
		set.add(null);
		set.add(4);
		set.add(5);
		System.out.println(set);//[null, 2, 3, 4, 5, 10]
	}
}

发布了15 篇原创文章 · 获赞 9 · 访问量 264

猜你喜欢

转载自blog.csdn.net/qq_34681728/article/details/105646406