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关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
随机推荐
- LeetCode_Mysql_Second Highest Salary
176. Second Highest Salary 1. 问题描写叙述: 写一个sql语句从 Employee 表里获取第二高位的工资. 2. 解决思路: 这道题非常easy,就当热身了.首先用ma ...
- jquery中怎样防止冒泡事件
jquery中怎样防止冒泡事件 1.利用event.stopPropagation() 2.利用return false 3.利用event.preventDefault()
- 【bzoj1303】[CQOI2009]中位数图
一个大于b的数和一个小于b的数可以互相抵消,所以我们用1和-1表示. 从b向两边扩展,left[i]表示b左边抵消后有i个数比b小的可能数,right[i]表示b右边抵消后有i个数比b大的可能数. a ...
- linux内核对块设备的使用
1 partition table 这里的分析以经典的MBR为例. 在MBR里面有partition table,每一项对应一个逻辑的块设备,partion table中的每一项是16个字节. 第一个 ...
- Git经常使用命令总结
Git是一款开源的分布式版本号控制系统,由Linux之父Torvalds用C语言开发. "the stupid content tracker",Git自诩为stupid,却是一个 ...
- spring 的核心接口
spring有两个核心接口,BeanFactory 和ApplicationContext ,其中ApplicationContext 是BeanFactory的子接口.他们代表了Spring容器. ...
- input keyevent发送按键值【转】
本文转载自:http://blog.csdn.net/moyu123456789/article/details/71209893 1.adb shell进入android设备,执行命令input k ...
- 【Codevs 2630】宝库通道
http://codevs.cn/problem/2630/ Solution 预处理f[i][j],代表第j列前i行的代价 枚举上下界,然后做最大子段和,g[i]代表选到第i列的代价, g[k]=( ...
- PDO连接mysql8.0报PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers错误
安装mysql8.0之后,尝试使用php连接mysql,总是报PDO::__construct(): Server sent charset (255) unknown to the client. ...
- 【Beijing WC2012】 冻结
[题目链接] 点击打开链接 [算法] dist[i][j]表示到达i号城市,使用了j次魔法,所用时间的最小值 那么,dist[i][j]可以转移到dist[k][j+1]和dist[k][j],一边s ...