瞎整理

数组
Java语言避免直接访问对内存中的数据可以保证程序更加健壮,如果程序直接访问并修改堆内存中数据,可能破坏内存中的数据完整性,从而导致程序Crash

当通过引用变量来访问实例属性,或者调用非静态方法时,如果该引用变量还未引用一个有效的对象,程序就会引发NullPointerException

引用变量本质上只是一个指针,只要程序通过引用变量访问属性,或者通过调用变量来调用方法,该引用变量将会由他所引用的对象代替

对于java程序中所有引用变量,他们都不需要经过所谓的初始化操作,需要进行初始化操的是该引用变量所引用的对象

对象与内存控制
不断分配内存使得系统中可用内存减少,从而降低程序运行性能;
大量已分配内存的回收使得垃圾回收的负担加重,降低程序的运行性能。

实例变量和类变量

局部变量三部分
形参:在方法签名中定义的局部变量,有方法调用者负责为其赋值,随方法的结束而消亡
方法内部的局部变量:在方法内定义的局部变量,必须在方法内对其进行显示初始化。这种类型的局部变量从初始化完成后开始生效,随方法结束而消亡。
代码块内的局部变量:在代码块内定义的局布变量,必须在代码快内对其进行显示初始化。这种类型的局部变量从初始化完成后开始生效,随代码块的结束而消亡。

局部变量的作用时间很短暂,它们都被存储在方法的栈内存中
类体内定义的变量被称为成员变量(英文Filed)。如果定义该成员变量时没有使用static修饰,该成员变量又被称为非静态变量或实例变量;如果使用static修饰,则该成员变量又可被称为静态变量或类变量。

从java程序的角度来看:static的作用是将实例成员变为类成员,static 只能修饰在类里定义的成员部分,包括成员变量,方法,内部类,初始化块,内部枚举类。如果没有使用staic修饰这些类里的成员,这里成员属于该类的实例;如果使用了static修饰,这些成员就属于类本身。从这个意义上看,static只能修饰类里的成员,不能修饰外部类,不能修饰局布变量,局部内部类。

在同一个jvm内,每个类只对应一个Class对象,但每个类可以创建多个java对象。
由于同一个jvm内每个类只对应一个Class对象,因此同一个jvm内的一个类的类成员变量只需要一块内存空间;但对于实例变量而言,该类没创建一次实例,就需要为实例变量分配一块内存空间。也就是说,该程序中有几个实例,实例变量就需要几块内存空间。

通俗点讲,==是看看左右是不是一个东西。equals是看看左右是不是长得一样。
如何记住嘛。如果单纯是想记住,
==:等于。
equals:相同。
两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个人。你只要记住equals,==就不用记了。

楼主你感受一下。

术语来讲的区别:
1.==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较
equals()是对字符串的内容进行比较
3.==指引用是否相同
equals()指的是值是否相同

publicclass Test {

publicstaticvoid main(String[] args) {
    HttpServlet ht = new MyServlet();
    ht.service();
}

}

publicclass MyServlet extends HttpServlet {

publicvoid doGet(){
    System.out.println("MyServlet.doGet()");
}

}
publicclass HttpServlet {

publicvoid service(){
    System.out.println("HttpServlet.service()");
    doGet();
}

publicvoid doGet(){
    System.out.println("HttpServlet.doGet()");
}

}

运行结果:HttpServlet.service()
MyServlet.doGet()(子类的doGet方法)
//父类引用指向子类对象 //讲方法的设计和方法的实现分离
//有抽象方法的类智能定义抽象类
//抽象类不能被实例化,既不能使用new来实例化对象
//抽象类可以包含属性,方法,构造方法,但是构造方法不能用 来new实例,只能用来被子类调用
//抽象类只能用来被继承
//抽象方法必须被子类实现

作者:涂鸦
链接:https://www.zhihu.com/question/26872848/answer/34357265
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:涂鸦
链接:https://www.zhihu.com/question/26872848/answer/34357265
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1.如果比较对象是值变量:只用==,equals()是不存在的。
为毛?通俗点讲呢,equals()是个函数啊亲,因为基本类型int float不是对象,根本就没有函数啊摔。再通俗点,int. equals(),这个写法你感受一下。。
2.如果比较对象是引用型变量:就是我上面说的那个情况了。我觉得题主就是问这个的。
==:比较两个引用是不是指向同一个对象实例。
啥,你问我上面那句话啥意思,这说来话长了诶,来坐坐坐,咱从堆栈开始讲起~(自行百度吧亲,实在写不动了,改天补充吧。)
equals:
那啥,所有的对象都是继承自Object这个大家都知道吧。然后equals()就是这里面的一个函数,然后那啥,
Object里的equals的实现就是直接调用了==操作。
所以如果这个时候你自定义了一个类,仅仅继承自Object且没有重写equals方法,那么其equals操作也是与Object类一样,仅仅是直接调用==操作。
这个时候他俩没啥区别。当然这是废话,尼玛equals里面这时候本来就用的==,能不一样么摔。
这么说吧,这时候比较自定义类用equals和==是一样一样的,因为这个时候尼玛都是比较句柄地址,自定义的类是继承于object,而object中的equals就是用==来实现的。参见上面那条。
如果一个类重写过equals方法(或者继承自一个重写过equals方法的类,那么效果与==操作就不一样了。其实我觉得这才是楼主真正要问的地方。这里参见最开始的回答。
另外,那啥,再加一句,instanceof 也是个好东西哇。你可以用他检查引用型变量是否属于某一个Class:那啥,返回的也是true 或者false,跟c#里的is差不多的说。

Jdk7中 switch中 case “翻翻”
for(int i=0;i<10;i++)执行顺序先初始化 在判断范围 在执行中间语句 最后执行迭代(i++)

Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段
形式参数:在方法被调用时用于接收外界出入的数据
实参:调用方法时实际传给方法的数据
返回值:方法在执行完毕后返还给调用他的环境的数据
返回值类型:事先约定好返回值的数据类型,如无返回值,必须给出返回值类型void

return 两个作用 结束方法的运行 返回值

Java中进行方法调用中传递参数是,遵循值传递的原则
基本类型传递的是该数据值本身,引用类型传递的是对对象的引用,而不是对象本身

递归的基本思想就是:“自己调用自己” 一个使用递归技术的方法将会直接或者间接的调用自己。

递归结构包括两个部分:
定义递归头。解答:什么时候不调用自身方法。如果没有头 ,将陷入死循环。
递归体。

内存分析
栈自自动分配连续空间,后进先出放置局部变量

堆(不连续)
放置new出的对象
方法区也是堆存放:类的代码信息,static变量,常量池

通过类加载器Class Loader加载类,加载后,在方法区中有了该类的信息。

垃圾回收
要点:
程序员无权调用垃圾回收器
程序员可以通过System.gc().通知gc运行,但是java规范并不能保证立刻运行。
Finalize方法,是java提供给程序员用来释放对象或资源的方法,但是尽量少用。

构造器又称为构造方法
构造器用于构造改类的实例
格式如下
【修饰符】类名(形参列表){//n条语句}
是一种特殊的方法:
1:通过new关键字调用!!
2:构造器虽然又返回值,但是不能定义返回类型(返回值得类型肯定是本类),不能再构造器里调用return。
3:如果我们没有定义构造器,则系统会自动定义一个无参的构造函数。如果已定义则编译器不会添加
4:构造器的方法名必须和类名一致。

重载:
方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。

两同三不同:
同一个类,同一个方法名
不同:参数列表不同(类型,个数,顺序不同)
只有返回值不同不构成方法的重载
只有形参的名称不同,不构成方法的重载
与普通方法一样,构造方法也可以重载

静态引用不能引用非静态变量
普通方法可以调用静态的属性和方法

this super 隐式函数
普通方法中,this总是指向调用该方法的对象
构造方法中,this总是指向正要初始化的对象
This不能用于static方法(static没有对象)

ArrayList底层是基于数组实现的,也就是说ArrayList底层封装的是数组,每次创建ArrayList时传入的int参数就是它所包装的数组长度;如果创建ArrayList时没有传入int参数,那么ArrayList的初始长度为10,也就是他底层所封装的数组长度为10

HashMap而言,采用的是Hash算法来决定每个元素的位置
Put 源码

publicV put(K key,V value){
//如果key为null,调用PutForNullKey方法进行处理
if(key == null)
return putForNullkey(value);
//根据key的keyCode计算Hash值
int hash = hash(key.hashCode());
//搜索指定hash值在对应table中的索引
int i = indexFor(hash, table.length);
//如果i索引处的Entyr部位null,通过循环不断遍历e元素的下一个元素
for(Entry

猜你喜欢

转载自blog.csdn.net/qq_30443907/article/details/82143821