学习记录:关于Java集合框架的内容

学习内容:

学习关于Java集合框架的内容(一)


ArrayList
容器的容量"capacity"会随着对象的增加,自动增长
只需要不断往容器里增加英雄即可,不用担心会出现数组的边界问题。

练习

package charactor;

import java.util.ArrayList;

public class TestCollection {
	@SuppressWarnings("rawtypes")
	public static void main(String[ ] args) {
		ArrayList heros = new ArrayList<>();
		heros.add(new Hero("盖伦"));
		System.out.println(heros.size());
		
		heros.add(new Hero("timo"));
		System.out.println(heros.size());
		for (int i = 0; i < 5; i++) {
            heros.add(new Hero("hero " + i));
        }
		
		Hero specialHero = new Hero("special hero");
        heros.add(specialHero);
        System.out.println(heros.contains(new Hero("hero 1")));
        //对于同名的新一对象判定为false
        System.out.println(heros.contains(specialHero));
        //判定是否存在该对像
        
        
        //获取指定位置的对象
        System.out.println(heros.get(5));
        //如果超出了范围,依然会报错
        System.out.println(heros.get(6));
        System.out.println(heros);
        //输出所有ArrayList中的对象
        System.out.println("specialHero所处的位置:"+heros.indexOf(specialHero));
        System.out.println("新的英雄,但是名字是\"hero 1\"所处的位置:"+heros.indexOf(new Hero("hero 1")));
        
        heros.remove(2);
        //删除该下标处的对象
        System.out.println("删除下标是2的对象");
        System.out.println(heros);
        System.out.println("删除special hero");
        heros.remove(specialHero);
        System.out.println(heros);
        
        System.out.println(heros.size());
        //获取ArrayList的大小
        
        Hero hs[] = (Hero[])heros.toArray(new Hero[] {});
        //转化为数组
        System.out.println("数组:" +hs);
        
        heros.clear();
        //清空所有对象
        
        
	}
}

关于List
ArrayList实现了接口List
常见的写法会把引用声明为接口List类型

对于泛型,我认为就是只能存放指定类型的元素以及其子类的容器,类似于只能存放相同类型的数组,但可以存放的类型可以是某一对象及其子类

package charactor;

import java.util.ArrayList;
import java.util.List;

public class Testc1 {
		public static void main(String[] args) {
		List heros = new ArrayList();
		List<fs> genericheros=new ArrayList<>();
		genericheros.add(new Hero("a"));
		genericheros.add(new Item());
       
	}
}
public class Item extends fs{

}
public class Hero extends fs{

}

关于遍历

while和for增强型暂且不说
之前从未接触过迭代器遍历

Iterator<Hero> it =heros.iterator();
        while(it.hasNext()) {//判断是否还存在下一个对象
        	Hero h = it.next();//取出并移动至下一个位置
        	System.out.print(h);
        }
        
        for (Iterator<Hero> iterator = heros.iterator(); iterator.hasNext();) {
            Hero hero = (Hero) iterator.next();
            System.out.println(hero);
        }

练习:



import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Allread {
	public static void main(String[] args) {
        List<Hero> heros = new ArrayList<Hero>();
 
        for (int i = 0; i < 100; i++) {
            heros.add(new Hero("hero name " + i));
        }
        /*Iterator<Hero> it = heros .iterator();
        while(it.hasNext()) {
        	Hero h = it.next();
        
        }*/
        for (int i = 99; i >=0 ; i--) {
            if(i%8==0)
        	heros.remove(i);
        }
        	System.out.print(heros);        
    }
}

	

关于LinkedList

LinkedList也实现了List接口,同时还实现了Queue和Deque

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class S_LinkedList {
	public static void main(String[] args) {
		/*LinkedList<Hero> ll =new LinkedList<Hero>();
		
		ll.addLast(new Hero("hero1"));
		ll.addLast(new Hero("hero2"));
		ll.addLast(new Hero("hero3"));
		System.out.print(ll);
		
		ll.addFirst(new Hero("heroX"));
		//添加到开头
		System.out.print(ll);
		
		System.out.println(ll.getFirst());
		//查看第一个
		System.out.println(ll.getLast());
		//查看最后一个
		System.out.println(ll);
		System.out.println(ll.removeFirst());
		//删除第一个
		System.out.println(ll.removeLast());
		//删除最后一个
		System.out.println(ll);*/
		
		List ll= new LinkedList<Hero>();
		Queue<Hero> q = new LinkedList<Hero>();
		
		System.out.println();
		q.offer(new Hero("Hero1"));
		q.offer(new Hero("Hero2"));
		q.offer(new Hero("Hero3"));
		q.offer(new Hero("Hero4"));
		
		System.out.println(q);
		
		Hero h = q.poll();
		System.out.println(h);
		//取出第一个
		System.out.println();
		System.out.println(q);
		
		h=q.peek();
		//查看第一个
		System.out.println(h);
		System.out.println(q);		
	}
}
package charactor;

import java.util.LinkedList;

public class MyStack implements Stack{
	LinkedList<Hero> ll =new LinkedList<Hero>();
	public void push(Hero h) {
		ll.addLast(h);
	}
	public Hero pull() {
		return ll.removeLast();
	}
	public Hero peek() {
		return ll.getLast();
	}
	public static void main(String args[])
	{
		MyStack heros = new MyStack();
		for(int i = 0; i < 5 ; i++)
		{
			heros.push(new Hero("hero"+i));
		}
		for(int i = 0; i < 5 ; i++)
		{
			System.out.println(heros.pull());
		}
	}
}

关于二叉树

二叉树之前我们在数据结构中进行过学习,因此相对比较熟悉

package charactor;

import java.util.ArrayList;
import java.util.List;

public class Node {
	public Node leftNode;
	public Node rightNode;
	public Object value;
	public void add(Object v) {
		if(value == null)
			value = v;
		else {
			if((Integer)v - ((Integer)value)<=0){
				if(leftNode == null)
					leftNode = new Node();
				
				leftNode.add(v);
			}
			else {
				if(rightNode==null)
					rightNode = new Node();
				rightNode.add(v);
			}
		}
	}
	public List<Object> values() {
        List<Object> values = new ArrayList<>();
  
        // 左节点的遍历结果
        if (null != leftNode)
            values.addAll(leftNode.values());
  
        // 当前节点
        values.add(value);
  
        // 右节点的遍历结果
        if (null != rightNode)
  
            values.addAll(rightNode.values());
  
        return values;
    }
	public static void main(String[] args) {
		int randoms[]=new int [] {67,7,30,73,10,0,78,81,10,74};
		Node roots = new Node();
		for(int number : randoms) {
			roots.add(number);
		}
		System.out.println(roots.values());
	}
}

练习 Hero类的二叉树

package charactor;

import java.util.ArrayList;
import java.util.List;

public class HeroNode {
	public HeroNode leftNode;
	public HeroNode rightNode;
	public Hero hero;
	 public void add(Hero h) {
		 if (null == hero)
	            hero = h;
	        else {
	            if ((Integer) hero.hp - ((Integer) h.hp) <= 0) {
	                if (null == leftNode)
	                    leftNode = new HeroNode();
	                leftNode.add(h);
	            }
	            else {
	                if (null == rightNode)
	                    rightNode = new HeroNode();
	                rightNode.add(h);
	            }
	 
	        }
	 
	    }
	    public List<Hero> values() {
	        List values = new ArrayList<>();
	        if (null != leftNode)
	            values.addAll(leftNode.values());
	        values.add(hero.name+" "+hero.hp);
	        if (null != rightNode)	 
	            values.addAll(rightNode.values());	 
	        return values;
	    }
	public static void main(String[] args) {
		Hero[] heros = new Hero[10];
		for(int i = 0;i<10 ;i++) {
			heros[i] = new Hero("hero "+i);
			heros[i].hp = (int) (Math.random()*100);
			System.out.println(heros[i].name+" "+heros[i].hp );
		}
		HeroNode HeroTree = new HeroNode();
		for(Hero h : heros) {
			HeroTree.add(h);
		}
		System.out.println(HeroTree.values());
	}

}

关于HashMap

在我认知中先当于通过主键查找对于值的储存方式

package charactor;

import java.util.HashMap;

public class Map1 {
	public static void main(String[] args) {
        HashMap<String,String> dictionary = new HashMap<>();
        dictionary.put("adc", "物理英雄");
        dictionary.put("apc", "魔法英雄");
        dictionary.put("t", "坦克");
         
        System.out.println(dictionary.get("t"));
        
        HashMap<String,Hero> heroMap = new HashMap<String,Hero>();
        
        heroMap.put("gareen", new Hero("gareen1"));
        System.out.println(heroMap);
         
        //key为gareen已经有value了,再以gareen作为key放入数据,会导致原英雄,被覆盖
        //不会增加新的元素到Map中
        heroMap.put("gareen", new Hero("gareen2"));
        System.out.println(heroMap);
         
        //清空map
        heroMap.clear();
        Hero gareen = new Hero("gareen");
         
        //同一个对象可以作为值插入到map中,只要对应的key不一样
        heroMap.put("hero1", gareen);
        heroMap.put("hero2", gareen);
         
        System.out.println(heroMap);
    }
}

练习

package charactor;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MapTest {
	 public static void main(String[] args) {
	        List<Hero> hs = new ArrayList<>();
	        System.out.println("初始化开始");
	        for(int i =0;i<3000000;i++)
	        {
	            Hero h = new Hero("hero-"+((int)(Math.random()*9000)+1000));
	            hs.add(h);
	        }
	        HashMap<String,List<Hero>> heroMap = new HashMap<>();
	        for(Hero h : hs)
	        {
	            List<Hero> list = heroMap.get(h.name);
	            if(list==null)
	            {
	                list=new ArrayList<>();
	                heroMap.put(h.name,list);
	            }
	            list.add(h);
	        }
	        System.out.println("初始化结束");
	        System.out.println("开始查找");
	        findByMap(heroMap);
	        findByIteration(hs);
	 
	    }
	 
	    private static List<Hero> findByMap(HashMap<String,List<Hero>> m)
	    {
	        long start =System.currentTimeMillis();
	        List<Hero> result= m.get("hero-6666");
	        long end = System.currentTimeMillis();
	        System.out.printf("通过map查找,一共找到%d个英雄,耗时%d毫秒%n",result.size(),end-start);
	        return result;
	    }
	 

关于HashSet

了解到其自身并没有独立的实现,而是在里面封装了一个Map.
运用方法除了没有顺序之外,于List似乎并无太大区别(暂时如此认知

package charactor;

import java.util.HashSet;
import java.util.Iterator;

public class HashSettest {
	public static void main(String[] args) {

		HashSet<Integer> names = new HashSet<Integer>();
		
		names.add(9);
        names.add(5);
        names.add(1);
		System.out.println(names);
		
		
		for (Iterator iterator = names.iterator(); iterator.hasNext();) {
            Integer i = (Integer) iterator.next();
            System.out.println(i);
        }
         
        //或者采用增强型for循环
        for (Integer i : names) {
            System.out.println(i);
        }
	}
}

练习

package charactor;

import java.util.HashSet;

public class TestSetHash1 {
	public static void main(String[] args){
        String[] str = new String[100];
        for(int i=0;i<100;i++){
            char[] ch = new char[2];
            for(int j=0;j<2;){
                char a = (char)(Math.random()*(122-65)+65);
                if(Character.isLetter(a)){
                    ch[j] = a;
                    j++;
                }
            }
            str[i] = new String(ch);
        }
        System.out.println("str内容为");
        for(String a:str)
            System.out.println(a);
        System.out.println("----------------");
        HashSet<String> content = new HashSet<>();
        HashSet<String> plus = new HashSet<>();
        for(int i=0;i<str.length;i++){
            if(content.contains(str[i])){
                plus.add(str[i]);
            }
            else{
                content.add(str[i]);
            }
        }
        System.out.printf("总共有%d种相同的字符串\n分别为: \n",plus.size());
        for(String b:plus)
            System.out.println(b);
    }
}

关于Collection

了解到Collection是 Set List Queue和 Deque的接口
其余因为教程中未细讲,因此了解得不是很清楚

关于Collections

Collections是一个类,容器的工具类,就如同Arrays是数组的工具类


package charactor;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsTest {
	public static void main(String[] args) {
        //初始化集合numbers
        List<Integer> numbers = new ArrayList<>();
         
        for (int i = 0; i < 10; i++) {
            numbers.add(i);
        }
         
        System.out.println(numbers);         
        Collections.reverse(numbers);
        //反转
        System.out.println(numbers);
        Collections.shuffle(numbers);
        //混淆
        System.out.println(numbers);
        Collections.sort(numbers);
        // 排序 
        System.out.println(numbers);
        Collections.swap(numbers,0,5);
        //交换0和5下标的数据
        System.out.println(numbers);
        Collections.rotate(numbers,2);
        //把集合向右滚动2个单位
        System.out.println(numbers);
        
    }
}

练习

package charactor;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestCollections {
	 public static void main(String[] args) {
	        List<Integer> lt=new ArrayList<>();
	        for(int i=0;i<10;i++)
	            lt.add(i);
	        int n=0;
	        for(int i=0;i<1000000;i++){
	            Collections.shuffle(lt);
	            if(lt.get(0)==3)
	                if(lt.get(1)==1)
	                    if(lt.get(2)==4)
	                        n++;
	        }
	        System.out.printf("%f\n",(float)n/1000000);
	    }
}

关于ArrayList与HashSet

1.是否有顺序 能否重复
ArrayList: 有顺序 可重复
HashSet: 无顺序 不可重复
练习

package charactor;

import java.util.HashSet;

public abstract class TestListwithHashSet {
	public static void main(String[] args){
        HashSet<Integer> h1=new HashSet<Integer>();
        for(int i=0;i<50;i++){
             
            int j=h1.size();
            h1.add((int)(Math.random()*9999));
            while(i==h1.size()){
                 
                h1.add((int)(Math.random()*9999));
                 
            }
             
             
        }
        System.out.print(h1);
    }
}

关于ArrayList和LinkedList的区别

我认知中arrayList 是顺序储存结构,类似于顺序链表,而LinkedList则有着队列和双向链表的结构

HashMap和Hashtable的区别

HashMap可以存放 null
Hashtable不能存放null
而关于线程安全此处尚未学因此我不是很清楚

HashSet LinkedHashSet TreeSet

HashSet: 无序
LinkedHashSet: 按照插入顺序
TreeSet: 从小到大排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值