Java Day34

第五周总结
目录
接口指定规范,完成数据展示过滤功能 2
一 需要一个接口,指定规范 3
二 写出接口的实现类,类内写出具体的条件判断(只需要更改这个判断条件,即可更改最后过滤剩下的对象内容)(游戏机的卡换换了即可换游戏) 3
三StudentManager类中写出过滤方法,接口名StudentFilter,传入的参数为接口的实现类对象(StudentFilter filter) 3
提高StudentManager复用度。不管更换什么数据类型, 都是可以直接使用。 4
数据的字符串处理 5
一 程序数据转化为字符串 5
二 字符串转化为数据 5
集合 6
集合架构 interface Collection Java中所有集合的总接口 7
一 interface List List接口,数据存储可重复,添加和保存顺序一致 内含增删改查等常用方法 9
1 class ArrayList 重点 底层为可变长数组 9
2 class LinkedList 重点 底层存储数据是双向链表结构 10
3 class Vector 线程安全的可变长数组 11
二 interface Set Set接口,数据存储不可重复,添加顺序和存储顺序不一致 11
1 HashSet 底层存储数据的结构是一个哈希表,存储效率,查询效率极高! 11
2 TreeSet 底层存储数据的结构是一个平衡二叉树结构,要求数据必须有比较方式!(使用Comparator接口比较没有比较方式的类) 12
迭代器操作集合 13
获取迭代器方法: 13
迭代器操作使用到的方法 13
两种操作方式的冲突 14
内存地址和cpu的关系 15

接口指定规范,完成数据展示过滤功能
接口指定规范,完成数据展示过滤功能
例如:
只要学生成绩50分以上
只要学生年龄16岁以下…

一 需要一个接口,指定规范
二 写出接口的实现类,类内写出具体的条件判断(只需要更改这个判断条件,即可更改最后过滤剩下的对象内容)(游戏机的卡换换了即可换游戏)
(eg 分数低于60,年龄大于16,只要更改实现类中的比较内容,即可更改最后过滤之后得到的符合条件的学生,StudentManager中的过滤方法内容不用更改,即可提高复用度)
三StudentManager类中写出过滤方法,接口名StudentFilter,传入的参数为接口的实现类对象(StudentFilter filter)
public interface StudentFilter {
* 条件判断由接口实现类完成
* @param student Student类对象
想比较学生年龄,比较的本质是学生类对象,所以参数为两个学生
boolean accept(Student student);
}
public class StudentFilterImpl implements StudentFilter {
@Override
public boolean accept(Student student) {
return student.getAge() > 16;}
StudentManage类中的过滤方法
* 展示学生信息,但是要求学生信息必须满足过滤器要求
* @param filter StudentFilter过滤器接口,这里要求传入的是 StudentFilter接口实现类对象
public void filterStudentInfo(StudentFilter filter) {
for (int i = 0; i < size; i++) {
// 调用接口中的accept方法,约束展示的内容,实际执行该方法的是,StudentFilter实现类对象
if (filter.accept(allStus[i])) {
System.out.println(allStus[i]);
}
}
}
提高StudentManager复用度。不管更换什么数据类型, 都是可以直接使用。
自定义数据存储工具MyList 用于存储代码中操作的数据 使用泛型满足多种情况
public class MyList{加入增删改查等等方法}

数据的字符串处理
一 程序数据转化为字符串
eg 保存数据
11 骚磊 166 男 60 ==> 11,骚磊,166,男,60 ==> String
public String getStudentData() {
return id + “,” + name + “,” + age + “,” + gender + “,” + score;
}
二 字符串转化为数据
public static Student parseStudent(String str) {
// “11,骚磊,166,男,60”

// 1. split 按照逗号分隔                                
String[] split = str.split(",");                  
                                                  
// {"11","骚磊","166","男","60"}                     
// Integer.parseInt(String str) 字符串 ==> int类型数据   
int id = Integer.parseInt(split[0]);              
String name = split[1];                           
int age = Integer.parseInt(split[2]);             
char gender = split[3].charAt(0);                 
int score = Integer.parseInt(split[4]);           
                                                  
/*                                                
Float.parseFloat(s)                               
Double.parseDouble(s)                             
Boolean.parseBoolean(s)                           
*/                                                
                                                  
return new Student(id, name, age, gender, score); 

}
集合
1复用性好,集合创建采用了泛型模式,可以用户指定任意类型操作!!!既满足普适性,又满足数据类型一致化要求
2. 空间在合理范围以内自行扩展,不需要考虑容量问题
3. 方法很多!操作性很好
集合架构 interface Collection Java中所有集合的总接口
增:
boolean add(E e)
添加当前集合约束的指定数据类型到当前集合中

boolean addAll(Collection<? extends E> c);
	添加另一个集合到当前集合中,要求添加集合中保存的元素必须是当前集合中保存
	元素本身或者其子类对象 【泛型的上限】
	class Dog extends Animal
	class Cat extends Animal
	class Tiger extends Animal

删:
boolean remove(Object obj);
删除集合中的指定元素,删除成功返回true,未找到指定元素,无法删除返回
false,并且在多个元素的情况下,删除找到的第一个元素。

boolean removeAll(Collection<?> c);
	在当前集合中删除两个集合的交集
	
boolean retainAll(Collection<?> c);
	在当前集合中保留两个集合的交集
	
void clear();
	清空整个集合中的所有元素

查:
int size();
有效元素个数

boolean isEmpty();
	判断当前集合是否为空,是否存在有效元素

boolean contains(Object obj);
	判断指定元素是否在当前集合中存在

boolean containsAll(Collection<?> c);
	判断传入的参数集合是不是当前集合的子集合

Object[] toArray();
	返回集合中所有保存元素的Object类型数组

泛型通配符
boolean removeAll(Collection<?> c);
在当前集合中删除两个集合的交集

boolean retainAll(Collection<?> c);
	在当前集合中保留两个集合的交集

boolean containsAll(Collection<?> c);
	判断传入的参数集合是不是当前集合的子集合

一 interface List List接口,数据存储可重复,添加和保存顺序一致 内含增删改查等常用方法
1 class ArrayList 重点 底层为可变长数组
使用的方法都是list接口中的方法 有两个需要了解的成员方法:
ensureCapacity();
判断方法,用于确定当前底层数组的容量是否满足当前操作的需求。
trimToSize();
节省空间,将底层数组的容量缩容至有效元素个数
① 增删慢 都涉及指定位置之后的元素整体移动 扩容时grow涉及数组数据拷贝
② 查询快 ArrayList底层是一个数组结构,在查询操作的过程中,是按照数组+下标的方式来操作对应的元素,可以直接获取对应的空间首地址,CPU访问效率极高。
2 class LinkedList 重点 底层存储数据是双向链表结构
底层存储数据是双向链表结构 类似自行车链子 环环相扣 替换拆除十分方便(图例)
① 增删快 只要把要添加元素的地址 链接在添加位置前后两个元素之间 即可 ,不涉及其他任何扩容 移动问题
② 查询慢 在遍历查询过程中 不断的通过当前节点获取下一个节点的地址 知道找到位置(一个节点只链接了他的前后两个节点,别的节点不认识他)
使用的方法都是从List接口实现而来的方法,需要了解的是LinkedList特有方法:
boolean addFirst(E e);
在当前链表开始位置加元素
boolean addLast(E e);
在当前链表末尾添加元素
E getFirst();
获取第一个Node节点元素数据
E getLast();
获取末尾Node节点元素数据
E removeFirst();2
删除头节点
E removeLast();
删除末尾节点
3 class Vector 线程安全的可变长数组
二 interface Set Set接口,数据存储不可重复,添加顺序和存储顺序不一致
1 HashSet 底层存储数据的结构是一个哈希表,存储效率,查询效率极高!
HashSet底层存储数据的结构是一个哈希表是一个表结构,我们可以认为是Excel表格,存在坐标关系 ,每一个单元格坐标唯一。
在存储元素时 会调用对应的hashCode方法得到元素的哈希值,根据哈希值通过(移位运算)计算元素在哈希表中的存储位置
如果哈希值一致 那么保存的元素位置是一致的 此时会调用equals方法比较对象,相同就无法添加(不同可以添加但是尽量避免这种情况)
2 TreeSet 底层存储数据的结构是一个平衡二叉树结构,要求数据必须有比较方式!(使用Comparator接口比较没有比较方式的类)
自定义类需要比较方式 也可以使用Comparator接口替换项目中自定义比较器接口

存放的元素必须存在自然顺序(比如数字 字符等等)或者比较方式
Eg 存放不了person类,因为没有person类比较方式和自然顺序,此时需要两种方式
①(推荐) 遵从Comparator接口 实现compare方法 这里完成的是一个针对Person类型的比较器,并不是存在与Person类内Comparator Java中提供的比较器接口
public class Demo1 implements Comparator{
@Override
public int compare(Person o1, Person o2) {
自定义比较方式,返回值是int类即可 eg
return o1.getAge() - o2.getAge();
}}
② 遵从 Comapraable接口
public class Demo1 implements Comparable{
@Override
public int compareTo(Demo2 o) {
// TODO Auto-generated method stub
return 0;
}
}

迭代器操作集合
迭代器是操作集合中元素的第二种方式,后期可以延展使用到很多地方,并且存在一个升级版内容。【增强for循环】。
获取迭代器方法:
Iterator iterator();
获取迭代器对象,泛型对应的具体数据类型和集合中约束的泛型具体数据类型
一致。
迭代器操作使用到的方法:
boolean hasNext();
判断当前集合中是否可以继续得到元素,继续遍历。
E next();
1. 获取迭代器当前指向的元素
2. 将迭代器指向下一个元素
void remove();
删除通过next方法获取到元素
【注意事项】
1. remove方法只能删除next方法获取到元素
2. remove方法只能在next方法之后执行,且不能跨过一个next执行
3. 没有next不能使用remove
两种操作方式的冲突
对于集合在内存中占用的空间而言,操作方式有两种
1. 集合对应的引用数据类型变量可以操作对应空间
2. 迭代器可以操作对应的空间
对于以上二者 【集合在内存中占用的空间】是二者共享资源
获取迭代器之后 得到的迭代器对象会依据,当前集合中的所有元素进行一个规划操作。
此时 通过集合对象本身删除某个元素,对于迭代器而言,一脸懵逼,原本的规划没有了!并且集合没有告知迭代器数据发生了改变,迭代器继续按照原本的规划路径操作,保存!两者就会冲突

内存地址和cpu的关系
地址具有唯一性 代码实际运行时 CPU就是根据内存地址,可以直达内存所在区域,执行对应代码。精准而优雅,速度非常快!!
eg
Int类型数组每一个相邻元素地址相差值为4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值