博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java基础】01 集合
阅读量:5901 次
发布时间:2019-06-19

本文共 3427 字,大约阅读时间需要 11 分钟。

  hot3.png

Java基础 —— 01 集合#

1 集合的类型与各自的特性##

1.1 Collection:单列集合

  • List: 有存储顺序, 可重复

    • ArrayList: 数组实现, 查找快, 增删慢由于是数组实现, 在增和删的时候会牵扯到数组 增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快。
    • LinkedList: 链表实现, 增删快, 查找慢由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效率较高但查询时需要一个一个的遍历, 所以效率较低。
    • Vector: 和ArrayList原理相同, 但线程安全, 效率略低。 和ArrayList实现方式相同, 但考虑了线程安全问题, 所以效率略低。
  • Set: 无存储顺序, 不可重复

    • HashSet: 线程不安全,存取速度快。底层是以哈希表实现的。

      • 往hashSet添加元素的时候,首先会调用元素的hashCode方法得到元素的哈希码值,然后把哈希码值经过运算算出该元素存在哈希表中的位置。
      • 情况1:如果算出的位置目前还没有存在任何的元素,那么该元素可以直接添加到哈希表中。
      • 情况2: 如果算出的位置目前已经存在其他的元素,那么还会调用元素 的equals方法再与这个位置上 的元素比较一次。 如果equals方法返回的是true,那么该元素被视为重复元素,不允许添加。如果equals方法返回 的是false,那么该元素也可以被添加。
    • TreeSet: 红-黑树的数据结构,默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,那么元素重复。

        1. 往TreeSet添加元素 的时候,如果元素具备自然顺序的特点,那么TreeSet会根据元素 的自然顺序特性进行排序 存储。
        1. 往TreeSet添加元素 的时候,如果元素不具备自然顺序的特点,那么元素所属的类就必须要实现Comparable接口,把比较的规则定义在CompareTo方法上。
        1. 往TreeSet添加元素 的时候,如果元素不具备自然顺序的特点,那么元素所属的类就也没有实现Comparable接口,那么在创建TreeSet对象的时候必须要传入比较器对象。
      • 比较器 的定义格式:

        class 类名 implements Comparator{ }

1.2 Map:双列集合

  • HashMap: 线程不安全,存取速度快。底层是以哈希表实现的。
  • TreeMap: 红-黑树的数据结构,默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,那么元素重复。
  • HashTable: 底层也是使用了哈希表维护的,存取的读取快,存储元素是无序的。

1.3 HashSet实例

class Person{		int id;			String name;	public Person(int id, String name) {		super();		this.id = id;		this.name = name;	}			@Override	public int hashCode() {		return this.id;	}		@Override	public boolean equals(Object obj) {		Person p = (Person)obj;		return this.id == p.id;	}		@Override	public String toString() {		return "编号:"+ this.id +" 姓名: "+ this.name;	}}public class Demo1 {		public static void main(String[] args) {		HashSet
set = new HashSet
(); set.add(new Person(110,"狗娃")); set.add(new Person(110,"狗娃")); System.out.println("集合的元素:"+ set); } }

2 遍历集合##

2.1 遍历集合的几种方式

  1. 使用迭代器Iterator的方式。
  2. 使用增强for循环的方式。
  3. 如果有下标,则可以使用下标的方式。

2.2 遍历数组

public static void main(String[] args) {	// 遍历数组:	String[] arr = new String[] { "xx", "yy", "zz" };	// 1,增强的for循环	for (String elt : arr) {		System.out.println(elt);	}	// 2,下标的方式	for (int i = 0; i < arr.length; i++) {		System.out.println(arr[i]);	}}

2.3 遍历List

public static void main(String[] args) {	// 遍历List:	List
list = new ArrayList
(); list.add("aa"); list.add("bb"); list.add("cc"); // 1,增强的for循环 for (String elt : list) { System.out.println(elt); } // 2,下标 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } // 3,迭代器 for (Iterator
iter = list.iterator(); iter.hasNext();) { String elt = iter.next(); System.out.println(elt); }}

2.4 遍历Set

public static void main(String[] args) {	// 遍历Set:	Set
set = new HashSet
(); set.add("dd"); set.add("ee"); set.add("ff"); // 1,增强的for循环 for (String elt : set) { System.out.println(elt); } // 2,迭代器 for(Iterator
iter = set.iterator(); iter.hasNext() ; ){ String elt = iter.next(); System.out.println(elt); }}

2.5 遍历Map

public static void main(String[] args) {	// 遍历Map:	Map
map = new HashMap
(); map.put("aa", "xx"); map.put("bb", "yy"); map.put("cc", "zz"); // 1,增强的for循环(Entry集合) for (Entry
entry : map.entrySet()) { System.out.println(entry); } // 2,增强的for循环(Key集合) for(String key : map.keySet()){ System.out.println(key + " = " + map.get(key)); } // 3,遍历值的集合 for(String value : map.values()){ System.out.println(value); }}

转载于:https://my.oschina.net/sugary/blog/682261

你可能感兴趣的文章
如何找到Apache HTTP服务器默认Test Page位置?
查看>>
用nginx-rrd监控nginx访问数
查看>>
AJAX技术与Struts1框架配合使用入门教程
查看>>
CHECK_HTTP检测站点HTTP/1.1 400 Bad Request
查看>>
LVS基于应用层的健康状态检测
查看>>
重要第一步:手工踩点技术
查看>>
我的友情链接
查看>>
PL/SQL --> 包重载、初始化
查看>>
在HR眼中,一个合格的前端程序员是怎样的?
查看>>
awk的使用案例
查看>>
局域网某交换机内用户自动获取192.168.1.x
查看>>
我的友情链接
查看>>
Android 面试题(有详细答案)
查看>>
mysql系列之7----主从的设置
查看>>
加入域时提示“不能联系域XX.com的域控制器”
查看>>
BGP社团属性---(公认团体)
查看>>
DataPump的使用
查看>>
android之视频播放系统VideoView和自定义VideoView控件的应用
查看>>
processing mousePressed
查看>>
网络配置动态路由
查看>>