Java根底2

1.Java的安全性

语言档次的安全性次要体现在:
Java勾销了弱小但又危险的指针,而代之以援用。因为指针可进行挪动运算,指针可轻易指向一个内存区域,而不论这个区域是否可用,这样做是危险的,因为原来这个内存地址可能存储着重要数据或者是其余程序运行所占用的,并且应用指针也容易数组越界
垃圾回收机制:
不须要程序员间接管制内存回收,由垃圾回收器在后盾主动回收不再应用的内存。防止程序遗记及时回收,导致内存泄露。防止程序谬误回收程序外围类库的内存,导致系统解体。
异样解决机制:
Java异样机制次要依赖于try、catch、finally、throw、throws五个关键字。
强制类型转换:

  • 只有在满足强制转换规则的状况下能力强转胜利。
  • 底层的安全性能够从以下方面来阐明:

    • Java在字节码的传输过程中应用了公开密钥加密机制(PKC)。
    • 在运行环境提供了四级安全性保障机制:
      字节码校验器 -类装载器 -运行时内存布局 -文件拜访限度

2.Java三大版本

Java2平台包含标准版(J2SE)企业版(J2EE)微缩版(J2ME)三个版本:
Standard Edition(标准版) J2SE 蕴含那些形成Java语言外围的类
比方:数据库连贯、接口定义、输出/输入、网络编程
Enterprise Edition(企业版) J2EE 蕴含J2SE 中的类,并且还蕴含用于开发企业级利用的类
比方servlet、JSP、XML、事务管制
Micro Edition(微缩版) J2ME 蕴含J2SE中一部分类,用于消费类电子产品的软件开发。
比方:呼机、智能卡、手机、PDA、机顶盒
他们的范畴是:
J2SE蕴含于J2EE中,J2ME蕴含了J2SE的外围类,但新增加了一些专有类利用场合,API的覆盖范围各不相同。

3. 八种根本数据类型及其字节数

4. 大O符号(big-O notation)

大O符号形容了当数据结构外面的元素减少的时候,算法的规模或者是性能最坏的场景下有如许好
大O符号也可用来形容其余的行为,比方:内存耗费。因为汇合类实际上是数据结构,咱们个别应用大O符号基于工夫,内存和性能来抉择最好的实现。大O符号能够对大量数据的性能给出一个很好的阐明。

同时,大O符号示意一个程序运行时所须要的渐进工夫复杂度上界

其函数示意是:

对于函数f(n),g(n),如果存在一个常数c,使得f(n)<=c*g(n),则f(n)=O(g(n));

5.数组(Array)和列表(ArrayList)

Array和ArrayList的不同点:

  1. Array能够蕴含根本类型对象类型ArrayList只能蕴含对象类型
  2. Array大小固定的,ArrayList的大小是动态变化的。
  3. ArrayList提供了更多的办法和个性,比方:addAll(),removeAll(),iterator()等等。
  4. 对于根本类型数据,汇合应用主动装箱来缩小编码工作量。然而,当解决固定大小的根本数据类型的时候,这种形式绝对比较慢。

6.值传递和援用传递

值传递是对基本型变量而言的,传递的是该变量的一个正本,扭转正本不影响原变量.
援用传递个别是对于对象型变量而言的,传递的是该对象地址的一个正本, 并不是原对象自身 。 所以对援用对象进行操作会同时扭转原对象.

个别认为,java内的传递都是值传递.

7.根本数据类型的类型转换规定

根本类型转换分为主动转换强制转换
主动转换规则:
容量小的数据类型 能够主动转换成容量大的数据类型,也能够说低级主动向高级转换。这儿的容量指的不是字节数,而是指类型表述的范畴

红色可能损失精度

强制转换规则:
高级变为低级须要强制转换。
如何转换:
(1)赋值运算符“=”左边的转换,先主动转换成表达式中级别最高的数据类型,再进行运算。
(2)赋值运算符“=”两侧的转换,若右边级别>左边级别,会主动转换;若右边级别 == 左边级别,不必转换;若右边级别 < 左边级别,需强制转换
(3)能够将整型常量间接赋值给byte, short, char等类型变量,而不须要进行强制类型转换,前提是不超出其表述范畴,否则必须进行强制转换。

8.最有效率的办法算出2乘以8

应用位运算来实现效率最高。位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和后果都是整型数。
对于位运算符“<<”, 是将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只有将其左移3位即可,位运算cpu间接反对的,效率最高。所以,2乘以8等于几的最效率的办法是2 << 3

9. if和switch

相同之处:

都是分支语句,多超过一种的状况进行判断解决。

不同之处:

switch更适宜用于多分支状况,就是有很多种状况须要判断解决,判断条件类型繁多,只有一个入口,在分支执行完后(如果没有break跳出),不加判断地执行上来; 而if—elseif---else多分枝次要实用于分支较少的分支构造,判断类型不是繁多,只有一个分支被执行后,后边的分支不再执行
switch为等值判断(不容许比方>= <=),而if为等值和区间都能够,if的应用范畴大。

10.递归的定义和优缺点

递归算法是一种间接或者间接地调用本身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是非常无效的,它往往使算法的形容简洁而且易于了解。

递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用本身。
(2) 在应用递归策略时,必须有一个明确的递归完结条件,称为递归进口。
(3) 递归算法解题通常显得很简洁,但运行效率较低。所以个别不提倡用递归算法设计程序。
(4) 在递归调用的过程当中零碎为每一层的返回点、部分量等开拓了栈来存储。递归次数过多容易造成栈溢出等。所以个别不提倡用递归算法设计程序。

11. 数组

  • 数组是雷同类型数据有序汇合
  • 数组会在内存中开拓一块间断的空间每个空间相当于之前的一个变量,称为数组的元素element
  • 索引从0开始,每个数组元素有默认值 double 0.0; boolean false; int 0
  • 数组元素有序的,不是大小程序,是索引的程序
  • 数组中能够存储根本数据类型,能够存储援用数据类型;然而对于一个数组而言,数组的类型是固定的,只能是一个
  • length:数组的长度数组的长度是固定的,一经定义,不能再发生变化(数组的扩容)

12.主动拆装箱

主动装箱是Java编译器在根本数据类型和对应的对象包装类型之间做的一个转化。比方:把int转化成Integer,double转化成Double,等等。反之就是主动拆箱。

13.为什么会呈现4.0-3.6=0.40000001

起因简略来说是这样:2进制的小数无奈准确的表白10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中呈现了误差。

14.Lamda表达式的优缺点

长处:

  1. 简洁。
  2. 非常容易并行计算.
  3. 可能代表将来的编程趋势。

毛病:

  1. 若不必并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时须要预热才显示出效率劣势)
  2. 不容易调试。
  3. 若其余程序员没有学过 lambda 表达式,代码不容易让其余语言的程序员看懂。

15.java8的新个性

  • Lambda 表达式 − Lambda容许把函数作为一个办法的参数(函数作为参数传递进办法中。
  • 办法援用− 办法援用提供了十分有用的语法,能够间接援用已有Java类或对象(实例)的办法或结构器。与lambda联结应用,办法援用能够使语言的结构更紧凑简洁,缩小冗余代码。
  • 默认办法− 默认办法就是一个在接口外面有了一个实现的办法。
  • 新工具− 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
  • Stream API −新增加的Stream API(java.util.stream) 把真正的函数式编程格调引入到Java中。
  • Date Time API − 增强对日期与工夫的解决。
  • Optional 类 − Optional 类曾经成为 Java 8 类库的一部分,用来解决空指针异样。
  • Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它容许咱们在JVM上运行特定的javascript利用.

16.符号“==”比拟

“==”比照两个对象基于内存援用,如果两个对象的援用完全相同(指向同一个对象)时,“==”操作将返回true,否则返回false。“==”如果两边是根本类型,就是比拟数值是否相等。

17.Object若不重写hashCode()的话,hashCode()如何计算

Object 的 hashcode 办法是本地办法,也就是用 c 语言或 c++ 实现的,该办法间接返回对象的内存地址

18.为什么重写equals还要重写hashcode

HashMap中,如果要比拟key是否相等,要同时应用这两个函数!因为自定义的类的hashcode()办法继承于Object类,其hashcode码为默认的内存地址,这样即使有雷同含意的两个对象,比拟也是不相等的

HashMap中的比拟key是这样的,先求出key的hashcode(),比拟其值是否相等,若相等再比拟equals(),若相等则认为他们是相等的。若equals()不相等则认为他们不相等。如果只重写hashcode()不重写equals()办法,当比拟equals()时只是看他们是否为同一对象(即进行内存地址的比拟),所以必然要两个办法一起重写。HashMap用来判断key是否相等的办法,其实是调用了HashSet判断退出元素是否相等。重载hashCode()是为了对同一个key,能失去雷同的HashCode,这样HashMap就能够定位到咱们指定的key上。重载equals()是为了向HashMap表明以后对象和key上所保留的对象是相等的,这样咱们才真正地取得了这个key所对应的这个键值对。

19.map的分类和常见的状况

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,别离是HashMap Hashtable LinkedHashMap 和TreeMap.

Map次要用于存储健值对,依据键失去值,因而不容许键反复(反复了笼罩了),但允许值反复

Hashmap 是一个最罕用的Map,它依据键的HashCode值存储数据,依据键能够间接获取它的值,具备很快的访问速度,遍历时,获得数据的程序是齐全随机的

  • HashMap最多只容许一条记录的键Null;
  • 容许多条记录的值为 Null;
  • HashMap不反对线程的同步,即任一时刻能够有多个线程同时写HashMap;可能会导致数据的不统一。如果须要同步,能够用 Collections的synchronizedMap办法使HashMap具备同步的能力,或者应用ConcurrentHashMap。

Hashtable与 HashMap相似,它继承自Dictionary类,不同的是:它不容许记录的键或者值为空;它反对线程的同步,即任一时刻只有一个线程能写Hashtable,因而也导致了 Hashtable在写入时会比较慢。

LinkedHashMap 是HashMap的一个子类,保留了记录的插入程序,在用Iterator遍历LinkedHashMap时,先失去的记录必定是先插入的.也能够在结构时用带参数,依照利用次数排序。在遍历的时候会比HashMap慢,不过有种状况例外,当HashMap容量很大,理论数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和理论数据无关和容量无关,而HashMap的遍历速度和他的容量无关。

reeMap实现SortMap接口,可能把它保留的记录依据键排序,默认是按键值的升序排序,也能够指定排序的比拟器,当用Iterator 遍历TreeMap时,失去的记录是排过序的。

个别状况下,咱们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的抉择。但如果您要按天然程序或自定义程序遍历键,那么TreeMap会更好。如果须要输入的程序和输出的雷同,那么用LinkedHashMap 能够实现,它还能够按读取程序来排列.

20.冒泡排序

冒泡排序算法的原理如下:

  1. 比拟相邻的元素。如果第一个比第二个大,就替换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最初一对。在这一点,最初的元素应该会是最大的数。
  3. 针对所有的元素反复以上的步骤,除了最初一个。
  4. 继续每次对越来越少的元素反复下面的步骤,直到没有任何一对数字须要比拟。
public class Bubble {    public int[] sort(int[] array) {         int temp = 0;         // 外层循环,它决定一共走几趟 //-1为了避免溢出         for (int i = 0; i < array.length - 1; i++) {             int flag = 0;         //通过符号位能够缩小无谓的比拟,如果曾经有序了,就退出循环                     //内层循环,它决定每趟走一次             for (int j = 0; j < array.length - i - 1; j++) {              //如果后一个大于前一个,则换位                 if (array[j + 1] > array[j]) {                 temp = array[j];                 array[j] = array[j + 1];                 array[j + 1] = temp; flag = 1;                 }             }        if(flag == 0){             break;             }         }        return array;     }    public static void main(String[] args) {             Bubble bubble = new Bubble();        int[] array = {2,5,1,6,4,9,8,5,3,1,2,0};         int[] sort = bubble.sort(array);         for (int num:sort){         System.out.print(num+"\t");             }     } }