P547集合家庭作业1
public class Collection {
public static void main(String[] args) {
News news1 = new News("1234567890123450000000000000");
News news2 = new News("2234567890123450000000000000");
ArrayList aList = new ArrayList();
aList.add(news1);
aList.add(news2);
List list1 = new ArrayList();
for (int i = aList.size()-1; i >=0 ; i--) {
News newss=(News) aList.get(i);
System.out.println(processTitle(newss.getTitle()));
}
}
public static String processTitle(String title){
if(title==null){
return "";
}
if(title.length()>15){
return title.substring(0,15)+"......";
}else {
return title;
}
}
}
class News{
private String title;
private String tell;
public News(String title) {
this.title = title;
}
@Override
public String toString() {
return "News{" +
"title='" + title + '\'' +
'}';
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTell() {
return tell;
}
public void setTell(String tell) {
this.tell = tell;
}
}
public class Collections2 {
public static void main(String[] args) {
Car car1 = new Car("BM", 40000);
Car car2 = new Car("BL", 50000);
ArrayList at1 = new ArrayList();
ArrayList at2 = new ArrayList();
at1.add(car1);
at1.add(car2);
at2.addAll(at1);
System.out.println(at1.remove(1));//Car{name='BL', price=50000.0}
System.out.println(at1.contains("BM"));//false
System.out.println(at1.size());//输出1
System.out.println(at1.isEmpty());//输出false
System.out.println(at1.containsAll(at1));//true
System.out.println(at1.removeAll(at1));//true
System.out.println(at1);
System.out.println(at2);
//迭代
Iterator iterator = at2.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
for (Object o :at2) {
Car car=(Car) o;
System.out.println(car);
}
}
}
class Car{
private String name;
private double price;
public Car(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
P549作业3
public class Collections3 {
public static void main(String[] args) {
Map m = new HashMap();
m.put("jack",650);
m.put("tom",1200);
m.put("simith",2900);
m.put("jack",2600);
//另一种方法
//m.put(key,(Interger)m.get(key)+100);
for (Object entry :m.entrySet()) {
Map.Entry s= (Map.Entry) entry;
s.setValue((int)s.getValue()+100);
//强转
System.out.println(s.getValue());
System.out.println(s.getKey());
System.out.println(s);
}
}
}
set.remove(p1)//不一定删除成功,因为根据1001,CC此时索引变化不是1001,AA的索引位置
set.add(10001,CC)可加,而ste(10001,AA)会加在原本set(1000,ccc)后面
最后输出4对象
P553泛型的引入
P554java泛型入门
public static void main(String[] args) {
//1. 当我们ArrayList<Dog> 表示存放到ArrayList 集合中的元素是Dog 类型(细节后面说...)
//2. 如果编译器发现添加的类型,不满足要求,就会报错
//3. 在遍历的时候,可以直接取出Dog 类型而不是Object
//4. public class ArrayList<E> {} E 称为泛型,那么Dog->E
ArrayList<Dog> arrayList = new ArrayList<Dog>();
arrayList.add(new Dog("11",1));
arrayList.add(new Dog("12",2));
arrayList.add(new Dog("13",3));
//arrayList.add(new Cat("zcm",8));会报错
for (Dog dog :arrayList) {
System.out.println(dog.getName()+dog.getAge());
}
}
P555
public class Generic01 {
public static void main(String[] args) {
Person<String> person = new Person<String>("yue");
Person<Integer> Person2 = new Person<Integer>(100);
//注意,特别强调: E 具体的数据类型在定义Person 对象的时候指定,
// 即在编译期间,就确定E 是什么类型
person.show();//输出class java.lang.String
Person2.show();//输出class java.lang.Integer
}
}
//泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,
// 或者是某个方法的返回值的类型,或者是参数类型
class Person<E>{
//E 表示s 的数据类型, 该数据类型在定义Person 对象的时候指定,即在编译期间,就确定E 是什么类型
E s;
public Person(E s) {
this.s = s;
}
public E f(){
return s;
}
public void show(){
System.out.println(s.getClass());
//显示s的运行类型
}
}
P556泛型的应用实例
public class GenericExercise02 {
public static void main(String[] args) {
HashSet <Student> sset = new HashSet<Student>();
sset.add(new Student("y1",1));
sset.add(new Student("y2",2));
sset.add(new Student("y3",3));
System.out.println(sset);
for (Student o :sset) {
System.out.println(o);
}
/*
Iterator<Student> iterator = sset.iterator();
while (iterator.hasNext()) {
Student next = iterator.next();
System.out.println(next);
}
*/
HashMap<String, Student> sp = new HashMap<>();
sp.put("y1",new Student("y1",1));
sp.put("y2",new Student("y2",1));
sp.put("y3",new Student("y3",1));
System.out.println(sp);
//sp-key同 ,value同只有一个,key不同,value不同替换
for (String o :sp.keySet()) {
System.out.println(sp.get(o));
}
//迭代器
Set<Map.Entry<String, Student>> entries = sp.entrySet();
//源码
//public Set<Map.Entry<K,V>> entrySet() {
// Set<Map.Entry<K,V>> es;
// return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
// }
Iterator<Map.Entry<String, Student>> iterator = entries.iterator();
/*
public final Iterator<Map.Entry<K,V>> iterator() {
return new EntryIterator();
}
*/
while (iterator.hasNext()) {
Map.Entry<String, Student> next = iterator.next();
System.out.println(next.getValue());
}
}
}
class Student{
public String name;
public int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
P557泛型使用细节1
public class GenericDetial {
public static void main(String[] args) {
//1.给泛型指向数据类型是,要求是引用类型,不能是基本数据类型
List<Integer> list = new ArrayList<Integer>(); //OK
//List<int> list2 = new ArrayList<int>();//错误
//2. 说明
//因为E 指定了A 类型, 构造器传入了new A()
//在给泛型指定具体类型后,可以传入该类型或者其子类类型
Pig<A> aPig = new Pig<A>(new A());
aPig.f();
Pig<A> aPig2 = new Pig<A>(new B());
aPig2.f();
//3. 泛型的使用形式
ArrayList<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
//在实际开发中,我们往往简写
//编译器会进行类型推断, 老师推荐使用下面写法
ArrayList<Integer> list3 = new ArrayList<>();
List<Integer> list4 = new ArrayList<>();
ArrayList<Pig> pigs = new ArrayList<>();
//4. 如果是这样写泛型默认是Object
ArrayList arrayList = new ArrayList();
//等价ArrayList<Object> arrayList = new ArrayList<Object>();
/*
public boolean add(Object e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
*/
Tiger tiger = new Tiger();
/*
class Tiger {//类
Object e;
public Tiger() {}
public Tiger(Object e) {
this.e = e;
}
}
}
}
*/
}
}
class Tiger<E> {//类
E e;
public Tiger() {}
public Tiger(E e) {
this.e = e;
}
}
class A {}
class B extends A {}
class Pig<E> {//
E e;
public Pig(E e) {
this.e = e;
}
public void f() {
System.out.println(e.getClass()); //运行类型
}
}
P559泛型练习
public class GenericDetial {
public static void main(String[] args) {
ArrayList<Em> at = new ArrayList<>();
Em y1 = new Em("y1", 11, new MyDate(1, 1, 1));
Em y2 = new Em("y2", 11, new MyDate(2, 3, 4));
Em y11 = new Em("y1", 11, new MyDate(1, 1, 2));
at.add(y1);
at.add(y2);
at.add(y11);
System.out.println(at);
//排序
at.sort(new Comparator<Em>() {
@Override
public int compare(Em o1, Em o2) {
if (!(o1 instanceof Em && o2 instanceof Em)){
System.out.println("类型不正确");
return 0;
}
if (o1.getName() != o2.getName()){
return o1.getName().compareTo(o2.getName());
}else {
if (o1.getBitrhdy().getYear() != o2.getBitrhdy().getYear()){
return o1.getBitrhdy().getYear() - o2.getBitrhdy().getYear();
}else {
if (o1.getBitrhdy().getMonth() != o2.getBitrhdy().getMonth()) {
return o1.getBitrhdy().getMonth() - o2.getBitrhdy().getMonth();
}else {
if (o1.getBitrhdy().getDay() != o2.getBitrhdy().getDay()){
return o1.getBitrhdy().getDay() - o2.getBitrhdy().getDay();
}else {
return 0;
}
}
}
}
}
});
//以下是老师的方法。比我的好用
at.sort(new Comparator<Em>() {
@Override
public int compare(Em o1, Em o2) {
int i=o1.getName().compareTo(o2.getName());
if(i !=0){
return i;
}
int yearMinus=o1.getBitrhdy().getYear()-o2.getBitrhdy().getYear();
if(yearMinus !=0){
return yearMinus;
}
int monthMinus=o1.getBitrhdy().getMonth() - o2.getBitrhdy().getMonth();
if( monthMinus !=0){
return monthMinus;
}
int dayMinus=o1.getBitrhdy().getDay() - o2.getBitrhdy().getDay();
if (dayMinus !=0){
return dayMinus;
}
return 0;
}
});
System.out.println(at);
}
}
class Em{
private String name;
private double sal;
private MyDate bitrhdy;
public Em(String name, double sal, MyDate bitrhdy) {
this.name = name;
this.sal = sal;
this.bitrhdy = bitrhdy;
}
@Override
public String toString() {
return "Em{" +
"name='" + name + '\'' +
", sal=" + sal +
", bitrhdy=" + bitrhdy +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public MyDate getBitrhdy() {
return bitrhdy;
}
public void setBitrhdy(MyDate bitrhdy) {
this.bitrhdy = bitrhdy;
}
}
class MyDate{
private int year;
private int month;
private int day;
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
@Override
public String toString() {
return "MyDate{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
}
P560自定义泛型
public class CustomGeneric {
public static void main(String[] args) {
}
}
//1. Tiger 后面泛型,所以我们把Tiger 就称为自定义泛型类
//2, T, R, M 泛型的标识符, 一般是单个大写字母
//3. 泛型标识符可以有多个.
//4. 普通成员可以使用泛型(属性、方法)
//5. 使用泛型的数组,不能初始化
//6. 静态方法中不能使用类的泛型
class Tiger<T, R, M> {
String name;
R r; //属性使用到泛型
M m;
T t;
//5. T[] ts=new T[9];//不允许
//Type parameter 'T' cannot be instantiated directly
因为数组在new 不能确定T 的类型,就无法在内存开空间
T[]ts;//可以
/*
6.public static void f1(M m){//不可以
//因为静态是和类相关的,在类加载时,对象还没有创建
//所以,如果静态方法和静态属性使用了泛型,JVM 就无法完成初始化
}
*/
public Tiger(String name, R r, M m, T t) {
this.name = name;
this.r = r;
this.m = m;
this.t = t;
}
//方法使用泛型
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public R getR() {
return r;
}
public void setR(R r) {
this.r = r;
}
public M getM() {
return m;
}
public void setM(M m) {
this.m = m;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
p561自定义泛型接口
public class GenericInterface {
public static void main(String[] args) {
}
}
/**
* 泛型接口使用的说明
* 1. 接口中,静态成员也不能使用泛型
* 2. 泛型接口的类型, 在继承接口或者实现接口时确定
* 3. 没有指定类型,默认为Object
*/
class CC implements IUsb<Object,Object>{//这样规范,不写也可以通过
@Override
public Object get(Object o) {
return null;
}
@Override
public void hi(Object o) {
}
@Override
public void run(Object r1, Object r2, Object u1, Object u2) {
}
}
//实现接口,
// 实现接口时,直接指定泛型接口的类型
给U 指定Integer 给R 指定了Float
所以,当我们实现IUsb 方法时,会使用Integer 替换U, 使用Float 替换R
class BB implements IUsb<Integer,Float>{
@Override
public Float get(Integer integer) {
return null;
}
@Override
public void hi(Float aFloat) {
}
@Override
public void run(Float r1, Float r2, Integer u1, Integer u2) {
}
}
//2.在继承接口指定泛型接口的类型
interface IA extends IUsb<String, Double> { }
class AA implements IA{
//此时AA必须实现IA、IU的抽象方法
//当我们去实现IA 接口时,因为IA 在继承IUsu 接口时,指定了U 为String R 为Double
//,在实现IUsu 接口的方法时,使用String 替换U, 是Double 替换R
@Override
public Double get(String s) {
return null;
}
@Override
public void hi(Double aDouble) {
}
@Override
public void run(Double r1, Double r2, String u1, String u2) {
}
}
interface IUsb<U, R> {
int n = 10;
//1.U name; 不能这样使用//接口中的属性都是静态的
//普通方法中,可以使用接口泛型
R get(U u);
void hi(R r);
void run(R r1, R r2, U u1, U u2);
//在jdk8 中,可以在接口中,使用默认方法, 也是可以使用泛型
default R method(U u) {
return null;
}
}
P562自定义泛型方法
public class GenericMehod {
public static void main(String[] args) {
Cat cat = new Cat();
cat.fly("BWM",3);当调用方法时,传入参数,编译器,就会确定类型
cat.fly(111.1,111.1);
//测试
Fish<String, ArrayList> sh = new Fish<>();
sh.hello(new ArrayList(),1.1f);
//class java.util.ArrayList
//class java.lang.Float
}
}
class Cat{
public void run(){
}
public<T,R> void fly(T t,R r){//泛型方法说明泛型方法
//1. <T,R> 就是泛型//2. 是提供给fly 使用的
System.out.println(t.getClass());
}
}
class Fish<T ,R>{//泛型类。
public void Run(){
}
public <M,U> void eat(M m,U U){//泛型方法
}
public void hi(T t){//不是泛型方法,而是使用了类声明的方法
}
//注意:泛型方法,可以使用类声明的泛型,也可以使用自己声明泛型
public <K> void hello(R r,K k){
System.out.println(r.getClass());
System.out.println(k.getClass());
}
}
P563
Integer,Dog
P564泛型继承和通配符
public class GenericExtend {
public static void main(String[] args) {
Object o=new String();//ok
//泛型没有继承性//List<Object> list = new ArrayList<String>();//no
//举例说明下面三个方法的使用
List<Object> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
List<AA1> list3 = new ArrayList<>();
List<BB1> list4 = new ArrayList<>();
List<CC1> list5 = new ArrayList<>();
//如果是List<?> c ,可以接受任意的泛型类型
printCollection1(list1);
printCollection1(list5);
//List<? extends AA> c: 表示上限,可以接受AA 或者AA 子类
// printCollection2(list1);//×
// printCollection2(list2);//×
printCollection2(list3);//√
printCollection2(list4);//√
printCollection2(list5);//√
//List<? super AA> c: 支持AA 类以及AA 类的父类,不限于直接父类
printCollection3(list1);//√
//printCollection3(list2);//×
printCollection3(list3);//√
//printCollection3(list4);//×
//printCollection3(list5);//×
}
// ? extends AA 表示上限,可以接受AA 或者AA 子类
public static void printCollection2(List<? extends AA1> c) {
for (Object object : c) {
System.out.println(object);
}
}
//说明: List<?> 表示任意的泛型类型都可以接受
public static void printCollection1(List<?> c) {
for (Object object : c) { // 通配符,取出时,就是Object
System.out.println(object);
}
}
// ? super 子类类名AA:支持AA 类以及AA 类的父类,不限于直接父类,
//规定了泛型的下限
public static void printCollection3(List<? super AA1> c) {
for (Object object : c) {
System.out.println(object);
}
}
}
class AA1 {
}
class BB1 extends AA1 {
}
class CC1 extends BB1 {
}
P565泛型作业
package junit; import org.junit.jupiter.api.Test; public class Junit { public static void main(String[] args) { //传统 //new Junit().m1(); } @Test public void m1(){ System.out.println("m1方法调用"); } @Test public void m2(){ System.out.println("m2方法调用"); } }
使用maven
使用@Test
package Generic;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GeneticHomwok01 {
public static void main(String[] args) {
}
@Test
public void test(){
DAO<User> dog = new DAO<>();
dog.save("s2",new User(2,22,"s22"));
dog.save("s1",new User(1,11,"s11"));
dog.save("s3",new User(3,33,"s33"));
List<User> list = dog.list();
System.out.println(list);
//输出[User{id=3, age=33, name='s33'}, User{id=1, age=11, name='s11'},
// User{id=2, age=22, name='s22'}]
dog.update("s3",new User(3,58,"ml"));
list = dog.list();
System.out.println(list);
//输出[User{id=3, age=58, name='ml'}, User{id=1, age=11, name='s11'},
// User{id=2, age=22, name='s22'}]
dog.delete("s3");
list = dog.list();
System.out.println(list);
//输出[User{id=1, age=11, name='s11'}, User{id=2, age=22, name='s22'}]
System.out.println(dog.get("s1"));
//输出User{id=1, age=11, name='s11'}
}
}
class DAO<T>{
private Map<String,T> map=new HashMap<>();
public Map<String, T> getMap() {
return map;
}
public void save(String id, T entity){
map.put(id,entity);
}
public T get(String id){
return map.get(id);
}
public void update(String id,T entity){
map.put(id,entity);
}
//遍历map[k-v]将map的所有values(entry)分装到arraylist返回即可
public List<T> list(){
List <T>arrayList = new ArrayList();
// arrayList.add(map.values());
for (T o : map.values()) {
arrayList.add(o);
}
return arrayList;
}
public void delete(String id){
map.remove(id);
}
@Override
public String toString() {
return "DAO{" +
"map=" + map +
'}';
}
}
class User{
private int id;
private int age;
private String name;
public User(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}