Collection接口中定义的方法如下,所有继承自Collection接口的接口(List,Set)的实现类均实现了这些方法。

List容器是有序、可重复的,常用的实现类:ArrayList,LinkedList,Vector(线程安全的)

索引的add,remove操作。


自己实现的MyArrayList:

package test.stringTest;

public class MyArrayList<E> {
private Object[] elementData;
// 元素个数
private int size;
// 数组默认长度
private final static int DEFAULT_CAPACITY = 10; public MyArrayList() {
elementData = new Object[DEFAULT_CAPACITY];
} public MyArrayList(int length) {
if (length <= 0)
throw new RuntimeException("容器容量值需为正整数:" + length);
elementData = new Object[length];
} public void add(E element) {
if (size == elementData.length)
grow();
elementData[size++] = element;
} @SuppressWarnings("unchecked")
public E get(int index) {
if (indexInRange(index))
return (E) elementData[index];
else
throw new RuntimeException("索引越界:" + index);
} public void remove(E element) {
int index = -1;
for (int i = 0; i < size; i++) {
if (element.equals(elementData[i])) {
index = i;
break;
}
}
if (index != -1) {
remove(index);
}
} public void remove(int index) {
if (!indexInRange(index)) {
throw new RuntimeException("索引越界:" + index);
}
int numMoved = elementData.length - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
} else {
elementData[index] = null;
}
size--;
} private boolean indexInRange(int index) {
return index < size && index >= 0 ? true : false;
} public int size() {
return size;
} public boolean isEmpty() {
return size == 0 ? true : false;
} // 数组扩容
private void grow() {
Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
} @Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elementData[i].toString() + ",");
}
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
} public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<>(20);
int i = 0;
while (i <= 50) {
list.add("aaa" + i);
i++;
}
System.out.println(list);
System.out.println(list.get(31));
System.out.println(list.size());
list.remove(21);
list.remove("aaa4");
System.out.println(list);
System.out.println(list.size);
System.out.println(list.isEmpty());
}
}

HashMap底层实现:数组加链表(JDK8以后当元素个数超过8时,会转变为红黑树结构)。首先根据Key计算出hashcode,然后根据hashcode,利用hash算法计算出数组的下标,然后将值放入该下标数组存储的链表中(有重复(equals比较)的key值则覆盖) 两个相同的对象必须具有相同的hashcode。

    /**
* The table, initialized on first use, and resized as
* necessary. When allocated, length is always a power of two.
* (We also tolerate length zero in some operations to allow
* bootstrapping mechanics that are currently not needed.)
*/
transient Node<K,V>[] table;

    /**
* Basic hash bin node, used for most entries. (See below for
* TreeNode subclass, and in LinkedHashMap for its Entry subclass.)
*/
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next; Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
..........

自己实现的HashMap:

 package test.stringTest;

 public class MyHashMap<K,V> {
Node<K,V>[] table; // 位桶数组
int size; public MyHashMap() {
table = new Node[16];
} public void put(K key, V value) {
Node<K,V> node = new Node<>();
node.key = key;
node.value = value;
node.next = null;
node.hash = myHash(key, table.length);
Node<K,V> temp = table[node.hash];
Node<K,V> lastNode = temp;
boolean isOverride = false; // 有没被覆盖
if (temp == null) {
table[node.hash] = node;
size++;
} else {
while (temp != null) {
// key相同 则覆盖
if (temp.key.equals(key)) {
temp.value = value;
isOverride = true;
break;
} else {
// 不同 则继续向下遍历
lastNode = temp;
temp = temp.next;
}
}
// 没有覆盖发生 则将Node添加到后面
if (!isOverride) {
lastNode.next = node;
size++;
}
}
} public Object get(Object key) {
int hash = myHash(key, table.length);
Node<K,V> temp = table[hash];
if (temp != null) {
while (temp != null) {
if (temp.key.equals(key))
return temp.value;
else
temp = temp.next;
}
}
return null;
} @Override
public String toString() {
StringBuilder sb = new StringBuilder("{");
for (int i = 0; i < table.length; i++) {
Node<K,V> temp = table[i];
while (temp != null) {
sb.append(temp.key + ":" + temp.value + ",");
temp = temp.next;
}
}
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
} private int myHash(Object key, int length) {
return key.hashCode() % length;
} public static void main(String[] args) {
MyHashMap<String,Integer> map = new MyHashMap<>();
map.put("aaa", 111);
map.put("bbb", 222);
map.put("ccc", 333);
map.put("ddd", 444);
map.put("aae", 555);
map.put("ccc", 666);
map.put("rre", 777);
map.put("aaa", 321);
System.out.println(map.size);
System.out.println(map.get("ccc"));
} } class Node<K,V> {
int hash;
K key;
V value;
Node<K,V> next;
}

java学习_5_23的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  3. 分享篇——我的Java学习路线

    虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...

  4. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  5. Java学习心得之 HttpClient的GET和POST请求

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 HttpClient的GET和POST请求 1. 前言2. GET请求3 ...

  6. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  7. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  8. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  9. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

随机推荐

  1. poj 3263 Tallest Cow(线段树)

    Language: Default Tallest Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1964   Ac ...

  2. c# Action,Func,Predicate委托

    System命名空间下已经预先定义好了三中泛型委托,Action,Func和Predicate,这样我们在编程的时候,就不必要自己去定义这些委托了 Action是没有返回值的 Func是带返回值的 不 ...

  3. qq xxs

    qq xxs qq xxs 有很多举个简单例子 : QQ空间发段文章 带上 <script> 提交(document.cookie) 到 自己服务端获取 </script> 在 ...

  4. sql 2005 win7 64 数据引擎

    有个箭头,下拉,选择服务器名(就是本机的名称),如果没有就选择浏览更多,看能搜索出不还没的话就手动输入localhost

  5. hdoj--2186--悼念512汶川大地震遇难同胞——一定要记住我爱你(模拟水题)

     悼念512汶川大地震遇难同胞--一定要记住我爱你 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  6. JSP共享范围

    概念:对象的声明周期和可访问性称为作用域(scope). 注:有时候内置对象的作用域一旦设置就不能修改,其他对象(如JavaBean)可以设置他的作用域 作用域类型: Page:页面域(对象只对于它所 ...

  7. hdu1213 并查集不压缩

    题意:题意:一个人请人吃饭,相互认识的朋友在一张桌子,相互认识的朋友的意思是如果A认识B,B认识C,那么A.B.C是朋友,对于每组输入输出桌子的张数. Sample Input 2 5 3 1 2 2 ...

  8. 堆和栈的区别【以java为例潜入分析】

     Java的堆是一个运行时数据区,类的对象从中分配空间,这些对象通过new等指令建立. 堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动 ...

  9. jQuery 表格隔行变色插件

    jQuery提供了用于扩展jQuery功能的方法,即jQuery.fn.extend()方法和jQuery.extend()方法. 基本的JS框架代码如下: ;(function($) { $.fn. ...

  10. 虚拟机安装cenos7后ifcfg看网卡无inet地址掩码等信息

    在虚拟机安装centos7,进入系统使用ifconfig命令时,只有lo网卡( 127.0.0.1的ip地址)和eno16777736网卡,而且此网卡没有inet地址.掩码等信息. 这时候查看/etc ...