Collection集合

集合和数组的主要区别在于,集合的大小不受限制,而数组的大小是限制的,这就是数组的致命缺陷,一旦数组的大小确定,则其大小不能改变。集合可以认为是一种可变的数组,大小可以随着元素的增加而增加。在使用集合增加数据是又常和泛型联系在一起。

1.集合与数组的区别

-数组是一个线性的序列,所以可以快速访问其他元素,当用户创建了一个数组时,其容量是不变的,而且生命周期也是不能改变的,而且Java数组会做边界检查,如果发现有 越界现象,会报RuntingException异常作物,所有不用担心和C、C++一样不做边界检查会出问题,当然检查边界会以降低效率为代价。
-集合的容量是可变的,扩展性比较好。
-集合的内部实现就是基于数组的,所有,数组的效率要高于集合。
小面是集合位于java.util包下面的结构图:

2. collection集合

Collection是最基本的集合接口,有两个子接口List和Set,这些接口主要用于操作结合,如结合增删查改等。List和Set下面有几个比较重要的实现类,分别是:ArrayList、LinkedList、HashSet、SortedSet。

2.1.ArrayList数组列表

ArrayList是List接口的子接口,它允许集合存储的元素可以重复,并且可以将null存储到集合中。ArrayList是线程不安全的,如果多个线程同时访问一个ArrayList实例,可能会访问数据出现不一致的情况。
//初始化list集合
		List<String> list = new ArrayList<String>();
		//添加数据
		list.add("王小二");
		list.add("王小二");
		list.add("张三");
		System.out.println(list);
//		结果:[王小二, 王小二, 张三]
//	    由结果可以看出List集合是可以重复的,而且是按照顺序执行的

        

2.2.LinkedList链表

ArrayList只能在尾部增加,并不能向前增加,但是LinkedList类可以在集合的前面后面增加元素,灵活性比较强。LinkedList类的iterator和listIterator方法可以很方便的遍历集合元素。
		LinkedList<String> list = new LinkedList<String>();
		list.add("王小二");
		list.add("王小二");
		list.add("张三丰");
		//增加到第一个
		list.addFirst("刘德华");
		//增加到最后一个
		list.addLast("黄XX");
		System.out.println(list);
		//结果:[刘德华, 王小二, 王小二, 张三丰, 黄XX]


2.3HashSet

此类实现Set接口,并且HashSet的顺序是不确定的,此类运行使用null元素。HashSet接口不允许集合添加重复元素,如果添加重复元素将会覆盖之前的元素。HashSet的线程是不同步的。
		Set<String> set = new HashSet<String>();
		set.add("王小二");
		set.add("王小二");
		set.add("刘德华");
		set.add("张学友");
		System.out.println(set);
		//结果:[王小二, 张学友, 刘德华]
		//由结果可以看出Set集合是可以重复,并且无序的。

2.4.TreeSet

TreeSet集合是用来集合元素内部进行排序使用的,TreeSet集合是线程不同步的。
Set<String> set2 = new TreeSet<String>(new Comparator<String>() {
			int i =1;
			@Override
			public int compare(String o1, String o2) {
				// TODO 自动生成的方法存根
				return o1.compareTo(o2);
			}
		});
		set2.add("9999");
		set2.add("8888");
		set2.add("2222");
		set2.add("1111");
		set2.add("我们");
		set2.add("5555");
		System.out.println(set2);
		//由结果可以看出是进行过排序的




3.Comparable/comparable接口

Comparable接口主要用来对对象排序使用,这种排序被称为类的自然排序,类的compareTo方法可以由用户自己定义排序规则。

实现此接口的对象列表可以通过Collection.sort(或Arrays.sort)进行自动排序。为了更好的实现此功能,建议比较排序的类实现方法hashCode和equals方法。
Comparable接口只有一个方法compareTo,该方法定义如下:
int  compareTo(to):比较次对象与制定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
package com.song.collection;

public class Person implements Comparable
    
    
     
      {
	private String name;
	private int age;

	public Person(String _name, int _age) {
		this.name = _name;
		this.age = _age;
	}
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return name+","+age;
	}
	@Override
	public int compareTo(Person o) {
		int c = age-o.getAge();
//		System.out.println("age:"+age+"--o.getAge:"+o.getAge());
		if(age!=0){
			return c;
		}
		return name.compareTo(o.getName());
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

package com.song.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CompareDome {
	public static void main(String[] args) {
		List
     
     
      
       list = new ArrayList
      
      
       
       ();
		list.add(new Person("王小二", 20));
		list.add(new Person("刘德华", 30));
		list.add(new Person("张学友", 21));
		list.add(new Person("刘德华", 20));
		list.add(new Person("张学友", 25));
		list.add(new Person("张xx", 15));
		list.add(new Person("王xx", 18));
		System.out.println(list);
		Collections.sort(list);
		System.out.println(list);
		
	}
	//[王小二,20, 刘德华,30, 张学友,21, 刘德华,20, 张学友,25, 张xx,15, 王xx,18]
    //[张xx,15, 王xx,18, 王小二,20, 刘德华,20, 张学友,21, 张学友,25, 刘德华,30]
}

      
      
     
     
    
    

4.增强for循环

增强for循环主要是用来打印集合的,并且增强for循环只能打印数组和带泛型的集合。增强for循环的局限性就在于它只能打印集合中的内容,不能对集合本身进行修改,因为修改后会出现意想不到ed情况。
增强for循环的语法如下:
	for(集合中泛型的数据类型  对象名:集合变量名){
	}

5.Iterator接口

Iterator接口就是用来遍历结合。
package com.song.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Interator1 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("王小二");
		list.add("王小二");
		list.add("张学友");
		list.add("张学友");
		list.add("刘德华");
		list.add("张学友");
		Iterator<String> ite = list.iterator();
		while (ite.hasNext()) {// 如果还有下一个
			String s = ite.next();// 把下一个取出来
			if (s.equals("张学友")) {
				ite.remove();// 移除
			}
		}
		System.out.println(list);
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).equals("王小二")) {
				list.remove(i);
				i--;// 因为集合元素进行删除时,内部指针的位置会发生相应变化,所以进行for循环删除,
				//要将指针进行相应变化才能删除干净
			}
		}
		System.out.println(list);
	}
}







































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值