课中:
理论课:
- List是有序、可重复的迭代器。
- List借口常用的实现类有3个:ArrayList、LinkedList、Vector。
- List中有很多方法,例如:List.set(2,“xxx”)为在第二个位置替换为xxx;add()中下标要从小到大添加;List.Indexof(“B”)返回第一个B所在的位置,如果B不存在,则返回-1;List.LastIndexof(“B”)返回第一个B所在的位置,如果B不存在,则返回-1
- ArrayList底层是用数组实现的存储。特点:查询效率高,增删效率低,线程不安全。数组长度有限,但ArrayList是可以存放任意数量的对象,长度不受限制。
- Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。比如,indexOf方法就增加了synchronized同步标记。
- 需要线程安全时,用Vector。
- 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。
- 不存在线程安全问题时,增加或删除元素较多用LinkedList。
- Map用put()存放,get()取出。
- Map就是用来存储“键(key)-值(value)对”的。Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。
- Map接口的实现类有HashMap、TreeMap、HashTable、ProPerties等。
实验课:
老师讲了第八次作业的五六七题,这也正是我上周不会写的几个题目。
在第五题里,考核我们的主要是如何去定义一个泛型类和泛型接口,同时老师讲解了如何定义一个泛型方法,在讲这题中,我还知道的:静态方法只能调用静态方法,所以在定义一个泛型方法的时候,我们要加上static,同时泛型最常用的三个字母是E、T、V。
public class Ch8Demo4 {
public static void main(String[] args) {
erson c1 = new erson("cc");
System.out.println(c1);
c1.oge("machuqing");
}
}
class erson<E> implements og<String>{
E name;
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
public erson(E name) {
super();
this.name = name;
}
@Override
public String toString() {
return "erson [name=" + name + "]";
}
@Override
public String oge(String o) {
// TODO Auto-generated method stub
System.out.println(o);
return null;
}
}
interface og<T>{
T oge(T o);
}
第六题里面,老师讲解了选择排序法:找出最小的数,和第一个数比较大小。
package ch8;
import java.util.List;
import java.util.ArrayList;
/*
* 6. 编写程序Ch8Demo5,定义一个泛型方法,方法中实现集合元的排序
* (根据狗的编号排序);定义 一个狗类,属性有狗的编号,在main方法中
* 定义一个狗类容器,调用泛型方法。
*/
public class Ch8Demo5 {
public static <E>void sort(E x){
Dog temp;
// 选择排序
for (int i = 0; i < ((List<Dog>) x).size(); i++) {
int k = i;
for (int j = k + 1; j < ((List<Dog>) x).size(); j++) {
if (((List<Dog>) x).get(j).compareTo(((List<Dog>) x).get(k)) == -1) {
k = j;
}
}
// 交换
if (k != i) {
temp = ((List<Dog>) x).get(i);
((List<Dog>) x).set(i, ((List<Dog>) x).get(k));
((List<Dog>) x).set(k, temp);
}
}
}
public static void main(String[] args) {
List<Dog> m = new ArrayList<Dog>();
m.add(new Dog(1));
m.add(new Dog(3));
m.add(new Dog(2));
m.add(new Dog(5));
m.add(new Dog(7));
System.out.println("排序前:");
System.out.println(m);
sort(m);
System.out.println("排序后:");
System.out.println(m);
}
}
class Dog implements Comparable<Dog>{
int num;
public Dog(int num) {
super();
this.num = num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "狗的号码为:" + num ;
}
@Override
public int compareTo(Dog o) {
if(this.num>o.num){
return 1;
}else if(this.num<o.num){
return -1;
}
// TODO Auto-generated method stub
return 0;
}
}
第七题中我们主要学了Map的存储,同时我知道了HashMap和TreeMap的区别,在我自己写这题的过程中,我也碰到了许多问题,知道了:如果写了TreeMap,那么一定要写Comparable,否则会出错。如果有两个相同的数,那么在比较方法中,要运用equals方法。
package ch8;
import java.util.Map;
import java.util.TreeMap;
/*
* 编写程序Ch8Demo6,定义一个Map接口的集合,存入一些狗和
* 狗的主人,
* 请按狗的年龄顺序输出集合中的狗对象及主人对象。
*/
public class Ch8Demo6 {
public static void main(String[] args) {
Map<Dog,Person> m = new TreeMap<>();//如果写了TreeMap,那么一定要写comparable方法
m.put(new Dog("1花",2),new Person("张三"));//忘记写new,导致- The method Person(String) is undefined for the type Ch8Demo6
m.put(new Dog("2花",4),new Person("李四"));
m.put(new Dog("3花",1),new Person("王麻子"));
m.put(new Dog("4花",4),new Person("陈留"));
m.put(new Dog("5花",3),new Person("刘网"));
System.out.println(m);
}
}
class Dog implements Comparable<Dog>{
String name;
int age;
public Dog(String name, int age) {
super();
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;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
public int compareTo(Dog o) {
// TODO Auto-generated method stub
if(this.age<o.age){
return -1;
}else if(this.age==o.age&& this.name.equals(o.name)){
return 0;
}else if(this.age==o.age&& !this.name.equals(o.name)){
if(this.name.compareTo(o.name)<0){
return -1;
}
}
return 1;
}
}
class Person{
String name;
public Person(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
}
预习:
- 不可变String
- 重载“+”与StringBuilder
- 无意识的递归
- String上的操作
- 格式化输出:printf()、System.out.format()、Formatter转换、String.fotmat()
小结:
这一周我们学习了List和泛型还有Map,我对它们的用法有了更深刻的理解,同时不由得感叹一句,要学习的方法和类有好多。由于上周的准备工作比较充分,在这周的课上我甚至觉得老师说的每一句话我都记在了心里,这种学习很充实的感觉实在是太赞了,所以我在以后的学习中会更加的努力,并且多花出时间来做编程题,在错误中提升自我。期末考试要到了,我打算开始复习和总结前面所学的内容了,争取期末拿个好成绩,而且能够真正学好Java这门课程。