Java集合类的一点粗浅认识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qing_gee/article/details/85751933


/沉默王二

开门见山地说吧,Java提供了一套完整的集合类(也可以叫做容器类)来管理一组长度可变的对象(也就是集合的元素),其中常见的类型包括List、Set、Queue和Map。从我个人的编程经验来看,List的实现类ArrayList和Map的实现类HashMap使用频率最高,其它实现类只能望其项背了。

List、Set和Queue都是Collection的子接口,但各有各的好。List按照插入的顺序保存元素,Set不会有重复的元素,Queue通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。

Map与Collection最大的不同就在于,它是一组“键值对”,可以快速地通过键来查找值;Collection是没有键的,因此需要按照某种规则来查找值(这里说的值就是元素)。

怎么使用集合类呢?示例如下:

public class Wanger {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("李孝利");
		System.out.println(list.get(0));

		Map<String, String> map = new HashMap<String, String>();
		map.put("lixiaoli", "李孝利");
		System.out.println(map.get("lixiaoli"));
	}
}

01、ArrayList和LinkedList

通常情况下,ArrayList是我们在选择List的时候的首选。别问我为什么,就好像你问我为什么1+1 = 2 ?我回答不上来啊。

有人会问,如果我的应用操作偏向于插入和删除,而不是随机访问,我还要选用ArrayList吗?我知道LinkedList在处理插入和删除的时候更高效,而ArrayList更适合随机访问。

那么我的回答是,你已经知道了答案,就做出自己的选择吧。

List的应用经常会涉及到一些经典的排序算法,我们不妨来重温一下冒泡排序,冒泡排序的规则是:假如有N个数,是无序的;从第一个数开始和后面N-1的数比较,发现有比自己小的就交换位置;从第二个数开始和后面N-2的数比较,同样发现有比自己小的就交换位置;直到N-1结束。

来看程序清单1-1:

public class BubbleSort {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		Collections.addAll(list, 2, 1, 5, 4, 9, 8, 6, 7, 10, 3, 3);

		// 从第1个数开始比较,直到N-1
		for (int i = 0; i < list.size(); i++) {
			// 从第i+1开始,和i位置的数进行比较
			for (int j = i + 1; j < list.size(); j++) {
				// 记录原来的数
				int temp = list.get(j);

				// 如果i位置的数大,就和j位置的数进行交换
				if (list.get(i) > temp) {
					list.set(j, list.get(i));
					list.set(i, temp);
				}
			}
		}
		
		System.out.println(list);
	}
}

Collections类是操作Collection的一个工具集,提供了很多可以操作和返回Collection的静态方法,非常好用。Collections.addAll()方法可以将所有指定元素添加到指定 Collection中,可以分别指定要添加的元素,就像Collections.addAll(list, 2, 1, 5);这样;或者将要添加的元素指定为一个数组;此方法的行为与list.addAll(Arrays.asList(elements))的行为是相同的,但在大多数实现下,此方法运行起来可能要快得多。

list.set(int index, E element)用于指定元素替代此列表中指定位置上的元素,非常便捷。

02、HashMap

HashMap是最常见的Map实现,应用非常的广泛;支持null键和null值,是绝大部分利用键值对存取场景的首选;比如,查询数据库的时候经常使用HashMap来进行灵活的(可选择一个表的部分列,而不是所有列)列名和列值的绑定。

HashMap的值中还可以存放新的键值对,就像下面的这张示意图。

在这里插入图片描述

03、PriorityQueue

考虑这样一种场景,王二现在是一个写作大咖了,不再只是一个会写代码的程序员了。有一天,他和几个热情的读者相遇在厕所的门口,为了表示对王二的尊重,读者们觉得礼让王二先去解决问题是必要的。

PriorityQueue是一种优先级队列(Priority即为优先的意思),可以应用于这种场景。代码示例如下:

public class WriterAndReader implements Comparable<WriterAndReader> {
	static PriorityQueue<WriterAndReader> queue = new PriorityQueue<WriterAndReader>();

	private String name;

	public WriterAndReader(String name) {
		this.name = name;
	}

	@Override
	public int compareTo(WriterAndReader o) {
		// o为之前的
		if (this.getName().equals("王二")) {
			return -1;
		}
		return this.getName().compareTo(o.getName());
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return this.getName();
	}

	public static void main(String[] args) {
		
		// 第一次,没有发生比较,因为只有一个
		queue.add(new WriterAndReader("读者2"));
		// 第二次,与第一次放入的比较,发现读者1比读者2小
		queue.add(new WriterAndReader("读者1"));
		// 第三次,与读者1进行比较,发现王二小;
		queue.add(new WriterAndReader("王二"));
		
		while (!queue.isEmpty()) {
			System.out.println(queue.poll());
		}
	}
}

PriorityQueue既然要排出优先级,那么就要有一定的规则,排列的对象就要实现Comparable接口。

建议在学习的时候debug一下,你会发现queue的变化非常的有意思;每次add添加或者poll取出时就会执行对应的compareTo。(非常惭愧,我对内部的排序没有搞太懂,留待后面继续学习)

PriorityQueue常用的功能函数如下:

方法名 功能描述
add(E e) 添加元素
clear() 清空
contains(Object o) 检查是否包含当前参数元素
offer(E e) 添加元素
peek() 读取元素,(不删除)
poll() 取出元素,(删除)
remove(Object o) 删除指定元素
size() 返回长度

推荐阅读:

Java的内部类真的那么难以理解?
Java接口的实例应用:致敬我的偶像——何塞·穆里尼奥

【初学者】:我对.net的一点粗浅认识,请大家批评指正。

05-29

我是刚刚看了一点点.net的书,对.NET的认识非常模糊,这里,我提出一点点我对.net的看法,请大家批评指正,交流一下。rn .NET 的设计目标就是开发语言的平台无关性,通常,我们在一个操作系统平台上编写的软件,移植到另外一个平台下去以后,就不能用了。rn 例如:如果在Windows环境编写一个Win32的窗口程序,移植到RedHat Linux 平台,则程序就不能运行了,为什么会出现这样的情况呢?因为我们编写的Win32窗口程序是运行在Windows平台下的,结合了Windows平台的独特特性,因此,移植到 Linux平台以后,由于操作系统调用的不同,程序就自然不能运行了。rn 所以,微软的.NET试图摆脱这样的一种开发窘境,试图使自己开发的软件能够适应不同的平台环境,而不论操作系统是Windows还是 Linux。从这个意义上说, .NET的设计目标也是为了和风头正劲的 JAVA 抗衡。因为JAVA 以其“一次编译,到处运行”而倍到广大在不同平台下软件开发者的青睐。rn 另外.NET实际上对WIN32 API和很多访问操作系统的特性做了另外一层的包装。当然,底层估计还是调用的原来的WIN32 API, 或者是对原来的 WIN32 API 做了一次的大的重写。rn 在.NET 环境下,软件可以用各种不同的开发语言进行开发,不同语言开发的软件相互之间的数据交换可以以更加方便的方式进行,原来是DLL、COM等,现在则是另外的方式了,什么方式?这个我现在还不清楚,不过无觉得应该有一种方式的。rn 好了,上面就是我的一点点粗浅的认识,或许有很多错误,请大家说说自己的看法吧。

没有更多推荐了,返回首页