三、Java中级--5、集合框架
2018-05-02 本文已影响0人
cybeyond
1、什么是集合、框架
集合:用来存放很多元素的一种类型,可称为集合容器,集合中存储的是对象的引用,其对象实质上存在堆(heap,内存分配的空间)里
框架:结构体系,很多类组成
Java Collection Framework:Java集合框架,又称为JCF
2、数组和集合的关系
数组的缺点是定长的,且只能存同一种类型
3、结构
Java1.8即为Java8,Java1.7即为Java7
- collection是最顶层,是一个接口,在java API文档的java.util包中
- List子接口:ArrayList、LinkedList、Vector
- Set子接口:
- HashSet(无序):底层存储是哈希表
- TreeSet(有序):底层存储是二叉树
- set和list接口的区别:list是有索引的,set是无索引,不能放重复的元素
- ArrayList和LinkedList,使用方法完全一样,区别:
- 数据存储方式不一样,称为不同的数据结构
- ArrayList基于数组实现,位置是连续的,查找速度较快,但增加、删除元素较慢
- LinkedList基于链表实现,物理上没有在一起,查找速度较慢、但增加、删除元素较快
- Vector:向量,基于数组实现,但已经过时,目前常用的为ArrayList
4、List的实现类
ArrayList:动态数组,表示数组长度可变
结构5、List实现类示例:
示例1:
package javastudy;
import java.util.ArrayList;
import java.util.Iterator;
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> al=new ArrayList<String>();
al.add("北京");
al.add("上海");
al.add("天津");
al.add(0,"重庆");//将重庆放在第1个位置
System.out.println("=====结果1正常输出=======");
print1(al);
System.out.println("=====结果2set英文输出=====");
al.set(1, "BeiJing");//将数字[1]中的改为英文BeiJing
print1(al);
System.out.println("====结果3遍历输出=====");
print2(al);
System.out.println("====结果4删除某一元素遍历输出====");
al.remove(2);
print2(al);
}
static void print1(ArrayList<String> al){
for(int i=0;i<al.size();i++){ //字符串、数组使用length();集合使用size()
System.out.println(al.get(i));
}
}
static void print2(ArrayList<String>al){
Iterator<String> it=al.iterator(); //遍历器相当于指针,用iterator去接收al的遍历,存放在it中
while(it.hasNext()){ //使用while遍历得到每个元素
System.out.println(it.next());
}
}
}
执行结果
6、Set的实现类
HashSet实现示例1:
package javastudy;
import java.util.HashSet;
import java.util.Iterator;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<String> hs=new HashSet<String>();
hs.add("北京");
hs.add("上海");
hs.add("天津");
hs.add("重庆");
Iterator<String> a=hs.iterator();
while(a.hasNext()){
System.out.println(a.next());
}
}
}
执行结果
HashSet示例2:使用for循环
package javastudy;
import java.util.HashSet;
import java.util.Iterator;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<String> hs=new HashSet<String>();
hs.add("北京1");
hs.add("上海2");
hs.add("天津3");
hs.add("重庆4");
// Iterator<String> a=hs.iterator();
// while(a.hasNext()){
// System.out.println(a.next());
// }
for(Iterator<String> it=hs.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
执行结果
TreeSet示例:
package javastudy;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<String> ts=new TreeSet<String>();
ts.add("Beijing");
ts.add("Shanghai");
ts.add("Tianjin");
ts.add("Chongqing");
for(Iterator<String> it=ts.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
执行结果
7、TreeSet自定义对象添加
TreeSet是有序的,在存自定义对象时(比如存入两类不同类型数据,以哪个排序为准)排序问题解决方法:
方法1:传入的对象所属的类,必须实现Comparable
示例:
package javastudy;
import java.util.Iterator;
import java.util.TreeSet;
public class Testit1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<Person> ts=new TreeSet<Person>();
ts.add(new Person("jack", 20));
ts.add(new Person("Jerry", 25));
ts.add(new Person("Mark", 30));
Iterator<Person> it=ts.iterator();//首先创建一个遍历器
while(it.hasNext()) {
Person p=it.next();
p.print(); //由于是姓名和年龄两个元素,因此存在不能排序比较的问题
}
}
}
class Person implements Comparable<Person>{ //实现Comparable方法,将两个Person进行比较;Compareable属于java.lang包,不用导入即可使用
String name;
int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
void print(){
System.out.println(String.format("姓名=%s,年龄=%d", name,age));
}
@Override
public int compareTo(Person o) { //要比较的与o进行比较
// TODO Auto-generated method stub
if(this.age>o.age) {//执行后按照年龄排序输出
return 1;
}else if(this.age<o.age){
return -1;
}else {
return 0;
}
}
}
执行结果
方法2:初始化TreeSet时,传入一个比较器(比较器是一个实现了Comparator的类的对象)作为一个构造函数
示例
package javastudy;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class Test3 {
public static void main(String[] args) {
TreeSet<Dog> ts=new TreeSet<Dog>(new MyCom());
ts.add(new Dog("Hash", 3));
ts.add(new Dog("lucy", 5));
ts.add(new Dog("nick", 2));
Iterator<Dog> it=ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class Dog {
String name;
int weight;
Dog(String name,int weight){
this.name=name;
this.weight=weight;
}
@Override //此处为重写,否则会调用object中的toString(),得到的结果是一堆字符,即引用的地址值
public String toString(){
return "名字=" +name+ ",体重=" +weight;
}
}
class MyCom implements Comparator<Dog> { //定义一个比较器
public int compare(Dog o1, Dog o2) {
// TODO Auto-generated method stub
return o1.name.compareTo(o2.name);
}
}
当你的一个类中没有重写.toString()方法的时候就会执行根类Object的这个.toString()方法。返回形式:对象的类名+@+哈希值的16进制