🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇
本次学习主要学习两块内容;
泛型和List集合;这次学习心得本应早点总结,奈何还是一直拖欠,希望下次能够及时改正;
一:泛型;
泛型通俗来说就是在你要定义变量时,不确定这个变量到底得定义为什么类型时可以使用;默认泛型为object类型,默认使用大写字母<T>来表示object;可以使用任何类型;这里需要注意一点,泛型中是要传入一个对象所以不能传入int只能使用它的包装类Intger;
泛型也可以在定义一个对象时进行使用,但是这样被定义完后,这个对象只能输出被你定义的这个类型;
使用泛型的优点在于延展性比较高;在不确定要使用什么数据类型时,就可以使用泛型,因为它返回的是一个object类型;
二:List集合;
集合顾名思义就是将一堆数据存放在一个集合之中;集合和数组最大的差别在于;数组要提前确定你需要存放数据的范围,当你存放的数据超过你所需要的数组时那么你的数组就必须要进行一个扩容操作;
String[] str2=new String[5]; for (int i = 0; i < str1.length; i++) { str2[i]=str1[i]; } str2[4]="菲特"; for (int i = 0; i <str2.length ; i++) { System.out.println(str2[i]); }
所以为了更加方便,就可以采用集合来存储数据;
集合可以分为三块;List,Set,Map;
List:
List可以分为三大模块:ArrayList;LinkList;Vector;
一:ArrayList基本功能;
(一般的方法类都可使用Collections.方法进行调用例如对数据进行排序可以使用小到大可以使用Collections.sort方法会对集合数据进行小到大排序;Collections.reverse方法是对集合里的数据进行大到小排序)
1;首先需要创建一个ArrayList对象,然后可以在最前面添加一个泛型(默认是Object类型);
使用.add方法添加数据,没有内存制约可以存你想要存的所有数据;也可以在定义泛型时定义一个自定义类型的泛型,但需要注意的是使用.add方法时就得传入一个你自定义的对象了;
list1.add(new Person("张三","男")); list1.add(new Person("李四","男")); list1.add(new Person("王五","男"));
2;需要获取数据时可以采用.get方法进行获取;在数据很多时可以采用循环来遍历出你想要的数据;有三种方法进行循环;
普通for循环:
for (int i = 0; i <list1.size() ; i++) { System.out.println(list1.get(i)); }
这里需要注意的是,集合循环的长度是由.size来决定的,这个是集合的大小;
增强for循环:
for (Person person:list1){ System.out.println(person); }
这边需要注意的是最左边写的是集合定义的类型,:左边存放发的是循环出来的数据暂时存放的内存空间,:右边存放的是创建集合对象时的对象名;
遍历器循环:
//遍历器循环,这个方法可以就是判断hasNext里是否还有值有就继续循环 Iterator iterator =list1.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); }
3:想要在集合里插入数据也可以采用.add()方法进行插入;
list.add(1,"困吧"); System.out.println(list);
4:想要在集合里通过索引查找数据可以使用.get()方法()里存放你想要查询的数据下标;
System.out.println(list.get(3));
5:想要在集合中删除数据可以使用.remove方法将集合中的数据删除
list.remove(2);
6:清除集合,将集合整个清空.clear方法
list.clear();
7:将集合转化为数组使用.toArrly方法,因为需要传入的是一个object类型的集合,所以要定义一个Object类型的变量去接收集合;且转化后这个集合不在拥有集合的那些方法,而只能拥有数组的方法
Object object= list.toArray(); //接受完以后这个数组就不再具有集合的那些方法 System.out.println(object.toString());
8:将数组转化为集合,括号里存放的是数组的名称;
List list1= Arrays.asList(object);
开发用的比较少可以忽略以下;
二;LinkLIst(链表集合);
使用方法与ArryList集合相似;
LinkList与ArryList差别在于前者是链表实现存储,与后者相比在删除数据时能更加快速,但是在使用.get() //方法使用索引查找数据时要重新循环一整编,会更加麻烦
需要注意的是LinkLIst有一种更加特殊的方法就是.addAll方法这个方法可以将两个集合拼凑在一起;
List<Object> list=new LinkedList(); list.add("今天好开心"); List<String>list1=new LinkedList<>(); list1.add("因为和女朋友出去散步"); list.addAll(list1); System.out.println(list);
需要注意的是两个需要拼凑在一起的集合类型必须是相同的,不同则会报错;
三:Vector使用方法与前两者相同;差别在于:线程安全的,缺点是效率比较低。
三:set集合;
一:HashSet(没有顺序,集合里元素不能重复(会给每个元素生成一个hashCode值,这样就能保证元素的唯一性),允许有一个null存在);
Set<Integer>set1=new HashSet<>(); set1.add(6); set1.add(7); set1.add(8); set1.add(6); set1.add(null);
输出结果6,7,8,null;因为HashSet具有唯一性,且允许一个null值存在;
Set<Student> set=new HashSet(); set.add(new Student("张三","男")); set.add(new Student("张三","男")); set.add(new Student("李四","女"));
需要注意的是这里是因为已经是一个新的对象了,所以并不重复,还是可以将全部信息都打出来;
这里可以运用这个特殊性对你不想要的重复信息进行一层过滤,就是重写equal和hashCode方法
@Override public boolean equals(Object o) { //这里类型转换是因为他传入的是一个Object类型的数据,所以需要将他转换为我们需要的Teacher类 Teacher teacher=(Teacher)o; //这里使用.equals()方法是因为使用的是包装类而==一般用来比较基础数据类型; //通过this关键字调用当前对象跟传入的teacher类对象进行比较 if(this.teacherId.equals(teacher.teacherId)){ return true; }else{ return false; } } @Override public int hashCode() { return 1; }
二:LinkedHashSet,是由数组+链表实现;
是有序的,会进行从小到大的排序;也是只允许存在一个null值;
三:TreeSet,自定义排序,元素不重复,不允许存在null值;
想要实现TreeSet排序必须得先实现接口,并且重写compareTo方法,
public int compareTo(Object o) { Teacher teacher=(Teacher) o; return this.teacherId<teacher.teacherId?-1:(this.teacherId>teacher.teacherId?1:0); }
如果当前数据小于前一个数据就存储在二叉树的左边,并且返回一个-1,如果当前数据大于之前一个数据的话那就存放在二叉树的右边,并且返回一个1,如果二者相等的话那么就返回一个0;
四:Map(双列集合),有一个key对应一个value;
一:HashMap
会给每一个键分配一个hashcode值,使用put方法存放值时会去比较key值如果相同则会进行一个覆盖操作;
想要赋值得使用put方法进行赋值;
map.put("w",12);
可以使用.keySet方法将key值全部打印出来
Set<String> keys =map.keySet(); for (String key:keys){ System.out.println(key+map.get(key)); }
后面两个开发基本运用不到,只做了解;