- 记录一些自己在学习中认识不够清晰的知识点,方便自己回顾
一、 集合的知识结构图
-
什么时候使用集合?
当我们需要将一些相同结构的个体整合在一起时,就可以考虑使用集合了 。举例:购物车
-
为什么要使用集合?
集合和数组相似点:
都可以存储多个对象,对外作为一个整体存在,是“装其他对象的对象”.数组:优点:线性序列效率高 缺点:长度需要初始化,且固定不变,不灵活。删除和添加效率低下;缺乏封装,操作繁琐。
因为数组的这些缺点,因此引入集合
简单概念解释
• Collection 根接口,表示一组对象
• List 有顺序可重复
ArrayList: 查询效率高,增删效率低,长度不受限实现(扩容)
Linkedlist: 增删效率高,查询效率低
• Set 没有顺序不可重复
• HashSet
• 采用Hashtable哈希表存储结构(神奇的结构)
• 优点:添加速度快 查询速度快 删除速度快
• 缺点:无序
• LinkedHashSet
• 采用哈希表存储结构,同时使用链表维护次序
• 有序(添加顺序)
• TreeSet
• 采用二叉树(红黑树)的存储结构
• 优点:有序 查询速度比List快(按照内容查询)
• 缺点:查询速度没有HashSet快
• Map 存储一组键值对象,key和value
HashMap:底层数据结构:数组加链表,键不能重复,如果重复则新的覆盖旧的
TreeMap:排序时使用
• Key 唯一 无序
• value 不唯一 无序
二、泛型(转自csdn 作者 我不是大王强)
// 泛型:就是一种不确定的数据类型。
// 比如:ArrayList E就是泛型。 这种不确定的数据类型需要在使用这个类的时候才能够确定出来。
// 泛型可以省略,如果省略,默认泛型是Object类型。
// 泛型的好处:
-
- 省略了强转的代码。
-
- 可以把运行时的问题提前到编译时期。
public class Demo01Generic {
public static void main(String[] args) {
//创建集合不给出泛型
ArrayList list = new ArrayList();
list.add("hello");
list.add("java");
list.add("world");
//遍历集合
for (Object obj : list) System.out.println(obj);
//进行遍历,打印出每个字符串长度
for (Object obj : list) {
String str = (String) obj;/*此处练习了向下转型*/
System.out.println(str.length());
}
//创建集合给出泛型
ArrayList<String> list2 = new ArrayList<>();
//添加元素
list2.add("helloo");
list2.add("helo");
list2.add("world");
//list2.add(100);编译的时候就会报错,如果没有给出泛型,则不会报错
//使用增强for遍历集合
for (String str2 : list2
) {
System.out.println(str2);
}
}
}
三、构造器(一种特殊的方法)
// 用于对象的初始化
// 需要注意
- 构造器的方法名必须和类名一致!
- 构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类),不能在构造器里调用 return。
- 通过new关键字调用!!
- 如果我们没有定义构造器,则系统会自动定义一个无参的构造方法。如果已定义则编译器不会 添加无参数构造方法!
- 与普通方法一样,构造方法也可以重载
class Point{
double x,y;
//构造方法名称必须和类名保持一致
public Point(double _x,double _y) {
x=_x;
y=_y;
}
public double getDistance(Point p) {
return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
}
}
public class Constructor {
public static void main(String[] args) {
Point p=new Point(3.0,4.0); //new关键字调用
Point origin=new Point(0.0,0.0);
System.out.println(p.getDistance(origin));
}
}
四、Static关键字
-
修饰成员变量和方法,从属于类
-
普通变量和方法从属于对象
-
静态方法不能使用非静态方法
-
非静态方法可以使用静态
public class TestStatic
{
int a;
static int width; //修饰成员变量,从属于类
static void gg(){ //修饰方法
//tt(); //报错静态方法不能使用非静态方法
System.out.println("gg");
}
void tt(){ //从属于对象
gg(); // 可以使用静态方法
System.out.println("tt");
}
public static void main(String[] args){
TestStatic hi = new TestStatic();
TestStatic.width = 2;
// TestStatic.gg(); //gg();
// hi.gg(); //通过引用也可以访问static变量或static方法。不过,一般还 是使用类名.static成员名来访问。
// gg();
hi.tt(); //用对象引用,因为从属于对象
}
}
五、this关键字
- 本质:创建好对象的地址
this的作用:
• this表示的是当前对象本身,
• 更准确地说,this代表当前对象的一个引用。
普通方法中使用this
• 区分类成员属性和方法的形参.
• 调用当前对象的其他方法(可以省略)
• 位置:任意
构造方法中使用this
• 使用this来调用其它构造方法
• 位置:必须是第一条语句
• this不能用于static方法。(底层在堆里的对象中,而静态方法在方法区)
public class TeatThis {
int a,b,c;
TeatThis(int a,int b){
this.a=a; //区分类成员属性和方法的形参
this.b=b;
}
TeatThis(int a,int b,int c){
this(a,b); //调用其它构造方法 ,必须是第一条语句
this.c=c;
}
void sing() {
}
void eat() {
this.sing();//调用本类中的sing()即调用当前对象的其他方法
System.out.println("你妈妈喊你回家吃饭");
}
public static void main(String[] args) {
TeatThis hi= new TeatThis(2,3);
hi.eat();
}
}
再次强调
• This代表当前对象自身的引用(必须new)
• This可以修饰属性,区别成员变量和局部变量
• This修饰方法
• This修饰构造方法(必须是第一条语句)
六、知识点的小问题记录
-
Object类是所有Java类的根基类
-
如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
public class Person { ... } public class Person extends Object { ... }
-
B b = new B(); // 则既声明了类型为B的引用,又创建了B的实例(对象),并且将b引用了B的实例(对象)。
-
创建对象的步骤
• 分配对象空间,并将对象的成员变量初始化为0或空 • 执行属性值的显式初始化 • 执行构造方法 • 返回对象的地址给相关变量
END