关于CodeJava的学习笔记——2

一、ArrayList

1、关于ArrayList

        <1>可以同时多线程访问,效率高但是容易出现并发错误(Vector只能单线程,效率低但是不会出现并发

        <2>基于数组实现,遍历的效率高,添加删除元素效率略低(LinkedList基于双向循环列表实现,对于增删改元素的效率较高,但是遍历时需要永远从下表0开始

        <3>有序的添加元素,元素不唯一,比如装入"Jim"的名字,可以有重名的人

2、创建new ArrayList

        jdk5.0之前 ArrayList list = new ArrayList(); 

        jdk5.0开始 ArrayList<泛型> list = new ArrayList<泛型>(); 

        jdk7.0开始 ArrayList<泛型> list = new ArrayList<>();

3、关于ArrayList的方法

一次添加一个元素:                              list.add(元素) 

一次添加多个元素:                              Collections.addAll(集合,元素,元素...); 

往某个下标插入元素:                           list.add(下标,元素);  //原来的元素和后面的一起往后移

得到某个下标对应的元素                       xxx = list.get(下标); 

修改某个下标对应的元素:                    list.set(下标,元素); 

得到某个内容第一次出现的下标            int x = list.indexOf(元素) 

得到某个内容最后一次出现的下标         int y = list.lastIndexOf(元素); 

判断集合里面是否存在某个元素:         boolean x = list.contains(元素) 

将集合里面的数据装进数组里面            String[] data = list.toArray();

清空集合:                                             list.clear(); 

判断集合是否为空                                  boolean x = list.isEmpty();

二、HashSet

1、关于HashSet

        <1>无序、唯一。该集合是基于哈希表实现的,我们在往hashset中添加对象的时候,需要按顺序比较  hashcode->地址->equals。因此我们往往需要覆盖我们所创建对象的hashcode、equals方法此事在笔记1中亦有记载

@Override
public boolean equals(Object obj){ 
    if(this == obj)return true; 
}
 
@Override
public int hashCode(){ 
    return score + name.hashCode(); 
} 
//return Objects.hash(name);

2、创建new HashSet                              

         HashSet<泛型> set = new HashSet<>(); 

3、关于HashSet的方法

        添加元素:                                         set.add(元素); 
                                                                   Collections.addAll(集合,元素,元素....); 
        得到集合大小:                                  set.size() 
        判断集合里面是否存在某个元素         set.contains(元素) 
        删除元素:                                          set.remove(元素) 
        判断集合是否为空:                            set.isEmpty()

4、说明

        (1)set.add(元素);(2)set.remove(元素);(3)set.contains(元素);
        这些方法,在使用时也需要遵循“hashcode->地址->equals”的顺序,所以我们在使用HashSet来存储对象时,必须要覆盖对应的方法

三、TreeSet

1、关于TreeSet

        <1>有序、唯一。在使用TreeSet的时候,我们需要制定比较规则,通过覆盖compareTo方法来实现。

        <2>该集合是基于二叉树实现的。

2、创建new TreeSet

        TreeSet<泛型> set = new TreeSet<>(); 

3、关于TreeSet的方法

        添加一个元素:                                        set.add(元素); 
        添加多个元素:                                        Collections.addAll(集合,元素,元素...); 
        得到集合大小:                                        set.size() 
        判断集合是否为空:                                 set.isEmpty() 
        判断集合里面是否存在某个元素:            set.contains(元素) 
        得到集合里面的第一个元素:                   set.first() 
        得到集合里面的第一个元素并且删除:     set.pollFirst() 
        得到集合里面的最后一个元素:                set.last() 
        得到集合里面的最后一个元素并且删除:  set.pollLast()

4、关于覆盖compareTo来制定比较规则

public int compareTo(参数 x){

        if(this.属性 != x.属性)return... 
        if(!this.属性.equals(x.属性))return ... 
        ... 
        return 1; //代表相同的对象也会被保留,如果相同的对象不需要保留,那么return 0;

}

四、Map【映射】集合

1、关于TreeSet

        <1>有序、唯一。在使用TreeSet的时候,我们需要制定比较规则,通过覆盖compareTo方法来实现。

        <2>该集合是基于二叉树实现的。

2、创建new TreeSet

        TreeSet<泛型> set = new TreeSet<>(); 

3、关于TreeSet的方法

        添加某个键值对                        map.put(Key,值);       
        添加一个新的键值对集合          map1.putAll(map2);      
        获得列表长度                            map.size();
        通过主键获得值对象                 get(key);
        判断是否存在某个主键              contains(key);
        判断是否存在某个值对象          containsValue(值);
        通过主键删除一对信息             remove(key);
        判断集合是否为空                    isEmpty();

4、关于遍历键值对集合

        <1>没有直接的办法遍历键值对集合,因此我们需要根据需求,选择性的遍历主键或者值,将他们的值传递到不同的集合中。

        <2>由于主键具有唯一性,因此我们将主键放入Set集合中
Set<主键> set = map.keySet();
Collection<值> cs = map.values();

        <3>Map.Entry

        Set<Map.Entry<主键,值>> set = map.entrySet();
        通过记录得到主键对象:x.getKey(key)
        通过记录得到值对象:x.getValue(值)
        通过记录修改值对象:x.setValue(值)

五、迭代器Iterator遍历

       1、如果我们使用for循环遍历list.size(),当我们进行删除操作的时候,list的大小是动态的,因此我们会发现少循环几次,那么就需要我们掏出新的遍历模式,来进行删除操作。

for(Iterator<Integer> car = list.iterator(); car.hasNext(); ){

        Integer x = car.next();//取出遍历的元素

        car.remove();

/**
当我们使用迭代器在遍历集合的时候 
不允许对集合的整体进行添加/删除操作,
否则出发CME异常,
因此我们不使用list.remove();
而是car.remove();
*/

  }

六、比较器

        1、任何一个引用数据类型如果想要装进TreeSet集合的话 都需要该类型有比较规则,一般情况我们会直接覆盖一个compareTo方法来制定比较规则,但是如果我们遇到了不能修改该类的情况,但是又想针对这个类的对象制定特定的规则进行排序,那么我们就可以创建一个比较器,让集合根据这个比较器的比较规则进行排序。

class BJQ implements Comparator<Object>{
	@Override
	public int compare(Object x,Object y){
		return y.name.compareTo(x.name);//这里的x.name的情况仅作举例。具体规则根据自己情况制定。
	}
}

        2、我们的比较器一般情况下,只需要生成一次,然后每次需要使用直接调用这个比较器就行,这样可以节省我们的空间,因此我们将单例模式与比较器结合在一起写,就得到了以下代码

class BJQ implements Comparator<Teacher>{//Teacher类只是一个比喻,方便理解

	private BJQ(){}
	private static BJQ bb = new BJQ();
	//让外部可以通过getOnlyBB()方法调用已经创建好的 比较器
    public static BJQ getOnlyBB(){
		return bb;
	}

	@Override//制定的比较规则
	public int compare(Teacher t1,Teacher t2){
		if(t1.getAge() != t2.getAge())return t1.getAge() - t2.getAge();
		return 0;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值