优点:
向 ArrayList 末尾添加元素(add() ⽅法)时,效率较高
查询效率高缺点:
扩容会造成效率较低(可以通过指定初始化容量,在⼀定程度上对其进行改善)
另外数组无法存储大数据量(因为很难找到⼀块很大的连续的内存空间)
向 ArrayList 中间添加元素(add(int index)),需要移动元素,效率较低
但是,向 ArrayList 中间位置增/删元素的情况较少时不影响;
如果增/删操作较多,可考虑改用链表
方法的定义可能会用到 参数(有参的方法),参数在程序语言中分为:
实参(实际参数,Arguments):用于传递给函数/方法的参数,必须有确定的值。
形参(形式参数,Parameters):用于定义函数/方法,接收实参,不需要有确定的值。
1234567String hello = "Hello!";// hello 为实参sayHello(hello);// str 为形参void sayHello(String str) { System.out.println(str);}
两者的主要区别在于解决问题的方式不同:
面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。
另外,面向对象开发的程序一般更易维护、易复用、易扩展。
下面是一个求圆的面积和周长的示例,简单分别展示了面向对象和面向过程两种不同的解决方案。
面向对象:
12345678910111213141516171819202122232425262728public class Circle { // 定义圆的半径 private double radius; // 构造函数 public Circle(double radius) { this.radius = radius; } // 计算圆的面积 public double getArea() { return Math.PI * radius * radius; } // 计算圆的周长 public double getP ...
什么是不可变对象好处是什么不可变对象指对象一旦被创建,状态就不能再改变,任何修改都会创建一个新的对象,如 String、Integer及其它包装类.不可变对象最大的好处是线程安全.
程序设计语言将实参传递给方法(或函数)的方式分为两种:
值传递:方法接收的是实参值的拷贝,会创建副本。
引用传递:方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。
很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。
为什么说 Java 只有值传递呢? 不需要太多废话,我通过 3 个例子来给大家证明。
案例 1:传递基本类型参数代码:
123456789101112131415public static void main(String[] args) { int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2);}public static void swap(int a, int b) { int temp = a; a = b; b = temp; System.out.println("a = " + a); System.out.println("b = " + b);}
输出:
1234a = 20b = 10num1 = ...
引用传递看似很好,能在方法内就直接把实参的值修改了,但是,为什么 Java 不引入引用传递呢?
注意:以下为个人观点看法,并非来自于 Java 官方:
出于安全考虑,方法内部对值进行的操作,对于调用者都是未知的(把方法定义为接口,调用方不关心具体实现)。你也想象一下,如果拿着银行卡去取钱,取的是 100,扣的是 200,是不是很可怕。
Java 之父 James Gosling 在设计之初就看到了 C、C++ 的许多弊端,所以才想着去设计一门新的语言 Java。在他设计 Java 的时候就遵循了简单易用的原则,摒弃了许多开发者一不留意就会造成问题的“特性”,语言本身的东西少了,开发者要学习的东西也少了。
抽象类能使用final修饰吗?不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类
HashMap 底层是⼀个数组
2.数组中每个元素是⼀个单向链表(即,采⽤拉链法解决哈希冲突)
单链表的节点每个节点是 Node<K, V> 类型(见下源码)
3.同⼀个单链表中所有 Node 的 hash值不⼀定⼀样,但是他们对应的数组下标⼀定⼀样
数组下标利⽤哈希函数/哈希算法根据 hash值计算得到的
4.HashMap 是数组和单链表的结合体
数组查询效率⾼,但是增删元素效率较低
单链表在随机增删元素⽅⾯效率较⾼,但是查询效率较低
HashMap 将⼆者结合起来,充分它们各⾃的优点
5.HashMap 特点
⽆序、不可重复
⽆序:因为不⼀定挂在那个单链表上了
6.为什么不可重复?
通过重写 equals ⽅法保证的
HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更快。