java 基础学习-06 集合的使用 一

1.集合使用  

集合主要是 set和list部分

现在我们来学习迭代器和list的基本使用及 set中的 hashset 的使用

首先来学习 迭代器的使用 接着学习list的使用  注意点和学习点都在 注释 结合代码 来更详细的介绍

public class colitrdemo {
    public static void itmo(){//此函数是演示使用迭代器的使用
        ArrayList<String>array=newArrayList<String>();
        array.add("一号");
        array.add("二号");
        array.add("三号");
        array.add("四号");
        array.add("五号");
        //普通获取所有的元素
        for (int i = 0; i <array.size(); i++) {
            System.out.println(array.get(i));
        }
        //迭代器获取
        Iterator<String>itrtor=array.iterator();
        while (itrtor.hasNext()) {//判断是否有下一个元素
            System.out.println("while++++"+itrtor.next());
        }
        //迭代器获取优化  第二种方法  while 当循环完的时候 迭代器依然存在  而用 下面额for循环时  循环完之后  迭代器 消失  节省了内存 建议使用
        for (Iterator<String>itrto=array.iterator() ;itrto.hasNext();) {
            System.out.println("for++++"+itrto.next());
        }
   
        List<String> sub=array.subList(1, 3);//集合的获取  下标 从1开始 到三结束   包含1不包含三
        System.out.println("sub-----"+sub);
    }
   
 
    public static void main(String[] args) {
       
        linklistdemo();
    }
    //下面的 方法 我们来学习listiterator的使用 及使用过程出现的问题及注意特点 
    public static void  listiterdemo(){
        ArrayList<String> arraylis=new ArrayList<String>();
        arraylis.add("list一号");
        arraylis.add("list二号");
        arraylis.add("list");
        arraylis.add("list四号");
        arraylis.add("list五号");
        <span style="color:#ff0000;">//并发执行错误  并发修改产生错误   抛出并发修改异常
         /*Iterator itrtor=arraylis.iterator();
                while (itrtor.hasNext()){//判断是否有下一个元素
                    Object obj=itrtor.next();
                    if(obj.equals("list一号")){
                        arraylis.add("插入的");}//
                    System.out.println("while++++"+itrtor.next());
                }*/</span>
        //此时我们发现 程序不是正常执行 <span style="color:#663366;">原因是因为 我们将元素弄到了迭代器中两种都可以操作   而 迭代器操作时  集合又在操作  而迭代器时不知道的 所以产生并发作物
        // 在迭代器时  若我们想修改集合   而迭代器的 方法有限 只能判断 取出删除不能添加 修改等操作
        //所以 就需要使用 子接口 listiterator</span>
        ListIteratoritrtor=arraylis.listIterator();
        while (itrtor.hasNext()) {//判断是否有下一个元素
            Object obj=itrtor.next();
            if(obj.equals("list一号")){
                itrtor.add("插入的");}//
            else if(obj.equals("list")){
                itrtor.set("list的修改");}//;
        }  
       <span style="color:#ff0000;"> //此时的指针已经移到了 最后一个元素 所以我们现在来反向遍历</span>
        //itrtor.hasPrevious() 判断是前一个有没有元素   反向遍历
        while (itrtor.hasPrevious()) {//判断是否有下一个元素
            Object obj=itrtor.previous();
            System.out.println(obj);
        }  
    }
  <span style="color:#ff0000;">  /*********
     * 下面我们来介绍一下list的特点
     * arraylist 使用的是数组结构  查询速度快 修改慢  线程不同步  默认长度为10
     * linkedlist的 链表结构 修改快 查找慢
     * vector  底层数组 数据结构 线程同步 被arraylist替代
     */</span>
    //下面我们来学习 vector
    //下面的 方法 我们来学习listiterator的使用
        public static void  vectordemo(){
         Vector vvv=new Vector();
         vvv.add("11");
         vvv.add("22");
         vvv.add("33");
         vvv.add("44");
         Enumeration en=vvv.elements();
        <span style="color:#ff0000;"> //枚举是 vector特有的取出方式</span>
         <span style="color:#ff0000;">//和迭代是一样的   方法名过长  </span>
         //
         while(en.hasMoreElements()) {
            System.out.println(en.nextElement());
           
        }
        }
        //下面方法我们来学习 linkedlist
        public static void  linklistdemo(){
             LinkedList list=new LinkedList();
             list.addFirst("第一次");//头结点插入
             list.addFirst("第二次");
             list.addFirst("第三次");
             list.addFirst("第四次");
             list.addLast("第五次");
             System.out.println(list);
             /****
              * 这里体现链表结构的特点
              */
            }
}


 

2.我们来学习set的使用

public class colitset {
 
    /**
     * 学习set的使用元素无序  存入和取出的顺序不一定一致  set的属性 无序性
     * hashset :底层数据结构是hash表  如何保证元素的唯一性 
     * 答:<span style="color:#ff0000;">通过元素的两个方法   hashcode 和equals来完成 hashcode是根据地址来判断   所以每次new 的结果都是不同的
     *  <span>	</span> 所以用到hash表  我们穾复写方法
     * <span>		</span>如果元素的 hashcode相同 则判断equals是否为true
     * <span>		</span>如果hashcode不同则不再判断 equals 我们在
     *<span>		</span> hashsetdemodd 方法中验证这个问题</span>
     */
   
    public static void hashsetdemof(){
        HashSet hs=new HashSet();
        hs.add("1");
        hs.add("2");
        hs.add("2");
        hs.add("3");
        hs.add("4");
        System.out.println( "存入结果"+hs.add("4"));
        Iterator iterator=hs.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
           
        }
    }
    public static void hashsetdemodd(){<span style="color:#ff0000;">//此函数我们来存入 “人”  假设名字和年龄都一样时则不再存入</span>
        HashSet hs=new HashSet();
        hs.add(new person("a1",111));
        hs.add(new person("b2",22));
        hs.add(new person("b2",22));//<span style="color:#ff0000;">通过打印结果 此时我们发现是能存入的</span>
        hs.add(new person("d4",44));
        System.out.println(hs.add(new person("d4",44)));//存入结果为真  然而 我们不希望存入相同的信息
        /****<span style="color:#ff0000;">
         * 当person类中没有hashCode这个方法  注释掉
         * 因为都是new出来的 所以 含有四个hash值 都不同 都存进去 所以没有执行equals方法</span>
         */
        /***
     <span style="color:#c0c0c0;">    </span><span style="color:#ff0000;">* 我们在person中添加hashCode这个方法
         * 这时 再运行   添加值时 先判断hash值是否相同,  hash值是相同时 在 进行 equals判断 equals 也相同则不添加
         * hash不相同 则直接添加 不再进行判断equals函数  这两个函数都是复写 自动调用的</span>
         */
        Iterator iterator=hs.iterator();
        while (iterator.hasNext()) {
            person p=(person)iterator.next();
            System.out.println("遍历结果"+"编号为  "+p.getId()+"  "+ " 判断   年龄为  - "+ p.getAge());
           
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated methodstub
        hashsetdemodd();
    }
 
}
class person{
    private String id;
    private int age;
    public person(String id,int age){
        this.id=id;
        this.age=age;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    /***<span style="color:#ff0000;">
     * 返回hash 值的方法
     * 这里使每个的hash值都 相同
<span>		</span>* 每次添加时都运行 hashcode方法 生成 hash值</span>
     */
    public int hashCode( ){
        System.out.println("用户  hash 值 "+this.id.hashCode());//打印hash值的加载
        return id.hashCode();//String 数据类型 有hash方法 .hashCode()返回的就是hash值
    }<span style="color:#ff0000;">//此时我们要防备一种情况
<span>	</span>//就是自定义返回hash值相同的情况
<span>	</span>//比如  a1+age = 3065+11;
<span>	</span>//而<span>	</span>a2+age = 3064+12 此时的hash值时相同的  
<span>	</span>//所以我们要通过小方法来避免这些错误 比如在年龄上乘山某一倍数</span>
   
   
    public boolean equals(Object obj){
        if(!(obj instanceof person)){//此时比较hash值不同则直接返回
<span>		</span> System.out.println("hash值不相同   不再进行下面判断");
            return false;
        }
<span>		</span> else{ hash相同则 进行下面的判断
<span>		</span> System.out.println("hash值相同   进行下面判断");
             person p=(person)obj;
<span>		</span>  System.out.println("用户编号+"+this.id+"--对象判断相等--"+p.id );
<span>			</span>return this.id==(p.id)&&this.age==p.age;
        }
      
    }
}
3.下面我们再来一起学习treeset的注意和使用  学习心得都在注释之中可哦

<span style="font-size:14px;">import java.util.*;
/*****
 <span style="color:#ff0000;">Treeset;可以对set集合中的元素进行排序
			排序 主要条件相同 一定判断 次要条件
			底层数据结构是二叉树
			保证元素唯一的依据
			compareTo 方法的return
			排序方式:1.元素自身具有比较性 元素实现compareto方法
			这种方式也成为元素的的自然顺序 或者叫做默认顺序
			2.元素不有比较性 或者具备的比较性也不是所需要的      这时就需要让集合自身具备比较性
			在集合初始化的时候就有了比较方式</span>;
*/
/*
class treesetdemo
{
	public static void main(String [] args)
	{
		TreeSet ts =new  TreeSet();
		ts.add("cbf");
		ts.add("fdas");
		ts.add("fedf");
		ts.add("erac");
		Iterator it =ts.iterator();
		while (it.hasNext())
		{
			System.out.println(it.next());
		}
	}
	输出结果为 //排序方式1 元素自身具有比较性
	cbf
	erac
	fdas
	fedf
	
}*/
class treesetdemo
{
	public static void main(String [] args)
	{
		TreeSet ts =new  TreeSet();
		ts.add(new Student("a001",22));
		ts.add(new Student("b002",33));
		ts.add(new Student("c003",33));
		ts.add(new Student("d003",11));
		Iterator it =ts.iterator();
		while (it.hasNext())
		{
			Student s=(Student)it.next();
			System.out.println(s);
		}
	}

}
class Student  implements Comparable //<span style="color:#ff0000;"> 该接口让 对象有比较性  假如不实现则会产生错误</span>
{	<span>				</span>
	private String name ;
	private int age;
	public Student(String name,int age){
		this.name=name;
		this.age=age;

	}/<span style="color:#ff0000;">/实现比较的函数 </span> 
	public int <span style="color:#ff0000;">compareTo</span>(Object obj){
		if(!(obj instanceof Student)) throw new RuntimeException("不是学生的对象");
		Student s=(Student)obj;
		System.out.println(this.name+"----compareto---"+s.name);
		if(this.age>s.age)//<span style="color:#ff0000;">定义排排序规则 按照年龄的方式排序</span>
			return 1;//当前对象
		if(this.age==s.age)
		{ 
			this.name.compareTo(s.name);
		}
		return -1;
	}
	public String getName(){
		return name;
	}
	public int getAge()
	{
		return age;
	}
	public String toString(){
		return "name --"+getName() +"---age+++"+getAge();
	}
}</span>
4.我们再来学习一下比较器的使用

import java.util.*;
/**
自定义比较器
 两种排序都存在 以比较器为主
 定义类 继承compare
*/
class treesetdemo2
{
	public static void main(String [] args)
	{
		TreeSet ts =new  TreeSet(new mycompare());//先执行比较器的排序 比较器排序要是结果相同再执行 类的compare
		ts.add(new Student("a001",22));
		ts.add(new Student("b002",33));
		ts.add(new Student("c003",33));
		ts.add(new Student("d003",11));
		Iterator it =ts.iterator();
		while (it.hasNext())
		{
			Student s=(Student)it.next();
			System.out.println(s);
		}
	}


}
class Student  implements Comparable // 该接口让 对象有比较性
{	
	private String name ;
	private int age;
	public Student(String name,int age){
		this.name=name;
		this.age=age;


	}
	public int compareTo(Object obj){
		if(!(obj instanceof Student)) throw new RuntimeException("不是学生的对象");
		Student s=(Student)obj;
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{ 
			this.name.compareTo(s.name);
		}
		return -1;
	}
	public String getName(){
		return name;
	}
	public int getAge()
	{
		return age;
	}
	public String toString(){
		return "name --"+getName() +"---age+++"+getAge();
	}
}
class mycompare implements Comparator
{
	public int <span style="color:#ff0000;">compare </span>(Object o1,Object o2){<span style="color:#ff0000;">//实际上也是调用了 compareto方法 来返回值</span>
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		return s1.getName().compareTo(s2.getName());
		}
}

下面再写一个例子 按照字符串的长度进行排序 使用比较器

import java.util.*;

class treesetdemo3
{
	public static void main(String [] args)
	{
		TreeSet ts =new  TreeSet(new stringcompare());
		//TreeSet ts =new  TreeSet(new mystringcompare());
		ts.add("a0fgfhghfghfhh01");
		ts.add("b0hhhh02");
		ts.add("c00hhhhhh3");
		ts.add("d003");
		ts.add("adas");
		Iterator it =ts.iterator();
		while (it.hasNext())
		{
			String s=(String)it.next();
			System.out.println(s);
		}
	}

}
class mystringcompare implements Comparator
{
	public int compare (Object o1,Object o2){
		String s1=(String)o1;
		String s2=(String)o2;
		/*if(s1.length()>s2.length())
			return 1;
		if(s1.length()==s2.length())
			return 0;*/
		
	return -1;
		}
}
class stringcompare implements Comparator
{
	public int compare (Object o1,Object o2){
		String s1=(String)o1;
		String s2=(String)o2;
		
		int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
		//如果单纯这么写的话 只比较了长度 长度相同的就不会再存在
		//所以还需要下面这句
		//另外还需要注意字符串的此函数返回值是正数  但是不是1   所以我们不能判断 num==1
		if(num==0){
		
		return s1.compareTo(s2);
		}
		return num;
		}
}

我们使用到了两个compare  结合上面的例子我们来区分


  1. compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo(T o)方法
  2. compare(Object o1,Object o2)方法是java.util.Comparator<T>接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值