Java学习----Collection总结
Java----Collection总结
集合,存储多个元素的容器----大小不定。
在集合这块主要的内容有:
接口:Collection Iterator List Set Map
类:ArrayList LinkedList stack queue
hashMap hashTable
本篇为Collection的总结,才开始学习Java,在集合这块看资料总是感觉一团乱麻。所以写这个总结,一方面把自己知道的东西梳理一下,另一方面初学水平有限,如果有错误还请各位大神能够指点,还有就是刚开始玩社区,希望能够获取一点积分,嘿嘿。希望有一天,能够学习JAVA,加入Ali。
Collection接口
Collection是集合层次的根接口。由于泛型的限制,集合中只能存储对象。泛型只能表示引用类型。
Collection定义中的主要方法,就是说当要实现一个Collection的时候,要先实现以下方法(不全,可以查看API稳定):
public interface Collection<E> extends Iterable<E>{ int size(); boolean isEmpty(); void clear(); boolean contains(); boolean add(); boolean remove(); Iterator<E> iterator(); }
Collection<String> c = new ArrayList<String>();
List接口
public interface List<E> extends Collection<E> { Anytype get(int idx); Anytype set(int idx, Anytype newVal); void add(int idx, Anytype x); void remove(int idx); Iterator<Integer> listIterator(int pos); }
重要方法:
List<E> list = new ArrayList<>(); E get(int idx) 获取集合中指定下标对应的元素 E set(int idx,E element) 给定下标上的元素,并将原来的元素返回 E add(int idx,E element) 在给定下标出添加元素,原位置及以后的元素都后移 E remove(int idx) 删除给定位置的元素,并将被删除的元素返回 List<E> sublist(int formIdx,int toIdx)获得List中的子序列(前包括,后不包括) Object[] toArray() <T> [] t = toArray(T[] a) String [] strArr = list.toArray(new String []()); 将List转成数组,第二种比较常用 static List<T> list = asList<T[]a> String [] strArr = {"a","b","c"}; List<String> list = Arrays.asList(strArr);将数组转换成list。
Iterator接口
public interface Iterator<E> { boolean hasNext(); Anytype next(); void remove(); }
迭代器用于遍历集合元素。获取迭代器,可以使用Collection中的方法,Iterator iterator()。具体用法如下代码。:
Set<String> set = new HashSet<String>(); set.add("a"); set.add("b"); //建立一个指向set的迭代器 Iterator<String> it = set.iterator(); while(it.hasNext()){ String str = it.next(); System.out.println(str); //删除元素 it.remove(); } System.out.println(set);
Collections 操作集
Collections操作集是为collection及其子接口、类提供操作方法的一个操作集。(几乎用不到)但是有sort()方法比较重要。
void sort(List<T> list);
直接使用该方法是自然排序,也可以使用Comparable 和Comparator。
Collection中的sort()能够排序的主要原因是,传入的集合元素都是Comparable接口的实现类,该接口表示子类是可以比较的,因为实现该接口重写抽象方法 int compareTo(T t);
该方法用于当前对象与给定对象进行比较:
若当前对象大于给定对象,则返回值应为大于0的整数
若当前对象小于给定对象,则返回值应为小于0的整数
若两个对象相等,则返回值等于0
list.sort(new Comparator<String>(){ //比较规则写在这 //如果返回值>0,那么就会将o2排在o1之前 //如果返回值<0,那么就会将o1排在o2之前 public int compare(String o1,String o2){ //return o1.compareTo(o2); return o1.charAt(0) - o2.charAt(0); } });
Set接口--散列集合
Set的具体用法跟list差不多,这里代码不再重复写。
Set<String> set = new HashSet<String>();
HashSet
底层基于hashMap来进行存储,不保证迭代顺序,并且不保证循序不变。
HashMap
是基于数组+链表来进行存储。底层数组初始容量为16.数组中的每一个位置称之为是一个桶-bucket
O1---先计算o1的hash码--哈希码是int类型的整数--针对哈希码进行二次运算,使运算结果落在桶的编号之中。
每一个桶中维系了一个链表。添加新元素时,先比较与桶中的元素是否相等,不相等,加入到链表,有相等就舍弃。放的越晚的元素,比较就越低,增删改效率都会降低。所以想要缩短链的长度,就得增加桶的个数。扩容,每次都是一倍。
如果已经使用的桶的数量/桶的总数量>加载因子,那么就认为需要扩容。默认加载因子是0.75。扩容之后,会对桶中的元素进行重新的计算和分布,是元素散列在新找的桶中--rehash。
Rehash---元素越多,效率越低。当你进行rehash的时候,是不能往里面放元素的。
加载因子:影响扩容,越小会扩容越频繁。同时会导致内存的浪费。效率变低。加载因子越大,会导致每一个桶汇中的链表会变长而导致查找变慢。
public HashSet(int initialCapacity),允许指定初始容量和加载因子。
总的效率,一开始是高的,然后慢慢变慢。在JDK1.8中,如果链的长度>8,那么会将这个链扭转成红黑树,自平衡二叉树。红黑树,比节点小,往左放,比节点大,往右放,类似二分查找。如果红黑红树的节点个数<=6,会扭回链表。
Map接口
K -key-键,V-value-值。一个键对应一个值 - 键值对。也就意味着,一个映射实际上是由多个键值对组成。在映射中,键是唯一的。一个键最多只能对应一个值。
实现类HashMap与HashTab
HashMap<K,V>
hashMap允许指定初始容量。指定的初始容量在[2^x , 2^x+1]之间,那么容量算出来的一定是为2^x+1。指定这么大是为了扩容的时候,直接左移一位。本身是一个异步式线程不安全的映射。
异步式:如果一个对象在同一个时刻内允许多人操作
同步式:如果一个对象在一个时刻内允许一个人操作
Map<String, Integer> map = new HashMap<>(); map.put("d",6); map.put("e",4); map.put("s",3); map.put("f",9); map.put("i",4); //如果键值相同,对应的值覆盖 map.put("i", 3); //判断是否包含这个键 System.out.println(map.containsKey("a")); System.out.println(map.containsValue(7)); //移除键值对 map.remove("i"); //如果键相同,那么对应的值覆盖 //清空映射 map.clear(); //获取指定的键所对应的值 System.out.println(map.get("r")); //将映射中所有的值放入一个集合返回 Collection<Integer> c = map.values(); System.out.println(c);
HashTbale
这个映射本身是一个同步式线程安全的映射。
指定初始容量,指定多少,就是多少。
基本上没有用,效率比较低,只会出现在面试的时候。
List接口 自己写的LinkedList的实现
package ADT; import java.security.NoSuchAlgorithmException; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.NoSuchElementException; import java.lang.String; public class myLinkedList<String> implements Iterable<String> { private static class Node<String> { public Node(String d, Node<String> p, Node<String> n) { data = d; prev = p; next = n; } public String data; public Node<String> prev; public Node<String> next; } public myLinkedList() { doclear(); } public void clear() { doclear(); } public void doclear() { beginMarker = new Node<String>(null, null, null); endMarker = new Node<String>(null, beginMarker, null); beginMarker.next = endMarker; theSize = 0; modCount++; } public int size() { return theSize; } public boolean isEmpty() { return size() == 0; } public boolean add(String x) { add(size(), x); return true; } public void add(int idx, String x) { addBefore(getNode(idx, 0, size()), x); } public String get(int idx) { return getNode(idx).data; } public String set(int idx, String val) { Node<String> p = getNode(idx); String oldval = p.data; p.data = val; return oldval; } public String remove(int idx) { return remove(getNode(idx)); } private void addBefore(Node<String> p, String x) { Node<String> newnode = new Node<>(x, p.prev, p); newnode.prev.next = newnode; p.prev = newnode; theSize++; modCount++; } private String remove(Node<String> p) { p.prev.next = p.next; p.next.prev = p.prev; theSize--; modCount++; return p.data; } private Node<String> getNode(int idx) { return getNode(idx, 0, size() - 1); } private Node<String> getNode(int idx, int low, int up) { Node<String> p; if (idx < low || idx > up) { throw new IndexOutOfBoundsException(); } if (idx < size() / 2) { p = beginMarker; for (int i = 0; i < idx; i++) p = p.next; } else { p = endMarker; for (int i = size(); i > idx; i--) p = p.prev; } return p; } @Override public Iterator<String> iterator() { // TODO Auto-generated method stub return new LinkedIterator(); } private class LinkedIterator implements Iterator<String> { private Node<String> current = beginMarker.next; private int exceptedModecount = modCount; private boolean okToRemove = false; @Override public boolean hasNext() { // TODO Auto-generated method stub return current != endMarker; } @Override public String next() { // TODO Auto-generated method stub if (modCount != exceptedModecount) throw new ConcurrentModificationException(); if (!hasNext()) throw new NoSuchElementException(); String nextItem = current.data; current = current.next; okToRemove = true; return nextItem; } public void remove() { if (modCount != exceptedModecount) throw new ConcurrentModificationException(); if (!okToRemove) throw new IllegalStateException(); myLinkedList.this.remove(current.prev); exceptedModecount++; okToRemove = false; } } @Override public java.lang.String toString() { StringBuilder sb = new StringBuilder("["); Node node = this.beginMarker; while (node != null) { sb.append(node.data).append(", "); node = node.next; } java.lang.String str = sb.toString(); if (size() != 0) str = str.substring(0, str.length() - 2); return str += "]"; } private Node<String> beginMarker; private Node<String> endMarker; private int theSize; private int modCount = 0; }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
区块链教程Fabric1.0源代码分析ledgerID数据库-兄弟连区块链教程
1、idStore概述 Fabric支持创建多个Ledger,不同Ledger以ledgerID区分。 多个ledgerID及其创世区块存储在idStore数据库中,idStore数据库基于leveldb实现。 idStore默认使用路径:/var/hyperledger/production/ledgersData/ledgerProvider/。 idStore库中特殊key "underConstructionLedgerKey",用于标志最新在建的ledgerID,ledgerID创建成功后或失败时该标志将清除,另外此标志也用于异常时按ledgerID恢复数据。 idStore相关代码集中在core/ledger/kvledger/kv_ledger_provider.go。 2、idStore结构体定义 leveldbhelper更详细内容,参考:Fabric 1.0源代码笔记 之 LevelDB(KV数据库) type idStore struct { db *leveldbhelper.DB } //代码在core/ledger/kvledger/kv_ledger_pr...
- 下一篇
Java使用位域进行多标记(状态)管理
Android中位域的应用 在Android中,我们会经常用到或者看到以下这样的代码 : public class ExampleUnitTest { @Test public void gravityTest(LayoutParams params) { // 视图在layout中右下角显示 params.gravity = Gravity.RIGHT | Gravity.BOTTOM; } @Test public void intentFlagTest(Intent intent) { // 清空任务栈中所有旧的activity intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // 如果activity已存在于栈中,清空该activity之上的所有任务 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); } @Test public void windo...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启