目录
定义:通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。
集合可以分为两大体系,一个是Collection,一个是 Map。Coection接口又分别被List和Set继承,List被AbstractList实现,然后分为3个子类,ArrayList,LinkList和Vector。Set被AbstractSet实现,又分为HashSet和TreeSet。而Map衍生出的集合分为HashMap,HashTable和TreeMap。
Coection接口:
1.定义的是所有单列集合中共性的方法。
2.所有的单列集合都可以使用共性的方法。
3.没有索引的方法。
Map接口:
1.双列数据,保存具有映射关系“key-value对”的集合。
常用功能:
java.util.Collection接口
所有单列结合顶层的接口,里面定义了所有单列集合共性的方法。 任意的单列集合都可以使用Collection接口的方法。
共性的方法:
public boolean add(E e);把给定的对象添加到当前集合中
public void clear();清空集合中的所有元素
public boolean remove(E e);把给定的对象在当前集合中删除
public boolean contains(E e);判断当前的集合中是否包含给定的对象
public boolean isEmpty(E e);判断当前集合是否为空
public int size();返回元素中集合的个数
public Object[] toArray();把集合中的当前元素,存储到数组中
- package Demo01;
-
- import java.util.ArrayList;
- import java.util.Collection;
-
- /*
- @Author 代码贩子、 --南京邮电大学
- */
- /*
- java.util.Collection接口
- 所有单列结合顶层的接口,里面定义了所有单列集合共性的方法。
- 任意的单列集合都可以使用Collection接口的方法。
- 共性的方法:
- public boolean add(E e);把给定的对象添加到当前集合中
- public void clear();清空集合中的所有元素
- public boolean remove(E e);把给定的对象在当前集合中删除
- public boolean contains(E e);判断当前的集合中是否包含给定的对象
- public boolean isEmpty(E e);判断当前集合是否为空
- public int size();返回元素中集合的个数
- public Object[] toArray();把集合中的当前元素,存储到数组中
- */
- public class jihe {
- public static void main(String[] args) {
- //创建集合对象,可以使用多态
- Collection<String> collection = new ArrayList<>();
- System.out.println(collection);//重写了toString方法,打印的是空字符串
- //public boolean add(E e);把给定的对象添加到当前集合中
- //返回值是一个布尔值,一般都返回true,所以可以不用接收
- boolean b1 = collection.add("张三");
- System.out.println(b1);//以后不用接收这个返回值,因为没有意义
- collection.add("李四");
- collection.add("王五");
- System.out.println(collection);
- //public boolean remove(E e);把给定的对象在当前集合中删除
- //返回值是一个布尔值,集合中存在元素,删除元素,返回true
- //集合中不存在元素,删除失败,返回false
- boolean b2 = collection.remove("田七");
- collection.remove("李四");
- System.out.println(b2);
- System.out.println(collection);
- //public boolean contains(E e);判断当前的集合中是否包含给定的对象
- //返回值是一个布尔值,集合中存在元素,包含元素,返回true
- //集合中不存在元素,不包含元素,返回false
- boolean b3 = collection.contains("田七");
- collection.contains("张三");
- System.out.println(b3);
- System.out.println(collection);
- //public boolean isEmpty(E e);判断当前集合是否为空
- //返回值是一个布尔值,集合为空,返回true
- //集合不为空,返回false
- boolean b4 = collection.isEmpty();
- System.out.println(b4);
- System.out.println(collection);
- //public int size();返回元素中集合的个数
- int size = collection.size();
- System.out.println(size);
- //public Object[] toArray();把集合中的当前元素,存储到数组中
- Object[] arr = collection.toArray();//Object可以存储任意的元素,可以把集合编程一个数组
- for (int i = 0; i <arr.length ; i++) {
- System.out.println(arr[i]);
- }
- //public void clear();清空集合中的所有元素
- collection.clear();
- System.out.println(collection);
- System.out.println(collection.isEmpty());
- }
- }
1.有序的集合(存储和取出元素的顺序相同)。
2.允许存储重复的元素。
3.有索引,可以使用普通的for循环来遍历
二者都线程不安全。ArrayList实现了基于动态数组的数据结构,LinkList是基于链表的数据结构。对于随机访问的set和get的方法,ArrayList要比LinkList更加优秀,因为LinkedList要移动指针。对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
无序,不重复。
无序、以键值对的形式添加元素,键不能重复,值可以重复。它没有继承Collection接口。
泛型是一种未知的数据类型,当我们不知道数据类型是什么的时候,可以使用泛型。
泛型可以看作是一个变量,用来接收数据类型。
好处:可以存储任何的数据类型。
坏处:在需要使用存储类型的时候需要向下转型,如果没有instanceof就容易报错ClassCastException。
好处:1.将运行期可能出现的问题提前到编译期,如果ArrayList的泛型是String就只能存储String类型。存储别的类型就会报错。
2.可以使用泛型中数据特有的方法。
坏处:只能存储一种数据类型。
- package Demo02;
-
- public class New {
- private Integer id;
- private String name;
- private String title;
-
- public New() {
- }
- public New(Integer id, String name, String title) {
- this.id = id;
- this.name = name;
- this.title = title;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
- }
- package Demo02;
-
- import java.util.LinkedList;
-
- public class psvm {
- /*
- LinkedList添加数据的方法
- */
- public static void main(String[] args) {
- New New1 = new New(1,"张三","老板");
- New New2 = new New(2,"李四","老板");
- New New3 = new New(3,"王五","老板");
- New New4 = new New(4,"赵六","老板");
- New New5 = new New(5,"田七","老板");
- LinkedList<New> linkedList = new LinkedList<New>();
- linkedList.add(New1);
- linkedList.add(New2);
- linkedList.add(New3);
- linkedList.add(New4);
- linkedList.add(New5);
- System.out.println(linkedList.size());
- /*
- LinkedList删除数据的方法
- */
- //精准定位角标来进行删除
- linkedList.remove(2);
- //删除第一条数据
- linkedList.removeFirst();
- //删除最后一条数据
- linkedList.removeLast();
- System.out.println(linkedList.size());
- /*
- LinkedList查询数据的方法
- */
- //查询第一条数据
- linkedList.getFirst().getName();
- //查询最后一条数据
- linkedList.getLast().getName();
- //for循环遍历数据
- // for (int i = 0; i <linkedList.size() ; i++) {
- // System.out.println(linkedList.get(i).getName());
- // }
- //增强for遍历数据
- for (New news: linkedList){
- System.out.println("Id"+news.getId()+"name"+news.getName()+"title"+news.getTitle());
- }
- }
- }
特点:键值存储。
- package Demo02;
-
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Set;
-
- public class psvm {
- /*
- LinkedList添加数据的方法
- */
- public static void main(String[] args) {
- //1.实例化HashMap容器
- HashMap<String,Object> hashMap= new HashMap<String,Object>();
- //2.给HashMap容器添加键值对(添加数据)
- hashMap.put("a","aaa");
- hashMap.put("1","bbb");
- hashMap.put("2","ccc");
- //3使用增强for来遍历HashMap
- //3.1keySet()代表获取HashMap容器中的所有键的集合
- Set<String> sets= hashMap.keySet();
- System.out.println(sets);
- //3.2增强for循环遍历sets集合将键和值循环遍历出来而得到真正的键
- /*
- 把HashMap键里面的集合全部的提取出来,通过遍历k就可以得到我们对应的值
- */
- // for (String s:sets){
- // System.out.println(s);
- // }
- //4.使用迭代器循环遍历HashMap获取键和值
- //4.1调用sets的iterator()得到Iterator迭代器
- Iterator<String> iterator = sets.iterator();
- //4.2通过hasNext()循环判断HashMap容器中是否有下一个值
- while (iterator.hasNext()){
- //4.3如果有则调用迭代器next()获取对应的值,这个值就是key键
- String key = iterator.next();
- //4.4得到键之后,调用HashMap容器的get()方法获取对应的key键的value值
- System.out.println("key:"+key+";"+"value:"+hashMap.get(key));
- }
- }
- }
特点:唯一,无序。
- package Demo03;
- import java.util.HashSet;
- import java.util.Iterator;
-
- public class Demo03 {
- public static void main(String[] args) {
- //1.实例化HashSet容器
- HashSet<String> sets = new HashSet<String>();
- //2.给HashSet容器添加键值对(添加数据)
- sets.add("aaa");
- sets.add("bbb");
- sets.add("ccc");
- //3.1keySet()代表获取HashSet容器中的所有键的集合
- Iterator<String> its = sets.iterator();
- //4.使用迭代器循环遍历HashSet获取键
- //4.1调用sets的iterator()得到Iterator迭代器
- while (its.hasNext()){
- //4.2如果有则调用迭代器next()获取对应的值,这个值就是key键
- String key = its.next();
- //4.3得到键之后,调用HashSet容器的get()方法获取对应的key键
- System.out.println("key"+key);
- }
- }
- }
小练习1:遍历List
- package Demo04;
-
- import java.util.*;
-
- public class Demo04 {
- public static void main(String[] args) {
- //1.准备泛型里的数据
- HashMap<String,Object> map = new HashMap<String,Object>();
- map.put("a","1");
- map.put("b","2");
- map.put("c","3");
- //2.创建容器ArrayList<Map<String,Object>>
- ArrayList<Map<String,Object>> list= new ArrayList
- //3.准备数据塞入容器中
- list.add(map);
- //4.遍历ArrayList(从外往里遍历)
- for (Map<String,Object> mm :list){
- //System.out.println(mm);
- //5.获取mm的HashMap容器中的键集合
- Set<String> sets = mm.keySet();
- //6.获取迭代器
- Iterator<String> its = sets.iterator();
- //7.循环遍历输出
- while (its.hasNext()){
- String key = its.next();
- System.out.println("key:"+key+";"+"value:"+mm.get(key));
- }
- }
- }
- }
小练习2:遍历Map
- package Demo05;
-
-
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
-
- public class Demo05 {
- public static void main(String[] args) {
- /*
- new后面的Map<String,Object>是一个类型
- 放在外面一定是实现类
- 数据应该是Map<String,Object>
- */
- //1.准备数据
- Map<String,Object> m1 = new HashMap<String,Object>();
- m1.put("a","1");
- m1.put("b","2");
- m1.put("c","3");
- Map<String,Object> m2 = new HashMap<String,Object>();
- m2.put("aa","11");
- m2.put("bb","22");
- m2.put("cc","33");
- Map<String,Object> m3 = new HashMap<String,Object>();
- m3.put("aaa","111");
- m3.put("bbb","222");
- m3.put("ccc","333");
- //2.实例化Map<String, Map<String, Object>>()容器
- Map<String, Map<String, Object>> map = new HashMap
>(); - //3.给容器塞值
- map.put("aaaa",m1);
- map.put("bbbb",m2);
- map.put("cccc",m2);
- //4.获取外层的Map容器
- //4.1获取外层Map容器的key键集合
- Set<String> sets = map.keySet();
- //4.2获取外层Map容器的游标卡尺
- Iterator<String> its = sets.iterator();
- //4.3通过游标卡尺循环遍历外层Map
- while (its.hasNext()){
- //4.4通过游标卡尺获取外层Map的key键集合
- String key = its.next();
- //4.5 打印输出外层Map的key键集合以及value值
- System.out.println("外层key:"+key);
- //5.遍历内层的Map容器
- Map<String, Object> map1= map.get(key);
- //5.1获取内层Map容器的key键集合
- Set<String> setss = map1.keySet();
- //5.2获取内层Map容器的游标卡尺
- Iterator<String> itss = setss.iterator();
- //5.3通过游标卡尺循环遍历内层Map
- while (itss.hasNext()){
- //5.4通过游标卡尺获取内层Map的key键集合
- String key1 = itss.next();
- //5.5打印输出内层Map的key键集合以及value值
- System.out.println("内层key:"+key1+"内层value:"+map1.get(key1));
- }
- }
- }
- }
老外写的一些类,类中有许多的方法。
关键字:enum
使用非枚举方式实现对Student类中的SEX属性赋值
- package Demo06;
-
- public class Text {
- public static void main(String[] args) {
- Student student = new Student();
- student.setSex("女");
- System.out.println(student.getSex());
- student.setSex("男女");//这里及有问题了 也不是人妖
- /*
- 想要解决这个问题我们可以将他作为一个常量来进行定义、
- 但是这样做就不能进行多次赋值
- private static final String SEX="男";
- */
- System.out.println(student.getSex());
- }
- }
- package Demo06;
-
- public class Student {
- private String Sex;
- public String getSex(){
- return Sex;
- }
- public void setSex(String sex){
- this.Sex = sex;
- }
- }
采用枚举的方式进行解决
- package Demo06;
-
- public enum Gender {
- 男,女
- }
- package Demo06;
-
- public class Student {
- private Gender Sex;
-
- public Gender getSex() {
- return Sex;
- }
-
- public void setSex(Gender sex) {
- Sex = sex;
- }
- }
- package Demo06;
-
- public class Text {
- public static void main(String[] args) {
- Student student = new Student();
- student.setSex(Gender.女);
- System.out.println(student.getSex());
- student.setSex(Gender.男);
- System.out.println(student.getSex());
- student.setSex("FALSE");//这里就报错了
- }
- }
定义:所有的包装类在java.lang包中都有一个相应的包装类。
作用:包装类提供一系列的实用方法,集合不允许存放基本的数据类型,要进行数字的存放时,要使用包装类型。(比如 ArrayList<> arrayList= new ArryList<>;<>l里面要么放Steing类型,要么放包装类型,想要放基本类型就要继续宁包装).
- package Demo07;
-
- public class demo07 {
- public static void main(String[] args) {
- int a = 1;
- Integer a_new = new Integer(a);
- System.out.println(a_new);
- byte b = 2;
- Byte b_new = new Byte(b);
- System.out.println(b_new);
- short c = 3;
- short c_new = c;
- System.out.println(c_new);
- }
- }
- package Demo07;
-
- public class demo07 {
- /*
- Author:代码贩子、 南京邮电大学
- */
- /*
- 除了Character以外,其余的包装类可将一个字符串作为参数构造的实例
- Au
- */
- /*
- Bollean中除了“ture”(不区分大小写)之外的其它字符串,结果都是False
- */
- public static void main(String[] args) {
- //场景一:两个字符串进行“+”操作
- String a = "123";
- System.out.println(a+"1");
- //场景二:一个字符串和一个基本数据类型进行“+”操作
- String b = "2";
- System.out.println(a+1);
- //场景三:将基本数据类型转化为字符串
- int c = 123;
- String d = a+"1";
- //场景四:两个数值类型进行“+”操作就会变成岁数操作
- System.out.println(123+1);
- //场景五:将字符串进行算数操作 需要使用包装类
- String f = "123";
- Integer f_new = new Integer(f);
- System.out.println(f_new+123);
- //场景六:字符与基本数据类型进行“+”操作
- //Character e = new Character("男");
- Boolean g = new Boolean("dasdasd");
- System.out.println(g);
- }
- }
- package Demo07;
-
- public class demo07 {
- /*
- Author:代码贩子、 南京邮电大学
- */
- public static void main(String[] args) {
- Integer a = new Integer(123);
- int a_new = a.intValue();
- Double b = new Double(3.1415926);
- b.doubleValue();
- Boolean c = new Boolean(true);
- c.booleanValue();
- }
- }
- package Demo07;
-
- public class demo07 {
- /*
- Author:代码贩子、 南京邮电大学
- */
- public static void main(String[] args) {
- //第一种写法
- int a = 123;
- String b = Integer.toString(a);
- double c = 30.0;
- String d = Double.toString(c);
- //第二种写法(企业常用)
- int e = 123;
- String f = e+"";
- }
- }
- package Demo07;
-
- public class demo07 {
- /*
- Author:代码贩子、 南京邮电大学
- */
- public static void main(String[] args) {
- int rum = Integer.parseInt("36");
- System.out.println(rum);
- boolean bool1 = Boolean.parseBoolean("false");
- System.out.println(bool1);
- }
- }
- package Demo07;
-
- public class demo07 {
- /*
- Author:代码贩子、 南京邮电大学
- */
- public static void main(String[] args) {
- //场景一:基本类型转化为包装类
- Integer intvalue= Integer.valueOf(21);
- System.out.println(intvalue);
- //场景二:字符串类型转化为包装类(Character除外)
- Integer inteValue = Integer.valueOf("21");
- double doublecalue= Double.valueOf("32");
- System.out.println(doublecalue);
- //报错场景
- String gender = '男';
- //编译报错
- Character gg = Character.valueOf(gender);
- }
- }
定义:(装箱)基本类型转换为包装类型(自动转换!)
(拆箱)包装类对象转换为基本类型的值(自动转换!)
附注:包装类不可以取代基本数据,只有在基本数据类型需要用对象表示的时候使用。
- package Demo07;
-
- public class demo07 {
- /*
- Author:代码贩子、 南京邮电大学
- */
- public static void main(String[] args) {
- //基本数据类型可以转换为包装类型(装箱) JDK1.5之后自动转化
- Integer a = 5;
- //包装类型也可以转换为基本数据类型(拆箱)
- int b = a;
- }
- }
package Demo07; public class demo07 { /* Author:代码贩子、 南京邮电大学 */ public static void main(String[] args) { //存在在常量池中 String a = "写代码"; //存放在堆中,由变量指向堆中的代码 String string = new String("写代码"); } }