黑马程序员----十六-集合框架

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

==========================================
16-01-01
==========================================

1.基本数据类型对象包装类
  基本数据类型:8种  1.byte 2.int 3.short 4.long 5.double 6.float 7.char 8.boolean
  为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作.
  用于描述该对象的类就称为基本数据类型对象包装类.
  1.byte Byte
  2.int  Integer 
  3.short Short
  4.long Long
  5.float Float
  6.double Double
  7.char Character
  8.boolean Boolean

2.byte取值范围 -128,127   2的7次
  int 取值范围 Integer.MAX_VALUE 2的32次
 
3.进制转换
  Integer.toBinaryString(6)
  把6转换成二进制,就为110.

4.parseInt(String)
  将字符串参数作为有符号的十进制整数进行解析.
  每个类型都有各自的parse,
  Xxx.parseXxx("......").
  只有character没有par方法,因为字符串就是由字符组成的.

==========================================
16-01-03
==========================================

1.如果字符串被Integer进行了对象的封装.
  可以使用另一个非静态的方法,intValue();
  可以将一个Integer对象转成基本数据类型.
  i.intValue()直接把字符串转成整数.

2.整数具备不同的进制体现
  Integer.toBinaryString()二进制
  Integer.toOctalString()八进制
  Integer.toHexString()十六进制
  Integer.parseInt("..",xx),xx进制转成十进制
  Integer.toString(yy,xx),可以转成想要的进制
 
==========================================
16-01-04
==========================================

1.new Integer("123"),会把字符串转成int再进行封装.

2.int num=4;
其实就是Integer num=new Integer(4);

3.Integer x=127 和y是一样的
  但是128时就是false.
  因为JDK1.5以后,自动装箱,如果装箱的是一个字节,那么该数据会被共享不会重新开辟空间.

4.练习
  对字符串中的数值进行排序
  String变int用Integer.parseInt("..").

==========================================
16-02-01
==========================================

1.集合
  容器:数组,StringBuffer,对象
  容器特点:

2.集合的由来:
 对象用于封装特有数据,对象多了就需要存储,如果对象的个数不确定,就使用集合容器进行存储.

3.集合的特点:
 1.用于存储对象的容器.
 2.集合长度是可变的.
 3.集合中不可以存储基本数据类型值.

==========================================
16-02-02
==========================================

1.Collection的常见方法:
  1添加
 add(Object o)
 addAll(Collection c)
  2删除
 remove(Object o)
 removeAll(Collection c)
 clear() 全删掉,但集合还在.
  3判断
 contains(Object o)
 containsAll(Collection c)
  isEmpty()是否为空
  4获取
 size(),获取个数
 iterator()迭代器:取出元素
  5其他
 retainAll(Collection c):取交集
 toArray():将集合转成数组.

1.Collection是接口,所以就用ArrayList.

2.addAll重复的也是重复添加.
  c1.removeAll(c2),c1就删除了与c2中重复的元素.
  retainAll,只剩下两集合重复的元素

==========================================
16-02-05
==========================================

1.迭代器
  Collection coll=new ArrayList();
  coll.add();
  ..
  coll.iterator();
  调用集合中的迭代器方法是为了获取集合中的迭代器对象.iterator是接口
  Iterotor it=coll.iterator();
  it.next()就可以取出,再次调用就取出下一个.
  如果取完了再次调用it.next(),就报错.

2.while(it.hasNext()){
 it.next();
}
  这样就取出了每一个元素.

3.虽然都取完了,但是it还在内存中,所以可以用for循环.
  for(Iterator it=c.iterator();it.hasNext();)
  it.next();
  可以这样直接使用,for循环结束后,it也就结束了.

==========================================
16-02-06
==========================================

1.Iterator对象必须依赖于具体容器,因为每一个容器的数据结构都不同.所以该迭代器对象是在容器中进行内部实现的.
  对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可.
  也就是iterator方法.
  Iterator接口就是对所有的Collection容器进行元素取出的公共接口.

==========================================
16-02-07
==========================================

1.集合框架的构成和分类.
  两个子接口体系:1.List   2.Set

2.List:有序的Collection(序列),其顺序就是按存入的顺序.存入和取出的顺序一致.元素都有索引(角标).
  List允许重复的元素

3.Set:不包含重复元素.无序.有自己的排序方式.这里说的有序无序是指存入取出是不是按顺序.

==========================================
16-02-08
==========================================

1.List特有的常见方法:有一个共性特点就是都可以操作角标.
  1.添加
 add(index,element)
 addAll(index,collection)
 
  2.删除
 remove(index)

  3.修改
 set(index,element)
 
  4.获取
 get(index)
 indexOf(Object)
 lastIndexOf(Object)
 subList(from,to)包头不包尾

2.List在awt包和util包里都有,用util包
  list.remove()会返回被删除的元素
  list.set()会返回被修改的元素
  list.get()获取角标位置的元素
 
==========================================
16-02-09
==========================================

1.List特有取出元素的方式:用get()
  for(int x=0;x<list.size();x++)用for循环

2.ConcurrentModificationException
  去util包里的异常有这个异常
  当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.
  当添加完3个元素,调用了iterator(),那么iterator就按照3个元素的方式遍历数组,这时候添加元素,迭代器iterator不知道,现在是迭代器在操作这些元素,而在迭代器操作的过程中又用集合添加元素,这样就有异常.
  如何解决?
  迭代器没有添加的方法,Iterator有一个子接口ListIterator,有很多方法,可以完成在迭代中对元素进行操作.
  ListIterator it=list.listIterator();
  it.add(...)或者it.set(...)可以完成.

3.ListIterator可以
  hasNext()正向遍历,还可以
  hasPrevious  逆向遍历
  在第一个位置没有Previous,但是在之后的位置都有Previous.it.previous.

4.还可以listIterator(index)从指定位置开始迭代.

==========================================
16-02-10
==========================================

1.java集合类的关系图
  1.虚线的都是接口,真正使用的时候都是用的接口的子类
  2.List最常用三个子类 ArrayList,LinkedLIst,Vector
  3.只要不是Vector,就是不同步的,因为效率高.

2.List
  1--Vector:内部是数组数据结构,是同步的.增删查询都很慢.
  2--ArrayList:内部是数组数据结构,是不同步的,替代了Vector.查询的速度快.
  3--LinkedLIst:内部是链表数据结构,是不同步的.增删元素的速度很快.

==========================================
16-02-11
==========================================

1.ArrayList为什么查询快
  因为空间是连续的.

2.LinkedList为什么增删快
  地址,LinkedList也有角标,因为是List的子类.链表结构.

3.Vector
  Vector v=new Vector();
  v.addElement("a1");
  v.addElement("a2");
  Enumeration e=v.elements;
  while(e.hasMoreElemtents())
 sysout(e.nextElement());

  Iterator i=v.iterator();
  while(i.hasNext())
 sysout(i.next());
  Enumeration和Iterator的功能是重复的.优先使用Iterator.

==========================================
16-02-13
==========================================

1.LinkedList
  addFirst(E e)插到开头
  addLast(E e)插到结尾
  getFirst()
  getLast()
  removeFirst()
  removeLast()

2.LinkedList l=new LinkedList();
  link.addFirst123, 取出321,因为是加到开头
  l.getFirst()就可以取出第一个
  l.removeFirst()就删除第一个
  两个打印结果是一样的,但是效果不一样

3.while(!link.isEmpty())
  sysout(link.removeFirst());
  全部取出来最后还会返回一个空集合[].

==========================================
16-02-14
==========================================

1.使用LinkedList模拟一个堆栈或者队列数据结构.
  堆栈:先进后出(First In Last Out)FILO

  队列:先进先出(First In First Out)FIFO

2.描述队列
class DuiLie{
 private LinkedList link;
 DuiLie(){
 link=new LinkedList();
 }
 public void myAdd(Object obj){
 link.addLast(obj);
 }
 public Object myGet(){
 return link.removeFirst();
 }
}

3.getFirst()和peekFirst(),get如果没有,就会报错,但是peek没有,会返回null.

==========================================
16-02-15
==========================================

1.ArrayList
  add参数类型是Object,所以什么类型的对象都能接收,所以用迭代器取出的时候,类型也是Object,所以要进行强转,但是"."的优先级是很高的,所以要把(Person)和it.next()放在一起,所以((Person)it.next).getName();.
 
2.如果要取出Name,Age,next不好控制,会自动往下走,所以不要写两个next().
  所以Person p=(Person)it.next();

3.堆内存图解
  1.new了一个ArrayList();
  2.有10个格子,因为ArrayList初始容量为10
  3.格子有角标
  4.在格子外面有4个Person对象
  5.每个对象的地址赋值给各个格子
 
4.什么时候装箱,基本数据类型赋值给了引用数据类型的时候才装箱.
  l.add(5);装箱了,因为是
  l.add(new Integer(5));

  int num=5;没装箱
  Object num=new Integer(5);装箱了

5.什么时候拆箱,当引用数据类型和基本数据类型做运算的时候.
  
==========================================
16-02-16
==========================================

1.Set:元素不可重复,是无序的.方法和Collection一致.

2.二个常用子类:
  --HashSet:内部数据结构是哈希表,不同步
  --TreeSet:

3.哈希表确定元素是否相同
  1.判断两个元素的哈希值是否相同,如果相同,再判断两个对象的内容是否相同.
  2.判断哈希值相同,其实判断的是对象的hashCode的方法,判断内容相同,用的是equals方法.
  3.如果哈希值不同,不需要判断equals.

==========================================
16-02-19
==========================================

1.HashSet存储自定义对象
  两个对象的属性一样,但是两个对象的哈希值不同,equals也不成立,所以是两个元素.
  HashSet集合数据结构是哈希表,所以存储元素的时候,使用的是元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来确定是否相同.

2.要覆盖Object的hashCode和equals方法.
public int hashCode(){
 return name.hashCode()+age;
}
用名字的哈希值加上年龄增加了唯一性.

public boolean equals(Object obj){
 Person p=(Person)obj;
 return this.name.equals(p.name)
 &&this.age==p.age;
}

==========================================
16-02-20
==========================================

1.contains里面就包含了equals方法,所以用contains方法也达到了排除的效果.
  remove也包含equals方法.

2.LinkedHashSet
  具有可预知迭代顺序的Set接口的哈希表和链接列表实现.
  存入取出是有序的,而且是不重复的.

==========================================
16-02-22
==========================================

1.TreeSet
  是无序的,但是有指定的自己的顺序.使用元素的自然顺序对元素进行排序.

2.ClassCastException
  因为要比较,所以存两个对象就出现异常.怎么解决?

3.compareTo对每个类的对象进行整体排序,称为自然排序,类的compareTo方法被称为它的自然比较方法.
  所以要实现Comparable接口.并且覆盖compareTo方法.

4.如果按年龄排.
  Person p=(Person)o;
  if(this.age>p.age)
 return 1;
  if(this.age<p.age)
 return -1;
  if(this.age==p.age){
 this.name.compareTo(p.name);
}
  return 0;

代码可以直接改成
  return this.age-p.age;
或者
  int temp=this.age-p.age;
  return temp==0?this.name.compareTo(p.name):temp;
  意思是temp==0吗,等的话就是返回...,不等的话就返回temp.

5.TreeSet对元素进行排序的方式一:让元素自身具备比较功能,元素需要实现Comparable接口,覆盖compareTo方法.

==========================================
16-02-23
==========================================

1.用名字排序
  int temp=this.name.compareTo(p.name);
  return temp==0?this.age-p.age:temp;
也就是temp==0的时候才会比较this.age-p.age,否则都是直接输出temp,也就是比较this.name和p.name.

2.如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序.怎么办?
  用TreeSet集合的第二种排序方式:
  让集合自身具备比较功能.

3.比较器Comparator(接口)
  两个方法:compare,equals.

4.根据名字比,添加类class,ComparatorByName,点击add添加Comparator
public int compare(Object o1,Object o2){
 Person p1=(Person)o1;
 Person p2=(Person)o2;
 int temp=p1.getName().compareTo(p2.getName());
 
 return temp==0?p1.getAge()-p2.getAge():temp;
}
创建了一个根据Person类的name进行排序的比较器.
TreeSet ts=new TreeSet(new ComparatorByName());
传入一个按名字排序的比较器.

5.让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法.将该类对象作为参数传递给TreeSet集合的构造函数.

==========================================
16-02-24
==========================================

1.先存了一个28,来了一个21,比28小,返回一个负数,然后就放在28的左边,又进来一个29,和28一比,放在28右边,25进来,和28一比,放在28左边,再和21比,放在21右边,然后24进来,就是28的左分支(21)的右分支(25)的左分支(24).

2.每一个都是节点
  节点持有着三个引用:一个左,一个右,一个父.

3.如果每个数字都从开头开始比,就很慢,所以每一次放元素之前,对已有的有序元素进行折半.

4.TreeSet如果要按自己的条件来排序,那么会出现有两个元素这个条件是相等的,那么也要安排这两个相等的元素如何来比较.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值