List下有:ArrayList、LinkedList、Vector三种,下面描述的是ArrayList、LinkedList和Vector
List的ArrayList的实现:
了解ArrayList的各个方法的使用原理:
package cn.tedu.Arrays;
import java.util.Arrays;
/**
* 练习:
实现ArrayList
MyArray (String)
int size;//表示集合的元素个数
String[] strArray;
* @author cll
*/
class MyArray {
private int size;
private String[] strArray;
// 1.定义无参的构造方法 默认给数组10个
// MyArray()
public MyArray(){
strArray = new String[10];
}
//2.定义一个带参的构造方法
//MyArray(int length);
public MyArray(int length){
strArray=new String[length];
}
/*3.add(String str);
判断元素的个数和数组的长度之间的关系 size>=strArray 扩容
添加元素
size++; */
public void add(String str){
if(size>=strArray.length){
grow();
}
strArray[size]=str;
size++;
}
/*4.定义grow方法
规则:数组长度的一半(如果数组长度为1 ,扩容应该是+1)*/
public void grow(){
if(strArray.length<=1){
strArray = Arrays.copyOf(strArray, strArray.length+1);
}else{
strArray = Arrays.copyOf(strArray, strArray.length+strArray.length/2);
}
}
/* 5.add(int index,String str)
判断元素的个数和数组的长度之间的关系 size>=strArray 扩容
当前的数组元素后移
插入元素
size++;*/
public void add(int index,String str){
if(size>strArray.length){
grow();
}
//第一个参数:原数组
//第二个参数:原数组元素的起始位置
//第三个参数:目标数组
//第四个参数:目标数组元素的起始位置
//第五个参数:长度(拷贝元素的长度)
System.arraycopy(strArray, index, strArray, index+1, size-index);
strArray[index]=str;
size++;
}
public void remove(int index){
//6.remove(int index)
//当前的数组元素前移
//size--;
System.arraycopy(strArray, index+1, strArray, index, size-index);
size--;
}
//7.set(int index,String str):修改
public void set(int index,String str){
strArray[index] =str;
}
//8.get(int index):获取元素
public String get(int index){
return strArray[index];
}
//9.size():返回集合中的元素个数
public int size(){
return size;
}
}
public class Demo{
public static void main(String[] args) {
MyArray arr =new MyArray();
arr.add("hello");
arr.add("abc");
arr.add("admin");
for(int i= 0;i<arr.size();i++){
System.out.println(arr.get(i));
}
}
}
LinkedList的使用增添方法的练习:
package cn.tedu.Test;
import java.util.LinkedList;
public class DemoLinkedList {
private int size = 0; // 节点个数
private Node first; // 第一个节点
private Node last; // 最后一个节点
//无参构造方法
public DemoLinkedList(){
//this();
LinkedList list=new LinkedList();
}
//添加元素
public void add(String str) {
Node node =new Node(null,str,null);
if(size==0){
this.first=node;
this.last=node;
}else{
this.last.next=node;//新插入的node等于当前链表的最后一个的下一个
node.prev=this.last;//新插入的node等于当前列表的最后一个
this.last=node;//当前列表的最后一个变成node
}
size++;
}
//插入
public void add(int index, String str) {
//最后插入的调用add方法
if(index==size){
this.add(str);
return;
}
Node node =new Node(null,str,null);
if(index==0){
//在链表的最前面
node.next=this.first.prev;//node的下一个变成当前列表的第一个的前一个
this.first.prev=node;//当前列表的第一个的前一个变成node
this.first=node;
}else{
Node node1 =this.getNode(index);
node1.prev.next=node;
node.prev=node1.prev;
node1.prev=node;
node.next=node1;
}
}
// 获取指定位置的节点
private Node getNode(int index) {
Node node = this.first;
for(int i=0;i<index;i++){
node=node.next;
}
return node;
}
//删除
public void remove(int index) {
if(index==0){//如果删除的是第一个
this.first.next.prev=null;//把链表的第二个的前一个索引变为空
this.first=this.first.next;//将这条链表的第一个位置上的值变成第二个的值
}else if(index==size-1){//如果删除的是最后一个
this.last.prev.next=null;
this.last=this.last.prev;
}else{
Node node =this.getNode(index);
node.prev.next=node.next;//node[index-1]下一个=node[index+1]
node.next.prev=node.prev;//node[index+1]前一个=node[index-1]
}
}
//返回节点的内容
public String get(int index){
return this.getNode(index).data;
}
// 返回元素个数
public int size(){
return size;
}
//利用节点存储数据
private class Node {
Node prev; // 上一个节点
String data; // 元素
Node next; // 下一个节点
public Node(Node prev, String data, Node next) {
super();
this.prev = prev;
this.data = data;
this.next = next;
}
}
}
Set集合的HashSet和TreeSet
HashSet如下所示:
package cn.tedu.Linkedlist;
import java.io.PrintStream;
import java.util.HashSet;
import java.util.Set;
public class Demo2 {
public static void test(){
Set<String> set =
new HashSet<>();
set.add("张三");
set.add("张三");
set.add("李四");
set.add("王五");
set.remove("王五");
set.forEach(System.out::println);
}
public static void test2(){
Set<Emp> set= new HashSet<>();
set.add(new Emp("张三"));
set.add(new Emp("张三"));
set.add(new Emp("李四"));
set.add(new Emp("王五"));
//在只有name方法之后,重写了hashCode之后才将张三看作是一个对象
set.forEach(System.out::println);
}
public static void main(String[] args) {
test2();
}
}
TreeSet如下所示:
package cn.tedu.Linkedlist;
import java.util.TreeSet;
public class Demo3 {
public static void test(){
TreeSet<String> set =new TreeSet<>();
set.add("abc");
set.add("bde");
set.add("ayui");
set.forEach(System.out::println);
}
public static void test2(){
TreeSet<Emp> set =new TreeSet<>(
(emp1,emp2)->emp1.getName().length()-emp2.getName().length());
set.add(new Emp("admin"));
set.add(new Emp("abn"));
set.add(new Emp("adjllkl"));
set.forEach(System.out::println);
}
public static void main(String[] args) {
test2();
}
}
HashSet是基于HashMap实现,是map中的key
HashSet和HashMap的不同:
HashSet是对象为元素的,是实现的set接口,使用add添加元素的,对象的存储有相同的,需要重写HashCode和equals方法区分相同的元素。
HashMap是以一组对象作为元素的,是实现的Map接口,使用put添加元素。
map:不允许有重复的key
分为:TreeMap和HashMap两种,TreeMap是有排序的,HashMap是不排序的。