java学习_5_23
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的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- 分享篇——我的Java学习路线
虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- Java学习心得之 HttpClient的GET和POST请求
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 HttpClient的GET和POST请求 1. 前言2. GET请求3 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
随机推荐
- 使用fiddler将网站上的css js重定向至本地文件
使用fiddler将网站上的css js重定向至本地文件,进行在线调试 https://github.com/annnhan/ReRes 1条回复 这是一篇写给公司负责切图和调样式的前端的文章.主要适 ...
- 20170623_oracle_优化与体系结构
一般优化技巧 建议不用"*"代替所有列名 删除所有数据用TRUNCATE代替DELETE 用NOT EXISTS 代替NOT IN 用EXISTS代替IN 用EXISTS代替DIS ...
- [疑问] C# 多线程程序,如果在并行程序块中开空间会远远慢于将空间开在并行块之外
// int[,] label = new int[m, n]; Parallel.For(, thread_num, (n) => { ]; i++) { int[] tmp = new in ...
- MySQL 基础 —— 数据类型、各种变量
1. 基本数据类型 char:prod_id char(10),括号内的内容表示字符的长度 decimal:十进制,不带参数为整数(四舍五入) text:文本类型,长度不限 2. 日期和时间处理函数 ...
- POJ2069 最小球覆盖 几何法和退火法
对这种问题不熟悉的读者 可以先去看一看最小圆覆盖的问题 ZOJ1450 现在我们来看最小球覆盖问题POJ2069 题目很裸,给30个点 求能覆盖所有点的最小球的半径. 先给出以下几个事实: 1.对于一 ...
- Could not find modernizr-2.6.2 in any of the sources
- Permutations II 典型去重
https://leetcode.com/problems/permutations-ii/ Given a collection of numbers that might contain dupl ...
- 'latin-1' codec can't encode characters in position解决字符问题
当遇到这样的报错时,原因是: pymysql库在处理mysql语句时,默认的编码方式是'latin-1',这种编码方式能识别的字符是有限的 解决办法:找到\site-packages\pymysql\ ...
- 思维/构造 HDOJ 5353 Average
题目传送门 /* 思维/构造:赛后补的,当时觉得3题可以交差了,没想到这题也是可以做的.一看到这题就想到了UVA_11300(求最小交换数) 这题是简化版,只要判断行不行和行的方案就可以了,做法是枚举 ...
- DP Codeforces Round #FF (Div. 1) A. DZY Loves Sequences
题目传送门 /* DP:先用l,r数组记录前缀后缀上升长度,最大值会在三种情况中产生: 1. a[i-1] + 1 < a[i+1],可以改a[i],那么值为l[i-1] + r[i+1] + ...