List集合和Set集合

1、List

1.1、ArrayList

  • 底层基于数组的集合

  • 特点:有序可重复(输入和输出顺序一致);增加、删除慢(要扩缩容和复制),查询和修改快;

  • 构造:ArrayList() 构造初始值为10的空列表(经常使用)

  • 集合中的数据全部为引用数组类型

  • 增删改查方法:

    1. 增:add(Object obj); add(int index,Object obj); addAll(可以是所有的集合)

    2. 查:get(int index)

    3. 改:set(int index,Object obj)

    4. 删:remove(int index);boolean remove(Object o)//移除此列表中首次出现的指定元素(如果存在)

      注意:删除元素时,如果元素的值为集合的下标时(比如删除整数元素4,下标也有4时)默认把元素当成下标,所以放值时整数尽量使用字符(“4”),必要时再转回整数

      ArrayList list = new ArrayList();
      		list.add("1");
      //将字符串类型转换为int类型
      		int i = Integer.parseInt(obj.toString());
      		System.out.println(i+1);
      		System.out.println(list);
      
  • 普通方法:

    1. clear();//清除列表
    2. indexOf();//指定元素下标(从前开始)
    3. lastIndexOf();//指定元素最后一个的下标(从后开始)
    4. isEmpty();//没有元素返回为空
    5. Object[] arr=list.toArray();//将集合转换为数组,字符串排序 是根据对应的hashCode值来排序
  • ArrayList的遍历:

    1. 普通for

    2. 增强for–>当前这个类实现了Iterable接口

    3. 迭代器:

      ArrayList arrayList = new ArrayList();
              arrayList.add("熊大");
              arrayList.add("熊二");
              arrayList.add("吉吉");
              arrayList.add("毛毛");
      /**
      		 * 单向迭代器
      		 * 迭代器的使用
      		 * 	1 	调用AbstractList中的iterator()方法
        			2 	返回的是Iterator这个接口对象
        			3 	调用方法来进行元素的迭代
        				1 boolean hasNext() 
                		如果仍有元素可以迭代,则返回 true。 
       				2 E next() 
                		返回迭代的下一个元素。 
      		 */
      		 Iterator it=arrayList.iterator();
              while (it.hasNext()){
                  System.out.println(it.next());
              }
      /**
      		 * 双向迭代器
      		 * 要使用 必须先正向迭代一次 才能反向迭代
      		 * listIterator() 
      		 * 返回的是ListIterator
      		 * 
      		 * 只有List接口下面的实现类才能使用双向迭代器
      		 */
      ListIterator listIterator=arrayList.listIterator();
              while (listIterator.hasNext()){
                  listIterator.next();
              }
              while (listIterator.hasPrevious()){
                  System.out.println(listIterator.previous() );
              }
      

1.2、LinkedList

  • 基于变量(链表)

  • 增删快

  • 因为LinkedList中有多个接口的实现方法,所以,同样一个功能可以有多个方法实现,但是,尽量不要交叉使用(使用同一个接口中的方法),因为交叉使用会导致其不能具有一个接口的完整特性

  • 增删改查方法

    1. 增:add(); push();//先加后出

    2. 查:get(int index)

    3. 改:set(int index,Object obj)

    4. 删:remove(); pop(); poll;

      注意:

      • poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除;
      • pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,当栈中没有元素时,调用该方法会发生异常
      • 两者区别:基本一致,当头结点为空的时候,两个函数的处理方式不同:poll()选择返回null,pop()选择抛出异常。
  • LinkedList遍历

    与ArrayList相似

2、Set

2.1、HashSet

  • 元素不可重复,无序

  • 增:add();

  • 删:remove();

  • 没有提供设置和查询单个方法

  • 自定义类型 只要属性值都是一样的 就应该认为是同一个对象

  • HashSet判断重复通过重写的hashCode和equals方法 来判断

    注意:自定义类需要自己重写hashCode和equals方法 来判断

  • 遍历:for;增强for;迭代器

2.2、TreeSet

  • 不能有重复元素 最大的特点:只能放同一个类型(因为它会将数据按照自然顺序的方式来排列)
  • 判断重复一定是要hashCode和equals同时为true
  • TreeSet 存放自定义的类不行,因为自定义类不具备排序的能力, 需要你当前定义的这个类去实现一个接口(Comparable)强制重写compareTo方法
  • 可以放String 或者 Integer 是因为本身实现了接口(Comparable)
/**
 * 实现Comparable接口 让这个类具备排序的能力
 */
public class User{
	String name;
	int age;
	public User(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
}
/**
 * 自定义的比较器
 */
public class MyComparator implements Comparator {

	/**
	 * 0和1或者-1
	 * 0 表示相等
	 * 1和-1 区别在于排序的方式不一样
	 */
	@Override
	public int compare(Object o1, Object o2) {
		if(o1==null || o2==null){
			return 0;
		}
		User u1 = (User)o1;
		User u2 = (User)o2;
		if(u1.age<u2.age){
			return -1;
		}else if(u1.age>u2.age){
			return 1;
		}else{//如果年龄不大于也不小于说明等于,那么有名字来决定对象是否相同String已经写好排序规则
			return u1.name.compareTo(u2.name);
		}
	}
}
//测试
public class Test {
	public static void main(String[] args) {
		//采用无参构造创建对象 默认采用自然排序
		//TreeSet set = new TreeSet();
		/**
		 * TreeSet(Comparator<? super E> comparator) 
          	构造一个新的空 TreeSet,它根据指定比较器进行排序。
		 */
		TreeSet set = new TreeSet(new MyComparator());
		set.add(new User("毛毛", 30));
		set.add(new User("毛毛", 31));
		System.out.println(set);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值