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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS关闭SELinux安全模块
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL数据库在高并发下的优化方案
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能