Java基础(集合)
来源:互联网 发布:mac pro2016充电器 编辑:程序博客网 时间:2024/05/23 23:18
集合
集合大概理论:
List接口
ArrayList:实现了可变的数组,在内存中分配连续的空间,便利元素和随机访问元素的效率比较高。 LinkedList:采用链表储存方式,插入,删除元素时效率比较高!
set接口
HashSet:唯一,重复,直接不能储存进去!无序的,是采用哈希吗储存的!
Collection 是层次结构根接口
List: 有序(存入和取出的顺序一致),元素都有索引(角标),储存的元素可以重复。(怎么存的元素,就怎么吧元素取出来) ArrayList是List的子接口。
set: 元素不能重复,储存的元素是无序的。
一些collection允许有重复元素,而另一些则不允许。 一些collection是有序的,而另一些则是无序的。
由于collection是接口,所以不能new他的对象
语法:
Collection collection = new Collection();这种是语法错误的,因为 Collection 是接口,所以不能new,因为毫无意义。不能实例化那么我们怎么new了? 此时我们就要找他的实现对象我们查找API 发现colletion有很多实现子类 extends collection
- 所有已知实现类: AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector
Collection的使用常见方法
1:添加。 boolean add(Object obj);
boolean addAll(colecton coll);
吧这个引用类型元素添加到调用此方法的引用。
2:删除。 boolean remvoe(Object obj);
boolean removeAll(collecton coll);
删除重复的元素,保留不重复的元素
3:判断 boolean contains(Object obj);
boolean contains(collection coll); 如果列表包含指定 collection 的所有元素,则返回 true。
boolean isEmpty();判断集合中是否有元素
4:获取 int size();
iterator iterator();取出元素的方式,迭代器
5:其他 boolean retainAll(collection coll);取交集。
Object[]toString();将集合转成数组。
语法: //储存数据 *ollection collection = new ArrayList(); collection.add(100); collection.add("哈哈"); collection.add(10.1); collection.add(false); System.out.println("他的长度是"+collection.size());
这个是打印他的这个集合的长度
toArray() 关键词是吧集合的内容全部转为数组;
public class Demo3 { public static void main(String[]args){ Collection collection = new ArrayList(); Demo demo = new Demo(null,0);//此时这句话可以不写因为在集合里面new了这个类的无参构造。 collection.add(new Demo("哈哈哈",10)); collection.add(new Demo("嘻嘻嘻",30)); collection.add(new Demo("啦啦啦",80)); System.out.println("他的长度是"+collection.size()); Object[] obj = collection.toArray(); //因为ArrayList是实现Collection子类所以他们都是基于OBject超类 for(int i =0;i<collection.size();i++){ Demo demo =(Demo)obj[i]; //吧每次collection集合遍历的地址都给了demo对象名 System.out.println(demo.getname); System.out.println(demo.getin); } } } class Demo{ private String name; // private String [] name; private int in;// public Demo(String ing, int in) { this.ing = ing; this.in = in; } public String getname(){ return name; } public void setname(String name){ this.name = name; } public int getin(){ return in; } public void setin(int in){ this.in = in; } }
以下new出来的是错误的,因为name 和 in 是普通值,而在遍历数组的时候,是无法加载的,除非 private String [] name; private int[] in;
或者
System.out.println(demo.getname()); System.out.println(demo.getin());
后面加上();
addAll()方法
用于:添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序。
import java.util.ArrayList; import java.util.Collection; class Demo1{ public static void main(String[]args){ Collection collection = new Arraylist(); Collection collection1 = new Arraylist(); collection.add("1"); collection.add("2"); colelction.add("3"); collection1.add("2"); collection1.ada("4"); collection1.add("4"); collection.addAll(collection1); //这句代码是将这个colleciton的元素添加到colleciton1里面 System.out.println(collection); } }
removeAll()
用于:移除此 collection 相同的元素(重复的元素),保留不相同的元素(不重复的元素);
publc class Demo{ public static void main(String[]args)[ Collection collection = new ArrayList(); Collection collection1 = new ArrayList(); collection.add("1"); collection.add("2"); collection.add("3"); collection1.add("1"); collection1.add("2"); collection1.add("6"); // System.out.println(collection.addAll(collection1));//因为removeAll是boolean,所以返回的是布尔类型 collection.addAll(collection1); System.out.println(collection); collection.removeAll(colleciotn1); System.out.println(colelciton); //这两句代码是 两个引用类型,在堆内存储存一样的元素时候,那么全部去掉,只留下两个堆内存中不重复的元素 } }
containsAll
如果此colleciton 包含了全部的colleciton的元素,则返回true,否则返回false
public class Demo{ public static void main(String[]args){ Collection collection = new ArrayList(); Collection collection1 = new ArrayList(); collection.add("1"); collection.add("2"); collection1.add("1"); colelction1.add("2"); collection.containsAll(collection1); //containsAll 如果这个包括了全部的元素,那么返回true否则就是false } }
retainAll()
用于:如果集合colleciton 去交集,删除collection不相同的元素,保留相同的元素,和remove相反
public class dEMO {public static void main(String[]args){List list = new ArrayList();List list1 = new ArrayList(); yi(list,list1);}public static void yi(List<String> list,List list1){ list.add("1"); list.add("2"); list.add("3"); list1.add("6"); list1.add("2"); list1.add("3"); boolean a = list.retainAll(list1); System.out.println(list1+"+"+list); System.out.println(a); //取交集,保留相同的元素,干掉不相同的元素}
}
迭代器接口 Iterator()
方法摘要:
hasNext() 如果仍有元素迭代,则返回true
next() 返回迭代的下一个元素
remove() 从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)
一般用来遍历集合内容的
返回在此collection的元素上进行迭代的迭代器。关于元素返回没有任何保证 (除非此collection是某个能提供保证顺序的类实列)。
Iterator iterator = demo.iterator(); //这句代码是调用集合迭代器方法,为了获取集合的迭代器对象
语法如下:
class Demo{public static void mian(String[]args){Collecton collection = new ArrayList();collection.add(new Demo2("哈哈",123));collection.add(new Demo2("嘻嘻嘻",1234));collection.add(new Demo2("啦啦啦",11111));System.out.println(collection.size());//size是显示集合的长度的Iterator iterator = collection.iterator();//collection.iterator(); 这句代码是 调用集合的迭代器方法,是为了获取集合中的迭代器对象//Iterator iterator 这句代码是 ,我拿到了迭代器的对象 while(iterator.hasNext){ //hasNext是条件判断,则next给hasNext返回是true还是false ,用于查看下一个有没有元素 Object obj = iterator.next();//这句话可以直接写成 Demo2 demo = (Demo2)iterator.next(); //用于:返回iterator的boolean的类型,吧每次遍历的指针给你,每次循环,达到实现属性类使用 //因为是new Demo2这个类的,所以我们get来取这个类的属性 Demo2 demo = (Demo2)obj;//因为在集合中我们new的没有指针,所以必须来遍历指针指引这个属性类 System.out.println(demo.geting()); System.out.println(demo.getin); }
迭代器与集合错误特点:
在迭代器操作过程中,不能用集合来操作删除,添加,只能打印。
不能迭代器和集合同时对元素进行修改,添加,和删除。
class Demo{ public static void main(String[]args){ List list = ArrayList(); yi(list); } public static void yi(List list){ list.add("1"); list.add("2"); list.add("3"); Iterator It = list.iterator(); while(It.hasNext){ Object obj = It.next(); if(obj.equals("2")){ list.add("55"); //在这一步把list集合元素给了迭代器,在迭代器过程中,突然使用集合来操作元素,所以报错! //吧集合元素给了迭代器,要不集合操作,要不迭代器操作,否则出现异常报错! } } } }
如果坚决用集合迭代器来增加元素,那么我们就用迭代器的子类(listIterator)的方法实现
语法如下:
class Demo( public static void main(String[]args){ List list = new ArrayList(); yi(list); System.out.println(list); } public static void yi(List list){ list.add("1"); list.add("2"); list.add("3"); ListIterator It = list.iterator(); while(It.hasNext()){ // System.out.println(It.next());//此时不能这样,因为next是迭代器的返回,如果有两个迭代器操作时,除了此内存操作,会报错! Object obj = It.next(); if(obj.equals.("3")){ //如果里面有这个字符串,那么进来添加一个 It.add("4"); } } }}
用for循环遍历这个集合迭代器元素:、
语法如下:
for(Iterator ii = collecton.iterator(); ii.hasNext(); ){ Demo2 dem =(Demo2) ii.next();//迭代器获取到元素的地址,查看堆内存中是否为空,返回给迭代器条件判断,然后吧每次遍历的地址值给了这个对象名 System.out.println(dem.geting()); }}class Demo2{ private Stirng ing; private int in; public Demo2(){} public Demo2(String ing,int in){ this.ing = ing; this.in = in; } public String geting(){ return ing; } public void seting(String ing){ this.ing = ing; } public int getin(int in){ return in; } public void setin(int in){ this.in = in; }
Collecton接口子类List
List接口:特有的常见方法,有一个共性特点就是都可以操作角标
Vector:内部是数组数据结构,是同步的。增删,查询很慢。
ArrayList:内部是数组数据结构,是不同步的,替代了Vector。查找元素很快,删除其中,则坐标移动,一动则动全身,因为他储存方式是数组,增删,其动全部坐标,删除也是。
LinkedList:内部是链表数据结构,是不同步的,增删元素的速度很快
以下是常见方法区
1. 添加:
void add(index,element);
void add(index,collecton);
2.删除:
Object remove(index);
3.修改:
Object set(index,element);
4.获取:
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(fron,to);
增加元素:void add(index,collecton):获取元素的角标,来添加元素
语法如下:
class Demo{ public static void main(String[]args){ List list = new ArrayList(); yi(list);//调用他的引用 } public static void yi(List list){//获取List 的list对象名 list.add("abc1"); list.add("abc2"); list.add("abc3"); list.add(1,"abc5"); //这句话就是在集合1角标哪里直接插入 } }
删除元素: Object remove(index):在remove()参数括号里面填写哪个坐标,就删除哪个元素。
语法如下:
class Demo{publc static void mian(String[]args){ List list = new ArrayList(); yi(list); }public static void yi(List list){ list.add("abc"); list.add("aaa"); list.add("add"); System.out.println(list.remove(2)); //这句话就是用List调用自身的方法,remove删除坐标2的元素。 } }
修改元素:Object set(index,”asdf”);在指定坐标,修改元素
语法如下:
class Demo{ public static void main(String[]args){ List list = new ArrayList(); yi(list); } public static void yi(List list){ list.add("a"); list.add("b"); list.add("c"); System.out.println(list.set(1,"ha")) //吧指定坐标的元素修改成当前元素。 } }
get(int index):这种方法用于返回列表中指定位置的元素。
语法如下:
class Demo{ public static void main(String[]args){ Collecetion colleciotn = new ArrayList(); collection.add(new Demo1("哈哈",123)); collection.add(new Demo1("我是",11)); System.out.println(collection.size()); for(int i = 0;i<collection.size();i++){ List list = (List)collection; Demo1 demo =(Demo1) list.get(i); //为什么要用List了?因为只有List是colleection的子类,但是List这个接口有get方法,用来获取元素 } } } class Demo1{ private String ing ; private int in; Demo1(){} Demo1(Stirng ing,int in){ this.ing = ing; this.in = in; } public String geting(){ return ing; } public void seting (String ing){ this.ing = ing; } public int getin(){ return in; } public void setin(int in){ this.in = in; } }
LinkedList();类 来自List接口。
addFirst()方法: 用于来逆序集合的元素
增加头部元素:
//此段代码不能执行!只为参考不常用的方法!class Demo{ public static void main(String[]args){ LinkedList linkedlinst = new LinkedLint(); yi(linkedlist); } public static void yi(LinkedList linkedlist){ linkedlist.addFirst("1"); linkedlist.addFirst("2"); linkedlist.addFirst("3"); linkedlist.addFirst("4"); //删除迭代器的头一个元素,remove是删除,First是头部 System.out.println(removeFirst); //这句代码是 删除头部。 //get是获取元素,System.out.println(getFirst()); //获取几个第一个元素 //因为都是collection的接口的子类,我们用LinkedList调用collection迭代器 Iterator It = linkedlist.iterator(); while(It.hasNext()){ System.out.println(It.next()); } } }
Collection接口子类:
set接口:元素不可重复,是无序的。继承了collection接口,因此拥有collection方法。
set接口有两个子类比较常用。HashSet,TreeSet。
Hashset;内部数据结构是哈希表,是不同步的:此类实现set接口,它不保证set的迭代顺序,特别是他不保证该顺序恒久不变,此类允许使用null元素。所以存储元素的时候,使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同 储存方式就是: 用hashcode方法确定元素的地址,然后在用equals判断元素的内容
HashSet类:
HashSet方法:
class Demo{public static void main(string[]args){ HashSet hashset = new HashSet(); hashset.add("1"); hashset.add("2"); hashset.add("3"); hashset.add("4"); Iterator It = hashset.iterator(); while(It.hasHext()){ System.out.println(It.next()); } }} //打印出来不保证迭代顺序,如果有重复元素,只打印一个 //因为HashSet类是根据哈希算法的元素来存储的。用于查找速度快。不能重复元素,是因为他根据算法来储存的,所以直接覆盖了当前的相同的元素。
LinedHashSet方法:
class Demo{ public static void main(String[]args){ HashSet linkedHashSet = new LinkedHashSet(); linkedHashSet.add("1"); linkedHashSet.add("2"); linkedHashSet.add("3"); linkedHashSet.add("1"); linkedHashSet.add("2"); Iterator It = linkedHashSet.iterator(); while(It.hasNext()){ System.out.println(It.next();); } } }//LinkedHashSet();方法是元素有序,只唯一。因为他是哈希列表,链接列表实现。
TreeSet:可以对Set集合中的元素进行排序,是不同步的。
基本语法如下:
public class tersetDemo { public static void main(String[]args){ TreeSet treeset =new TreeSet(); treeset.add(new Demo("嘻嘻",19)); treeset.add(new Demo("哈哈",12)); treeset.add(new Demo("啦啦",42)); treeset.add(new Demo("呵呵",49)); treeset.add(new Demo("突突",13)); for(Iterator It = treeset.iterator();It.hasNext();){ System.out.println(It.next()); } } }class Demo{private String name;private int in;Demo(){}Demo(String name,int in){ this.name = name; this.in = in;}public String getName() { return name;}public void setName(String name) { this.name = name;}public int getIn() { return in;}public void setIn(int in) { this.in = in; }} //这段代码会报异常: Exception in thread "main" java.lang.ClassCastException: Demo1.Demo cannot be cast to java.lang.Comparableat java.util.TreeMap.put(TreeMap.java:542)at java.util.TreeSet.add(TreeSet.java:238)at Demo1.tersetDemo.main(tersetDemo.java:8)
TreeSet
1,元素不可重复
2,可以按照自然顺序排序
3,如果排序的是引用数据类型,需要实现Comparable接口
此接口需要重写compareTo()方法,此方法规定,如果该对象小于,等于或大于指定对象,则分别返回负整数,零或正整数。
正确的TreeSet方法: 数字排序
class Demo{public static void main(String[]args){ set set =new TreeSet(); set.add(new Demo1("张三",12)); set.add(new Demo1("李四",11)); set.add(new Demo1("王麻子",213)); for(Iterator It = set.iterator();It.hasNext()){ Demo1 demo = (Demo1)It.next(); System.out.println(demo.getname()); } } class Demo1 implements Comparable{ //实现Comparable接口,调用接口的compareTo方法; private String name; private int in; Demo1(){ } Demo1(String name,int in){ this.name = name; this.in = in; } public String getName(){ return name; } public void setnName(String name){ this.name = name; } public int getIn(){ return in; } public void setIn(int in){ this.in = in; } //需要重写Object的toString方法; public String toString(){ return name +";"+ in; } //调用接口的方法 public int compareTo(Object o) Demo1 demo = (Demo1)o; if(this.in>demo.in){ return 1; }if (this.in<demo.in){ return -1; }else{ return 0; } //这样就是排序他的数字属性这个。}
如果全部返回的是1,那么按顺排序。
public int compareTo(Object o) { Demo dd =(Demo)o; if(this.in<dd.in ){ return 1; }if (this.in>dd.in){ return 1; }else{ return 1; } //在方法里面返回的负数和正数来排序的。}}
字符串排序
class treesetDemo1{ public static void main(String[]args){ TreeSet treeset =new TreeSet(); treeset.add("星期一"); treeset.add("星期二"); treeset.add("星期三"); treeset.add("星期四"); Iterator It = treeset.iterator(); }}class Demo3{ private String name; Demo3(){ } Demo3(String name){ this.name = name; } public String getName(){ return name;}public void setName(String name){ this.name = name;}public String toString (){} }
Map:
一次添加一对元素,collection一次添加一个元素。
Map也称为双列结合,collection集合称为单列集合。
其实Map集合中存储的是键值对。Map集合中必须保证键的唯一性。
1,添加
value put(key,value):返回前一个和key关联的值,如果没有返回null
2,删除
value clear();清空Map集合。value remove(key);根据指定的key翻出这个键值对。
3,判断
boolean containsKey(key):boolean containsValue(value):boolean isEmpty();
4,获取
value get(key);通过建获取值,如果没有该键返回null。当然可以通过返回null,来判断是否包含指定建。int size();获取键值对的个数。
put方法;
class Demo1{ public static void main(String[]args){ Map map = new HashMap(); map.put("键","值"); map.put("键", "值1"); map.put("活动钱包","不好" ); map.put("活动钱包","不好"); map.put("呵呵", "哈哈");//如果键相同,那么第一个不打印,键和值相同,不重复。 是无序的 }}
Map集合和Collection集合不一样,所以Map集合里面没有迭代器方法 。
取出Map中的所有元素。 原理,通过keySet方法获取map中所有的键所在的set集合,再通过set的迭代器获取到每一个键,在对每一个键获取对应的的值即可。
class HashMap{ public static void main(String[]args){ HashMap hash = new HashMap(); hash.put("1","一"); hash.put("2","二"); hash.put("3","三"); //获取到键遍历: Set set = map.keySet(); //因为HashMap的接口是Set; //通过键拿到值遍历 for(Iterator It = set.iterator();It.hasNext();){ Object obj = It.next(); //吧键给这个obj System.out.println(obj+""+map.get(obj)); //obj的值 为什么需要get了? get是获取到当前的值 } } }
存键打值 Map对象名.get(键);
import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class HashMapDemo3 { public static void main(String[]args){ HashMap<String,Student> map = new HashMap<String ,Student>(); Student set = new Student("李明","男"); map.put("Jack",set); boolean b = map.containsKey("Jack"); //判断这个map集合是否存在这个键。 Set<String> s = map.keySet(); //map没有迭代器方法,set有,吧字符串的键,转成set集合里面, if(b){ for( Iterator<String> it = s.iterator();it.hasNext();){ String ing = it.next(); Student stu = map.get(ing); System.out.println("Jack对应的学院姓名是:"+stu.getName()+":性别是"+stu.getSex()); } } } }class Student{private String name;private String sex;Student(){}Student(String name,String sex){ this.name = name; this.sex = sex;}public String getName() { return name;}public void setName(String name) { this.name = name;}public String getSex() { return sex;}public void setSex(String sex) { this.sex = sex;}}
Collections类常用方法:
Collections和Collection不同,前者是集合的操作类,后者是集合接口!
Collections提供的常用静态方法:
sort(): 排序
import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; public class CollectionMinDemo { public static void main(String[]args){ ArrayList list = new ArrayList(); list.add(new Student1("指尖",12)); list.add(new Student1("跳动",23)); list.add(new Student1("安全",12)); list.add(new Student1("异常",314)); list.add(new Student1("阿斯顿",123)); Collections.sort(list); //在这里就是 系统就要给这些的值进行排序,然后我们在遍历即可! for(Iterator It = list.iterator();It.hasNext();){ Object obj = It.next(); Student1 stu = (Student1)obj; System.out.println("姓名:"+stu.getName()+":"+stu.getAge()); // System.out.println(list); } // System.out.println(list); }}class Student1 implements Comparable<Student1>{private String name;private int age;Student1(){}Student1(String name,int age){ this.name = name; this.age = age;}public String getName() { return name;}public void setName(String name) { this.name = name;}public int getAge() { return age;}public void setAge(int age) { this.age = age;}@Overridepublic int compareTo(Student1 o) { int num = this.age - o.age; return num;//比较他们两个差值,然后返回给这个属性类,然后系统进行排序。}}
小练习2:
import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; public class CollectionsDemo3 { public static void main(String[]args){ ArrayList<Student> arr = new ArrayList<Student>(); arr.add(new Student("北京大学","北京",100,7)); arr.add(new Student("复旦大学","上海",82,7)); arr.add(new Student("北京大学","北京",98,7)); arr.add(new Student("浙江大学","浙江",82,5)); arr.add(new Student("武汉大学","湖北",82,6)); arr.add(new Student("中山大学","广东",76,4)); arr.add(new Student("国防科技大学","湖南",80,4)); arr.add(new Student("南京大学","江苏",80,5)); arr.add(new Student("上海交通大学","上海",81,4)); arr.add(new Student("中国人民大学","上海",42,1)); Collections.sort(arr);// System.out.println(""); for(Iterator<Student> It = arr.iterator();It.hasNext();){ Student stu = It.next(); System.out.println(stu.getName()+"\t"+stu.getDiqu()+"\t"+stu.getAge()+"\t"+stu.getIn()); } } }class Student implements Comparable<Student>{private String name;private String Diqu;private int age;private int in;Student(){}Student(String name,String Diqu,int age ,int in){ this.name = name; this.Diqu = Diqu; this.age = age; this.in = in;}public String getName() { return name;}public void setName(String name) { this.name = name;}public String getDiqu() { return Diqu;}public void setDiqu(String diqu) { Diqu = diqu;}public int getAge() { return age;}public void setAge(int age) { this.age = age;}public int getIn() { return in;}public void setIn(int in) { this.in = in;}@Overridepublic int compareTo(Student o) { int num = this.age - o.age; int num2 = num == 0?this.in-o.in:num; return num2; /*比较总分,的同时,如果发现等于0 ,那么总分必定一样,在这种的情况下。 就比较他的星级,返回他的差!如果不能与0 就返回num!他的总分!!!! */ } }
- java基础(集合)
- java基础(集合)
- Java基础(集合)
- Java基础--集合框架(Map集合)
- Java基础3(集合)
- java基础:集合(七)
- (基础一)java集合
- java基础--集合(1)
- Java基础(六) 集合
- java基础【2】(集合)
- java基础(七)------java集合框架
- Java基础(三):Java集合总结
- [ java ] java基础集合!
- JAVA基础---集合(一)--集合框架概述
- Java基础(集合卷)--单列集合老大Collection
- Java基础(四)(集合)
- java基础--API1(集合类)
- Java基础之容器(集合)
- Python 线程,生产者消费者模式(队列存放商品)
- Navicat下载_Navicat 64位_Navicat for mysql
- Python中字符串的方法
- hdu 3530(单调队列)
- 求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。
- Java基础(集合)
- LeetCode:Assign Cookies
- 关于u3d注意点
- linux入门1
- hdu 1269 tarjan算法模板
- Shadowsock流量的随机森林检测方法
- Windows下Go语言配置和LiteIDE
- 提高代码阅读能力的7种方法
- c#导出word(笔记)