1.2java基础知识

一.Java四大特性:

封装、继承、多态、抽象。

1.多态:一个对象具备多种形态,也可以理解为事物存在的多种体现形态(父类的引用类型变量指向了子类对象,或者是接口的引用类型变量指向了接口实现类的对象)

(1)多态的实际意义:在于屏蔽不同子类的差异性实现通用的编程

**(2)多态的前提:**继承、重写、父类引用指向子类对象

(3)多态要注意的细节

  1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。

  2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。

  3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。

  4. 多态情况下,不能访问子类特有的成员。

总结:多态情况下,子父类存在同名的成员时,访问的都是父类成员,除了在同名非静态函数时才是访问子类的

二、强引用,软引用,弱引用,虚引用

强引用: 引用对象

回收:只要还有强引用指向一个对象,垃圾收集器就不会回收这个对象。

软引用: 图片缓存

回收:如果一个对象只具有软引用,在内存足够时,垃圾回收器不会回收它;如果内存不足,就会回收这个对象的内存。

弱引用: 在静态内部类中,经常会使用虚引用

回收:就是将对象留在内存的能力不是那么强的引用。当垃圾回收器扫描到只具有弱引用的对象,不管当前内存空间是否足够,都会回收内存。

虚引用: 一般可以通过虚引用达到回收一些非java内的一些资源比如堆外内存的行为

回收:并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

*虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

三、常见内存问题

https://blog.csdn.net/hexieshangwang/article/details/47251615?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160439506919725255502922%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160439506919725255502922&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-2-47251615.pc_first_rank_v2_rank_v28&utm_term=%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA&spm=1018.2118.3001.4449

1 OutOfMemory:内存溢出

2 Memory Leak:内存泄露

二者共同点:

(1) 通常最终的状态就会导致OOM错误

(2) 在Java堆或本地内存中都可能发生

二者不同点:

(1) ML是已经分配好的内存或对象,当不再需要,没有得到释放 而OOM则是没有足够的空间来供jvm分配新的内存块

(2) ML的内存曲线总体上是一条斜向上的曲线而OOM不是,反之未必

3.内存溢出类型:

虚拟机栈溢出、本地方法栈溢出、方法区溢出、堆溢出、运行时常量池溢出

异常类型:

(1) java.lang.OutOfMemoryError: Java heap space

堆内存溢出

优化:通过-Xmn(最小值)–Xms(初始值) -Xmx(最大值)参数手动设置 Heap(堆)的大小。

(2) java.lang.OutOfMemoryError: PermGen space

PermGen Space溢出(方法区溢出、运行时常量池溢出)

优化:通过MaxPermSize参数设置PermGen space大小。

(3) java.lang.StackOverflowError

栈溢出(虚拟机栈溢出、本地方法栈溢出)

优化:通过Xss参数调整

4.内存泄露原因以及解决方法:

(1)静态集合类引起:(强引用)

像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。

解决方法:最简单的方法就是将Vector对象用完之后设置为null

(2)集合里面的对象属性被修改后(元素对应的hashconde值也发生了改变),再调用remove()方法时不起作用。4

**(3)监听器:**释放内存的时候往往不记得释放监听器

**(4)各种连接:**例如数据库连接,Connection 在任何时候都无法自动回收

**(5)内部类和外部模块的引用:**一旦没释放可能导致一系列的后继类对象没有释放。

**(6)单例模式:**单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,导致内存泄漏

四、类的加载

1.java 自动初始化类的成员变量:

JAVA来中 成员变量可以 不用赋值;而局部变量一定要赋值;

在类初始化的时候,会隐式的对成员变量赋初始值。

https://blog.csdn.net/m0_38075425/article/details/81627349?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160628757019725225046089%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160628757019725225046089&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-2-81627349.pc_search_result_cache&utm_term=%E7%B1%BB%E5%8A%A0%E8%BD%BD&spm=1018.2118.3001.4449

五、不同分区的存储

1.堆(heap):存储着对象本身(被所有线程共享)

对象本身放堆中(new)中,或者常量池中(String str = “abcxx”)。

对象引用放在栈中

equals相等的字符串,在常量池中只有一份,在堆中则有多份

2.常量池:存放基本数据类型常量(使用final修饰)String类型常量。基本类型的包装类除了float和double都使用常量池。

3.栈:存放基本数据类型的变量数据 +对象的引用

栈分为三个部分:基本数据变量区、执行环境上下文、操作指令区

**4.方法区(静态区):**包含所有的class和static变量(被所有线程共享)

(不是常量)(整个程序中永远唯一的元素)

5.一些题(创建了几个对象)

(1)String s=new String(“xyz”) 到底创建了几个对象

首先声明s不是对象,不是对象,不是对象,s是指针引用

(1)如果"xyz"在常量池中存在,只会在堆中创建一个new String(“xyz”) ;一个对象

(2)如果"xyz"在常量池中不存在,会现在常量池中创建一个“xyz”,然后在堆中创建一个new String(“xyz”);两个对象

(2) String s = “a” + “b” + “c” + “d” + “e”;

创建了一个

(3)String s = a+b+c+d+e;

总结:三个对象分别为

1 StringBuilder

2 new char[capacity]

3 new String(value,0,count);

由于编译器的优化,最终代码为通过StringBuilder完成:

  public StringBuilder() {    
            super(16);   
  }      
  AbstractStringBuilder(int capacity) {  
            value = new char[capacity];       
   } 
  public String toString() {   
    // Create a copy, don't share the array   
    return new String(value, 0, count);  
    }

6.数组中堆和栈的问题:

 String[] Array = new String[3];

​ 以上代码是对数组简单的声明及内存分配的小实例,简单的实现了数组的应用。接下来想和大家分享的是数组在内存中的存放形式,以及在数组中栈和堆的关系。首先给出结论:数组引用变量(即Array变量)是存放在栈内存中,数组元素(即Array[0]、Array[1]等元素)是存放在堆内存中,通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问,以下图来说明数组此时的存放形式。

在这里插入图片描述

​ 在java中,当执行方法时,该方法都会建立自身的内存栈,以用来将该方法内部定义的变量逐个加入到内存栈中,当执行结束时方法的内存栈也随之销毁,所有变量存放在栈内存中,即随着寄存主体的消亡而消亡;反之,当我们创建一个对象时,这个对象被保存到运行时数据区中,即存放在堆空间中,以便反复利用(因为创建成本很高),此时不会随着执行方法的结束而消亡,同时该对象还可被其他对象所引用,只有当这个对象没有被任何引用变量引用时,才会在垃圾回收在合适的时间点回收。

六、Java命名规则

类名:首字母大写,其他单词中首字母大写,其他小写

方法名:首字母小写,其他单词中首字母大写,其他小写

变量:与方法名规则同

包名:全部小写

项目名全部小写

2.驼峰法

(1)小驼峰法

变量一般用小驼峰法标识。驼峰法的意思是:除第一个单词之外,其他单词首字母大写。譬如

变量myStudentCount第一个单词是全部小写,后面的单词首字母大写。

(2)大驼峰法

相比小驼峰法,大驼峰法把第一个单词的首字母也大写了。常用于类名,函数名,属性,命名空间。譬如public class DataBaseUser;

七、版本控制

1.SVN:源代码版本控制器

4.git:源代码版本控制器

2.CVS(Version Control system):保存你的多个版本在同一个文件中,仅仅保留版本之间的不同。

3.MVCC (Multiversion Concurrency Control)(undo logo):即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进

行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高

数据库系统的并发性能。

散记:

**1.CPA(**三者最多满足两个)(一致分区可用):

Consistency一致性:在分布式的环境中,两次读到数据是否一致

partition tolerance分区容错性:数据的分区特性,对系统性能的影响程度

availiability可用性:访问数据的性能

**2.**ascii码对应的:A-Z,65-90; a-z,97-122;

3.客户端禁止 cookie,session 还能用吗?

一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。

如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。

但是可以通过其他方法在禁用 cookie 的情况下,可以继续使用session。

通过url重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。

服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。

通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。

4. Math.pow(64,1d/3);

64开3次方根

Math.pow(m,n),代表m的n次方,

5. 对web资源的保护,最好的方法是使用过滤器。对方法调用的保护,最好的方法是使用AOP。

nid,浏览器发送请求时,携带 sessionid 参数。

通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。

4. Math.pow(64,1d/3);

64开3次方根

Math.pow(m,n),代表m的n次方,

5. 对web资源的保护,最好的方法是使用过滤器。对方法调用的保护,最好的方法是使用AOP。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值