1、基本数据类型对象包装类:见下图
1 public class Test { 2 public static void main(String[] args){ 3 Demo(); 4 toStringDemo(); 5 jdkDemo(); 6 } 7 8 private static void jdkDemo() { 9 //注意:在1.5之后的版本中可以使用下面的形式 简化书写 ,这是版本升级的一个方面 10 Integer i=3; //自动装箱,jdk是Integer i = Integer.valueOf(3); 11 i=i+3; //自动拆箱, 12 /*注意:和用new生成对象的小区别是, 13 * 简写书写时如果数值在一个字节以内(即<128)时,重复生成不产生新空间 14 */ 15 Integer a=127; 16 Integer b=127; 17 System.out.println(a==b); 18 System.out.println(a.equals(b)); 19 Integer c=128; 20 Integer d=128; 21 System.out.println(c==d); 22 System.out.println(c.equals(d)); 23 } 24 25 static void Demo(){ 26 /*1、获取对象包装器类,以Integer为例: 27 * 最简单的是使用new,可以传入一个本类的基本数据和""包含的本类基本数据 28 * 注意:如果""中包含的不是本类基本数据会抛出一个运行时异常 29 */ 30 Integer a=new Integer(3); 31 Integer b=new Integer("3"); 32 33 //2、也可以使用静态方法valueOf()来获取对象包装类对象实例 34 // Integer c=Integer.valueOf("3"); 35 // Integer d=Integer.valueOf("3", 10); //第二个参数指定进制 36 // Integer e=Integer.valueOf(3); //这是1.5版本后新增的 37 38 //3、当然也可以将包装类对象转换为基本类型,注意不仅可以是本类基本类型,还可以是其他基本类型(但不是所有的) 39 // int f=a.intValue(); 40 // byte g=a.byteValue(); 41 42 //4、基本类型封装成对象之后的比较 43 System.out.println(a==b); //比较地址 44 System.out.println(a.equals(b)); //比较是否相等 45 System.out.println(a.compareTo(b)); //比较大小(根据字典顺序) 46 } 47 48 private static void toStringDemo() { 49 //对象包装类的一个主要作用就是将基本数据类型和String类型互换 50 //1、基本类型转换为String类型 51 Integer i=new Integer(60); 52 //使用静态方法 53 System.out.println(Integer.toString(i)); 54 System.out.println(Integer.toString(i, 16)); 55 // 56 System.out.println(i.toString()); 57 //Integer类还可以选择特定的进制进行转换,如2进制,8进制,16进制。是静态方法,内部调用toSting() 58 System.out.println(Integer.toBinaryString(i)); 59 60 //2、String转换为基本类型 61 String s="60"; 62 System.out.println(Integer.parseInt(s)); 63 //!!!下面的进制是将字符串当做该进制的数进行解析,返回一个10进制的数 64 s="3c"; 65 System.out.println(Integer.parseInt(s,16)); 66 } 67 }
参考:自动装箱
http://openhome.cc/Gossip/Java/AutoBoxUnBox.html
http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html
2、集合类:
!!!集合框架图:
Collection接口和List接口的方法:
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.ListIterator; 4 5 public class CollectionInterface { 6 public static void main(String[] args){ 7 Demo(); 8 iteratorDemo(); 9 listDemo(); 10 ListIteratorDemo(); 11 } 12 13 public static void Demo() { 14 ArrayList a1=new ArrayList(); 15 ArrayList a2=new ArrayList(); 16 a1.add("asd1"); 17 a1.add("asd2"); 18 a2.add("asd2"); 19 a2.add("asd3"); 20 System.out.println("a1="+a1); 21 System.out.println("a2="+a2); 22 //注意:addAll()会将指定集合所有对象都添加,即使用重复的也会添加 23 a1.addAll(a2); 24 System.out.println("a1="+a1); 25 //注意:removeAll()会将指定集合所有对象都删除,!!!两者中共有的也会删除 26 a1.removeAll(a2); 27 System.out.println("a1="+a1); 28 //retainAll()和removeAll()相反,会将指定集合所有对象都保存,而把其他全删除 29 } 30 31 public static void iteratorDemo() { 32 ArrayList a1=new ArrayList(); 33 a1.add("asd1"); 34 a1.add("asd2"); 35 a1.add("asd3"); 36 a1.add("asd4"); 37 /*迭代器是集合容器用来取元素的方法,不同集合有不同的取法,所以具体的迭代器依赖于具体容器, 38 * !!!Java只提供一个接口,每一个容器都需要将其作为 内部类 实现用以获取元素即可 39 * 使用iterator()获取一个迭代器,并用该迭代器获取集合中对象, 40 * 迭代器Iterator接口有三个方法: 41 * 1、hasNext():检测是否有下一个元素,因为获取方法不检测是否超过集合容量,超过会报错 42 * 2、next():获取下一个元素 43 * 3、remove():删除元素 44 */ 45 // Iterator i=a1.iterator(); 46 // while(i.hasNext()){ 47 // System.out.println(i.next()); 48 // } 49 // !!!使用while循环的缺点是在循环遍历后,该迭代器已经不能去除任何值,但仍可以使用,浪费空间,可改为for循环 50 for(Iterator i=a1.iterator();i.hasNext();){ 51 System.out.println(i.next()); 52 } 53 } 54 55 private static void listDemo() { 56 //List集合的特有方法:由于List集合中元素有角标,!!!所以特殊方法就是利用角标来进行增删改查 57 //注意 改 的方法在Collection中没有 58 ArrayList a=new ArrayList(); 59 //普通添加和指定位置添加 60 a.add("asd2"); 61 System.out.println("a="+a); 62 a.add(0,"asd3"); 63 System.out.println("a="+a); 64 //修改指定位置元素,set()返回值是原来该位置的元素 65 System.out.println("被删除的元素是:"+a.set(0,"asd1")); 66 System.out.println("a="+a); 67 } 68 69 private static void ListIteratorDemo() { 70 ArrayList a1=new ArrayList(); 71 a1.add("asd1"); 72 a1.add("asd2"); 73 a1.add("asd3"); 74 // Iterator i=a1.iterator(); 75 // while(i.hasNext()){ 76 // Object obj=i.next(); 77 // if(obj=="asd3"){ 78 // a1.add("asd5"); 79 // }else{ 80 // System.out.println(i.next()); 81 // } 82 // } 83 /*在使用迭代器Iterator接口时,!!!不能同时进行增/删/改的操作, 84 * 会报ConcurrentModificationException异常。 85 * 可以使用子接口ListIterator接口代替,!!!由名字可以看出只在List集合中使用 86 * ListIterator还允许逆向遍历List,使用hasPrevious() 87 */ 88 ListIterator i=a1.listIterator(); 89 while(i.hasNext()){ 90 Object obj=i.next(); 91 if(obj=="asd3"){ 92 i.add("asd4"); 93 }else{ 94 System.out.println(i.next()); 95 } 96 } 97 System.out.println("a1="+a1); 98 } 99 }
下面是List接口的常用子类:
1 public class Person implements Comparable<Person>{ 2 private int age; 3 public Person(int age, String name) { 4 super(); 5 this.age = age; 6 this.name = name; 7 } 8 private String name; 9 public int getAge() { 10 return age; 11 } 12 public void setAge(int age) { 13 this.age = age; 14 } 15 public String getName() { 16 return name; 17 } 18 public void setName(String name) { 19 this.name = name; 20 } 21 //这里的重写是为了HastSet练习使用 22 @Override 23 public int hashCode() { 24 return name.hashCode()+age; 25 } 26 @Override 27 public boolean equals(Object obj) { 28 Person p=(Person)obj; 29 return this.name.equals(p.name)&&(this.age==p.age); 30 } 31 //这里的 重写是为了TreeSet练习使用 32 @Override 33 public int compareTo(Person o) { 34 //注意适用泛型后不需要在进行类型强转 35 int count=0; 36 if(o instanceof Person){ 37 Person p=(Person)o; 38 // if(this.age>p.age){ 39 // return 1; 40 // }else if(this.age<p.age){ 41 // return -1; 42 // }else{ 43 // return this.name.compareTo(p.name); 44 // } 45 return count=this.age-p.age==0?this.name.compareTo(p.name):count; 46 } 47 return 0; 48 } 49 50 }
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.LinkedList; 4 import com.lll.cn.Person; 5 6 public class ListSubClassDemo { 7 public static void main(String[] args){ 8 VectorDemo(); 9 LinkedListDemo(); 10 LinkedListTest(); 11 ArrayListDemo(); 12 } 13 14 public static void VectorDemo() { 15 //该类由于效率低下,和Enumeration一起不推荐使用 16 } 17 18 public static void LinkedListDemo() { 19 /*LinkedList是链表结构,所以特殊方法是和第一个元素/最后一个元素相关 20 * 如在第一个/最后一个位置添加元素,删除元素,获取元素等 21 * !!!注意有些方法仅仅获取,有些是移除并返回 22 * 注意: 23 */ 24 LinkedList<String> l=new LinkedList<String>(); 25 l.add("asd2"); 26 l.add("asd3"); 27 l.addFirst("asd1"); 28 System.out.println("最后一个元素是"+l.getLast()); 29 while(!l.isEmpty()){ 30 System.out.println(l.removeFirst()); 31 } 32 System.out.println(l); 33 } 34 35 public static void LinkedListTest() { 36 /*使用LinkedList模拟堆栈和队列两种数据结构 37 * 堆栈:先进后出First In Last Out -->FILO 38 * 队列:先进先出First In First Out -->FIFO 39 */ 40 StackDemo q=new StackDemo(); 41 q.myAdd("asd9"); 42 q.myAdd("asd2"); 43 q.myAdd("asd3"); 44 q.myAdd("asd4"); 45 System.out.println(q.myRemove()); 46 } 47 48 private static void ArrayListDemo() { 49 //ArrayList集合是最常用的的集合,并且通常用于存储自定义对象 50 ArrayList<Person> a=new ArrayList<Person>(); 51 a.add(new Person(11,"asd1")); 52 a.add(new Person(12,"asd2")); 53 a.add(new Person(13,"asd3")); 54 a.add(new Person(14,"asd4")); 55 /*!!!注意在使用集合存储数据时的易错点 56 * 1、所有自定义类型都会转换为Object类型,所以在使用时应该进行强制转换 57 * 2、在一个循环中使用next()时应该小心,因为每次next()都会将指针向下移动而不再指向刚才对象 58 * 下面就是错误示例 59 */ 60 for (Iterator<Person> i = a.iterator(); i.hasNext();) { 61 //System.out.println(i.next().getName()+i.next().getAge()); 62 Person p=(Person) i.next(); 63 System.out.println(p.getName()+":"+p.getAge()); 64 65 } 66 } 67 } 68 class QueueDemo{ 69 private LinkedList<Person> l=null; 70 QueueDemo(){ 71 l=new LinkedList<Person>(); 72 } 73 public void myAdd(Person obj){ 74 l.add(obj); 75 } 76 public Object myRemove(){ 77 return l.removeFirst(); 78 } 79 } 80 class StackDemo{ 81 private LinkedList<String> l=null; 82 StackDemo(){ 83 l=new LinkedList<String>(); 84 } 85 public void myAdd(String obj){ 86 l.add(obj); 87 } 88 public Object myRemove(){ 89 return l.removeLast(); 90 } 91 }
迭代器接口(Iterator):用于获取容器中的元素,是枚举类(Enumeration)的改进版,增加了删除功能并简化了书写。枚举类是伴随着Vector类的出现而出现的,也伴随着该类的改进(使用ArrayList代替)而被改进(使用Iterator代替)
链表和数组:
LinkedList特有方法:
Set常用子类:
1 import java.util.HashSet; 2 import java.util.Iterator; 3 import java.util.LinkedHashSet; 4 import java.util.TreeSet; 5 6 import com.lll.cn.Person; 7 8 public class SetSubDemo { 9 public static void main(String[] args){ 10 HashSetDemo(); 11 HastSetTest(); 12 TreeSetDemo(); 13 } 14 15 public static void HashSetDemo() { 16 /*HashSet的底层结构仍是数组,但是有所改进: 17 * 即存入数据时是根据哈希算法获取该数据的地址值,然后将其存入该地址 18 * 特点: 19 * 1、不允许存入相同元素, 20 * 2、如果计算出两个相同地址值,会将后者进行修改后存储 21 * 3、获取时计算地址值,如果该位置有元素且 22 * !!!注意确定对象地址值的哈希算法就是对象内部的hashCode(),如果没有则使用继承自Object的 23 * 所以要使用HashSet来存储数据,并保证其中的值唯一,应该修改hashCode()和equals() 24 * 25 * !!!在集合中对一个元素进行操作(例如remove,contains),首要的是判断在集合中是否有该对象, 26 * 通常依靠的是equals()和hashCode()。所以使用自定义对象时,应该对这两个方法进行重写 27 */ 28 } 29 30 public static void HastSetTest() { 31 HashSet<Person> hs=new HashSet<Person>(); 32 //如果自定义对象也要达到确保唯一性的要求,就要覆写hashCode()和equals(),原因见上 33 hs.add(new Person(11,"asd1")); 34 hs.add(new Person(12,"asd2")); 35 hs.add(new Person(13,"asd3")); 36 hs.add(new Person(14,"asd4")); 37 hs.add(new Person(11,"asd1")); 38 for (Iterator<Person> i = hs.iterator(); i.hasNext();) { 39 Person obj = (Person) i.next(); 40 System.out.println(obj.getName()+":"+obj.getAge()); 41 } 42 //HashSet还有一个子类LinkedHashSet,具有LinkedList和HashSet双重特性:即有序又唯一 43 LinkedHashSet<Person> lhs=new LinkedHashSet<Person>(); 44 lhs.add(new Person(11,"asd1")); 45 lhs.add(new Person(12,"asd2")); 46 lhs.add(new Person(13,"asd3")); 47 lhs.add(new Person(14,"asd4")); 48 lhs.add(new Person(11,"asd1")); 49 for (Iterator<Person> i = lhs.iterator(); i.hasNext();) { 50 Person obj = (Person) i.next(); 51 System.out.println(obj.getName()+":"+obj.getAge()); 52 } 53 } 54 55 public static void TreeSetDemo() { 56 /*TreeSet集合会对存入的对象进行比较然后进行存放,比较的过程可以用以下两种方式实现 57 * 1、使对象实现Comparable借口,重写compareTo(),称为自然排序方法 58 * 2、使集合具备排序功能,就是向TreeSet中传入一个实现了Comparator接口的类的对象实例 59 */ 60 TreeSet<Person> ts=new TreeSet<Person>(); 61 ts.add(new Person(21,"asd1")); 62 ts.add(new Person(22,"asd2")); 63 ts.add(new Person(22,"asd3")); 64 ts.add(new Person(24,"asd4")); 65 for (Iterator<Person> i = ts.iterator(); i.hasNext();) { 66 Person p = (Person) i.next(); 67 System.out.println(p.getName()+":"+p.getAge()); 68 } 69 TreeSet<Person> ts2=new TreeSet<Person>(new ComparatorByName()); 70 ts2.add(new Person(21,"asd1")); 71 ts2.add(new Person(22,"asd2")); 72 ts2.add(new Person(22,"asd3")); 73 ts2.add(new Person(24,"asd1")); 74 for (Iterator<Person> i = ts2.iterator(); i.hasNext();) { 75 Person p = (Person) i.next(); 76 System.out.println(p.getName()+":"+p.getAge()); 77 } 78 } 79 }
1 import java.util.Comparator; 2 3 import com.lll.cn.Person; 4 5 public class ComparatorByName implements Comparator<Person> 6 { 7 //这个类是外部类,用于集合中元素的比较 8 @Override 9 public int compare(Person p1, Person p2) 10 { 11 int comp=0; 12 13 return (comp=p1.getName().compareTo(p2.getName()))!=0?comp:p1.getAge()-p2.getAge(); 14 //return 1; 15 } 16 }
哈希如何判断元素相等:
二叉树:会用自然排序或自定义排序方法进行排序,取出时按排好的顺序从左到右取出。但是并不意味着必须是从小到大的顺序,因为如果左边第一个是最大的,就是从大到小取。当然也可以有序存取(即先存先取/后存后取)
集合总结:
1、选择集合容器的技巧
2、集合容器体系和数据结构区分