1、数据结构:
常见的数据结构有:栈,队列,链表,数组,树,图,堆。
数组和链表的对比:
2、List的三个子类:
* ArrayList
* 特点:底层数据结构是数组,查询快,增删慢
* 线程不安全,效率高
* Vector
* 特点:底层数据结构是数组,查询快,增删慢
* 线程安全,效率低
* LinkedList
* 特点:底层数据结构是链表,查询慢,增删快
* 线程不安全,效率高。
3、删除同一集合中相同的元素:
1) 需求:我现在用ArrayList存储多个字符串元素。
* 比如说数据如下:
* hello,world,java,hello,.net,java,php,IOS,java,android
* 我要求你写程序,实现去除重复元素。
* 也就是说结果是:
* hello,world,java,.net,php,IOS,android
*
* 思路:
* A:创建一个新的集合。
* B:在同一个集合上操作。
* 在同一个集合上操作:双层循环实现
* 第一方式没有问题,第二种可能有问题。q
* 但是,第二种的问题也是可以解决的?
* 怎么解决呢?
* 把每次删除掉元素的那个位置,在回来比较一次即可。
2) ArrayList如果存储的是学生,怎么去除重复单元
* 问题:如果知道学生是重复的。
* 需求:如果学生的姓名和年龄相同,我就认为是一个学生,即重复的。
这样写是有问题的,编译没有报错,但是不能删除重复元素:
* 简单分析我们估计是判断那里出问题了
* if(!array.contains(s)){
array.add(s);
}
*
* 怎么解决呢?
* 看原码。
* 通过看原码,我们发现底层依赖的是equals方法
* 由于学生类中我们并没有equals方法,所以默认比较的是Object类的方法,而Object方法默认比较的是地址值。
* 又因为留个学生对象都是new出来的,地址值肯定不一样,从这个角度考虑结论都是正确的。
* 但是不符合我们的需求。
* 必须通过重写Student中的equals解决这个问题,让他按照我们的需求来比较。
4、 Vector的特有功能
*
* A:添加功能
* addElement(E obj); ------------add(object obj);
* B:获取功能
* elementAt(int index)-----------get(int index);
* Enumeration<E> elements()------Iterator
* hasMoreElements()-----------hasnext()
* nextElement()---------------next()
* C:长度功能
* size();
5、LinkedList的特有功能
* A:添加功能
* addFirst(E e)
* addLast(E e)
* B:获取功能
* getFirst()
* getLast()
* C:删除功能* removeFirst()
* removeLast()
6、面试题:通过LinkedList模拟栈数据结构
要模拟的内容的特点:
* 先进后出。
* 通过LinkedList模拟数据结构:
* 它的意思是说你有一个LinkedList可以用,但是,需要自己定义一个栈集合。
* 对外提供获取和添加功能
一共需要两个类:一个包含main函数的LinkedListTest类,一个
另外一个是MyStatic类,提供输入输入和长度方法,但是底层是用的LinkedList类。
7、泛型
泛型:任意的类型。是一种特殊的类型,是一种把明确数据类型的工作放在了创建对象或者调用方法时候的类型。
* 泛型的格式:<数据类型>
* 为什么会有泛型。就是为了解决类型转换问题
1)应用背景:
String[] s = new String[3];
s[0] = "hello";
s[1] = "world";
//s[2] = 0;这样就会报错,因为数组定义的时候就告诉是String类型。
但是集合可以存储任意的类型,包括不同类型,所以下面这种存储方式没有问题:
但是,虽然存储的时候没有问题,有可能在取的时候会把它转换成其他类型,比如我们常用的迭代器遍历:
报错:因为在取的时候执行了String s = (String)it.next()这一语句,有了类型转换
解决办法如下:
就是System.out.println(it.next());不管什么类型都当成object类型,但是还是会有黄色警告线,还是有潜在的错误:
怎么解决?
* 数组在定义的时候就会告诉具体是什么类型,如果定义的是String类型,就不能存储int类型。
* 可以模仿数组解决,在定义集合的时候告诉集合你只能存储什么类型的元素。
*
* 怎么告诉,通过泛型
* 泛型的好处:
* A:解决黄色预告线问题
* B:把运行期间的类型转换异常提前到编译期间
* C:优化程序设计
* 泛型在哪些地方用:
* 如果api类或者接口后面有<>,那么就是泛型的体现,它就是要你在使用的时候明确类型的。
* 泛型一般就在集合中使用,其他地方不用。8、增强for循环:
* 格式:
* for(数组或者Collection集合中元素类型 变量名:数组或者Collection对象)
* {
* 使用变量名即可。
* }
*
* 作用:简化数组和Collection集合的变量。
* 注意事项:增强for是用来替代迭代器的,不能再用增强for的时候,用集合对象对集合进行改变。
9、泛型类的应用:
1)泛型类:
接下来我们考虑:能不能不使用方法重载,利用同一个方法输出同一类型的数据。
有:泛型类!!!!
注意:Integer不能改成int,因为泛型只能是引用类型
2)泛型方法:
为了保证方法传递不同的参数,你就在类上明确了类型。
* 这样的话就会有问题?
* A:创建对象不方便,每次创建对象都要明确方法。
* 如果能在调用方法的时候,才去明确类型该有多好呢?
* 泛型方法:把泛型加在方法上。
3)泛型接口:
* 如果一个接口上有泛型,在实现的时候
* A:在实现类写的时候,我已经知道接口上应该是什么类型了。
* B:在创建对象的时候明确类型
在写实现类的时候就确定类型
在创建对象的时候明确类型