------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如果要按自己的条件来排序,那么会出现有两个元素这个条件是相等的,那么也要安排这两个相等的元素如何来比较.