Java集合的概念

// java集合,在数组中只能存放相同类型的数据,数组一旦创建,其长度不能被改变,为了使程序能方便的存储和操纵
// 数目不固定的一组数据,jdk类库提供了java集合,集合类位于java.util包中,
// 集合中不能存放基本类型数据,而只能存放对象的引用,
// Set:不按特定方式排序,并且没有重复对象,他的有些实现类能对集合中的对象按特定方式排序
// List:集合中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,List与数组有些类似
// Map:集合中的每一个元素包含一对键对象和值对象,集合中不能有重复的键对象,值对象可以重复,他的有些实现类能对集合中
// 键对象进行排序。
// Collection接口Iterator接口,Set接口和List接口都继承了Collection接口,Collection接口的Iterator()和toArray()方法
// 都用于获得集合中的所有元素,前者返回一个Iterator,后者返回一个包含集合中所有元素的数组。
// Iterator接口隐藏底层集合的数据结构,向客户程序提供了遍历各种类型的集合的统一接口,包括hasNext(),next(),remove()
// Iterator对象运用了快速失败机制(fail-fast),一旦检测到集合被一个线程修改,而此时当前的一个线程也去修改时,就会抛出ConcurrentModificationException运行时异常
// 而不是现实当前线程修改的集合的当前内容,可以避免潜在的由于共享资源竞争而导致的并发问题
// Set集合:两个实现类:HashSet和TreeSet,HashSet类按照哈希算法来存取集合中的对象,存取速度较快,HashSet还有一个子类LinkedHashSet类,不仅实现了哈希算法,而且实现了
// 链表数据结构,链表结构提高插入和删除元素的性能,TreeSet类实现了SortedSet接口。具有排序功能。
// 当使用Set进行add方法插入时,先判断这个对象是否已经存在于集合中?Set采用equales方法比较两个对象是否相等,而不是采用==比较运算符,如果equales相同则只会加入Set集合一次,第一次执行的有效
// HashSet:具有很好的存取与查找的功能,HashSet会调用对象的hashCode()方法来获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。
// equales方法按照内存地址比较对象是否相等,相等的话表示引用同一个对象,那么两者的哈希码也肯定相同,为了保证HashSet能正常工作,要求当两个对象用equals()方法比较的结果为true时,他们的哈希码也相等
// 也就是说,equals为true,那么hashCode也要为true,反之如果equals为true而hashcode不一样,那就会使HashSet无法正常工作
// 当覆盖了object的equals方法,随之也要覆盖Object的hashCode()方法,
// 尽量保证用equals()方法比较不相等的两个对象有不同的哈希码,可以减少哈希冲突
// TreeSet类:TreeSet类实现了SortedSet接口,能够对集合中的对象进行处理,TreeSet支持两种排序方式:自然排序和客户化排序,
// 1.自然排序:TreeSet调用对象的CompareTo()方法比较集合中对象的大小,然后进行升序排列,这种类型称为自然排序,使用自然排序时,只能向TreeSet集合中加入同类型的对象,
// 并且这些对象的类必须实现了Comparable接口,相应的,在Customer类中应该实现compareTo()方法,为了保证TreeSet能正确的排序,要求Customer类的compareTo()方法与equales()方法按相同的规则
// 比较两个Customer对象是否相等,也就是说equales为true,那么compareTo方法也要为0.
// 对于TreeSet中已经存在的Customer对象,如果修改了他们name属性或age属性,则TreeSet不会对集合进行重新排序,所以最适合TreeSet排序的是不可变类,不可变类的主要特征是他的对象的属性不能被修改
// 2.客户化排序:Comparator(Type)接口提供具体的排序方式,<Type>指定被比较的对象的类型,Comparator有个compare(Type x,Type y)方法,用于比较两个对象的大小,当compare(x,y)返回大于0时,表示x大于y
// 小于0表示x小于y,等于0时表示x等于y,如果希望TreeSet按照Customer对象的name属性进行降序排列,可以先创建一个实现Comparator接口的类CustomerComparator
// List:采用线性方式存储,集合中允许存放重复对象,List接口主要的实现类包括:ArrayList,长度可变,允许对元素进行快速的随机访问,插入和删除的速度较慢
// LinkedList采用链表数据结构,对顺序访问进行了优化,向List中插入和删除元素的速度比较快,随机访问速度则相对较慢,随机访问是指检索位于特定位置的元素,LinkedList单独有addFirst,addLast等方法使得LinkedList可以作为堆栈,队列和双向队列来使用
// List的iterator方法和Set的iterator方法一样,也能返回Iterator对象,可以用Iterator来遍历集合中的所有对象。
// 为列表排序,List只能对集合中的对象按索引位置排序,如果需要对List中的对象按其他特定的方式排序,可以借助Comparator接口和Collections类,Collections类是java集合类库中的辅助类,他提供了操纵集合的各个静态方法,其中sort方法用于对List中的对象进行排序
// Sort(List list)对list中的对象进行自然排序,Sort(List list,Comparator comparator)对List中的对象进行客户化排序,comparator参数指定排序方式。
// ListIterator接口,List的listIterator()方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,此外还提供了专门操纵列表的方法
// 例如:add,hasNext,hasPrevious,next,previous等,insert方法向一个排序的List列表中按顺序插入数据
// 获得固定长度的List对象,Arrays类的asList()方法能够把一个java数组包装成一个List对象,这个List对象代表固定长度的数组,所以对List对象的操作都会被作用到底层的java数组,由于数组的长度不能改变,因此不能调用这种List对象的add和remove方法,否则会抛出异常
// 比较java数组和各种List的性能:对java数组进行随机访问和迭代操作具有最快的速度,对LinkedList的插入和删除操作具有最快的速度,对ArrayList进行随机访问也具有较快的速度,Vector没有突出的性能
// Map:每个元素包含键值对,值对象也可以用Map类型,Map键对象不允许重复,重复的话只会保留后面的操作,Map的实现包括HashMap和TreeMap,前者有很好的存取性能,和HashSet一样也要保证equales为true时,则hashCode()方法返回的哈希码也要为true
// Map的entrySet()方法返回一个Set集合,这个集合中存放了Map.Entry类型的元素,每个Map.Entry对象代表Map中的一对键与值
// TreeMap实现了SortedMap接口,能对键对象进行排序,和TreeSet一样,TreeMap也支持自然排序和客户化排序两种,使用客户化排序,可以调用它的另一个构造方法---TreeMap(Comparator comparator),参数comparator指定具体的排序方式。
// <? extends Object>对Set的范型设置了上限,表示接受Object类型及其子类型,<? super String>对Set的范型设置了下线,表示接受String类型及其父类型
// For循环遍历集合:foreach循环很方便,集合实用类Collections,他的一部分方法专门用于操作List类型集合,还有一部分方法可以用于操作所有的Collection类型和Map类型集合
// Collections的以下方法适用于List类型集合,copy将一个List中的元素拷贝到另一个List中,fill向列表填充,sort自然排序,binarySearch(List list,Object key) 二叉查找,binarySearch(List list,Object key,Comparator c)用Comparator类型的参数指定比较规则
// shuffle(List list)对list中的元素进行随机排列,等等。
// hashSet,ArrayList,HashMap都没有采取同步机制,在多线程环境中,可能会有多个线程同时操纵同一个集合,为了避免并发问题,可以采取:
// 1.在程序中对可能导致并发问题的代码进行同步
// 2.利用Collections的synchronizedXXX()方法获得原始集合的同步版本。此时所有线程只对这个采用了同步措施的集合对象操作,
// 3.如果集合中包含单个元素并且不允许被修改,可以使用Collections的singletonXXX()方法来构造这样的集合,这可以避免被线程错误的修改,而且由于不必采用同步措施,可以提供并发性能
// 4.如果集合的元素不允许被修改,可以用collections的unmodifiableXXX()方法来生成原始的集合视图,让线程只访问这个集合视图,这也可以避免集合被线程错误修改,而且不必采取同步措施,可以提高并发性能
// 历史集合类,Vector,Stack,Hashtable,Enumeration在实现中都使用了同步机制,并发性能差,而Properties类是一个特殊的Map类,继承了HashTable<Object,Object>类,Properties类的load()方法可用来从输入流中读写键与值,

// System.getProperties方法返回一个Properties对象,在这个对象中包含了一系列的系统属性。

class CustomerComparator implements Comparator<Customer>{
	@Override
	public int compare(Customer o1, Customer o2) {
		if(o1.getName().compareTo(o2.getName())>0){
			return -1;
		}
		if(o1.getName().compareTo(o2.getName())<0){
			return 1;
		}
		return 0;
	}
	public static void main(String[] args) {
		Set<Customer> set = new TreeSet<Customer>(new CustomerComparator());
		Customer customer1 = new Customer("Tom",15);
		Customer customer2 = new Customer("Jack",16);
		Customer customer3 = new Customer("Mike",26);
		set.add(customer1);set.add(customer2);set.add(customer3);
		Iterator iterator = set.iterator();
		while (iterator.hasNext()) {
			Customer object = (Customer) iterator.next();
			System.out.println(object.getName() + " " + object.getAge());
		}
	}
}

class Customer implements Comparable<Object>{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public Customer(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public int compareTo(Object o) {
		Customer other = (Customer)o;
		if(this.name.compareTo(other.getName())>0) return 1;
		if(this.name.compareTo(other.getName())<0) return -1;
		if(this.age>other.getAge()) return 1;
		if(this.age<other.getAge()) return -1;
		return 0;
	}
}

public class Test10 {

	public static void print(Collection<? extends Object> c){
		Iterator<? extends Object> it = c.iterator();
		while(it.hasNext()){
			Object element= it.next();
			System.out.println(element);
		}
	}
	
	public static void main(String[] args) {
		List<Integer> l = new ArrayList<Integer>();
		l.add(1);
		print(l);
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值