基本数据类型转换规则大的数据类型转换为小的数据类型需要强制转换反之可以自动转换。
byte short int long float double
基本数据类型8个 string不是基本数据类型 也不能被继承因为有final修饰
int 4字节 float f = 3.14f/F; float类型后面跟f
++i是先计算i的值,然后再使用这个值,而i++是先使用i,然后再计算i++.
Java中所有定义的基本类型或对象都必须初始化才能输出值不然编译会报错
递归就是方法里调用自身 数组未赋值输出0
Father father = new son()父类类型的引用指向一个子类的对象 即为多态 该引用只能调用父类中定义的方法和变量;
如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;
(动态连接、动态调用)变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
constructor构造器即类的构造器每个类都有 默认的为无参无返回值无void方法 方法名与类名相同
singleton单例模式 确保只有单个对象被创建 懒汉不会产生垃圾对象
懒汉:先判断该对象是否已经实例化(判空),若已实例化直接返回该类对象 否则实例化。线程不安全 需要在判断空后加锁synchronized 使用volatile修饰对象防止指令重排,因为需要两次判空,且对类对象加锁,该懒汉式写法也被称为:Double Check(双重校验) + Lock(加锁)
饿汉:类在加载时实例化静态对象private static Singleton instance = new Singleton()然后返回对象 容易产生垃圾对象 类加载时就初始化浪费内存
反射(newInstance()和序列化(将对象写到文件后readObject()读对象)导致懒饿汉对象不唯一,使用枚举实现
工厂模式 简单工厂父类类型的引用指向一个子类的对象 工厂方法定义一个抽象的接口让子类决定实例化哪个类 抽象工厂提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
适配器模式:220V/44=5V 220v转换成5v的电压 例Spring MVC DispatcherServlet 需要获取对应类型的 Controller。SpringAop中每 Advice通知都要封装成对应的拦截器返回给容器,需要使用适配器模式对 Advice 进行转换
选择排序:拿第一个元素循环判断赋最小的值 然后交换位置 反复
快速排序:小于pivot的所有数移动到其左边,大于pivot的数移动到右边,完成对pivot的排序后,继续在pivot的左右两个子区间进行快速排序。
含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和default但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类
在Tomcat容器中配置数据库数据源的文件是server.xml
编译java文件命令javac
i + 1 < i int 的最大值, 加 1 后变为负数
java可以跨平台因为java代码不是直接运行在CPU上,而是运行在java虚机(简称JVM)上的
javabean:这个Java类必须具有一个无参的构造函数,属性必须私有化。这个类的属性使用getter和setter来访问
public->protected->default->private
hasNext()不是 Object 类的方法toString是所有对象都有的方法
Java 创建对象的几种方式:
(1) 用 new 语句创建对象,这是最常见的创建对象的方法
(2) 调用对象的 clone()深拷贝方法
(3) 反射调用 java.lang.Class 或者 java.l ang.reflect.Constructor 类的 newInstance()实例方法
(4) 反序列化调用 java.io.ObjectInputStream 对象的 readObject()方法
1、包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址;基本类型不是?
2、包装类型是引用的传递;基本类型是值的传递?
3、声明方式不同:基本数据类型不需要new关键字
包装类型需要new在堆内存中进行new来分配内存空间?
4、存储位置不同:基本数据类型直接将值保存在值栈中;
包装类型是把对象放在堆中,然后通过对象的引用来调用他们?
5、初始值不同:int的初始值为 0 boolean的初始值为false?
包装类型的初始值为null?
向ArrayList,LinkedList中放数据的时候,只能放Object类型的,基本类型放不进去
重载和重写和隐藏
重载 方法的重载参数类型个数顺序不同的同名函数 不关心返回值
重写/继承/覆盖override函数名参数列表返回值类型都一致 抽象类中的抽象方法必须重写,
隐藏/重定义 父类和子类函数名相同 不关心参数列表跟返回值
值传递和引用传递,Java 编程语言只有值传递参数 除set和add外都不会改变实参
在调用方法时,若要使方法改变实参的值用对象作为参数:形参p:echo(Point p)临时名称,实参x:A.echo(x)简单来讲就是用对象为参数在方法内会改变外面的对象的值而值不会
值传递:对于基本类型和包装类,传递的时候,将实参值复制,方法内获得的形参与实参没有关系,只是值相同,称为值传递,在方法中修改形参不影响实参;
引用传递:对于对象,传递的时候,将实参引用复制,形参与实参引用相同,指向的是同一个对象,称为引用传递,在方法中修改形参会影响实参
浅拷贝复制其引用地址,当引用指向的值改变时也会跟着变化;而深拷贝复制变量值相当于新建一个同值的新对象,对象的修改并不会影响另一个对象。clone方法是浅拷贝可以重写clone实现不完全的深拷贝,因为对象里的引用类型变量经常出现层层调用关系
如果是值类型则比较值是否相等;如果是引用类型则判断对象地址是否相等。
equals底层用的,但对于包装类对equals方法进行了重写比较两个对象的内容是否相等
当为Integer i=-128~127时,在自动装箱过程中是取自常量池中的数值所以内存地址相等,但new Integer(1)是新地址
String str = “hello"它是java中唯一不需要new 就可以产生对象的途径,叫直接量; 先在内存中找是不是有hello这个对象,有就让str指向那个hello没有hello就创建一个新的对象保存"hello”. str1==str2
String str=new String (“hello”)就是直接新建一个对象保存"hello"
equals相同hashCode也相同 equals不相同hashCode不一定不同(自定义对象内相同成员)
重写equals当将自定义对象放到 map或者 set中时;set会先调用 hashCode方法进行比较,equals不相同hashCode相同这样就会将重复对象存入 map或者 set中。
重写hashcode方法后,修改成员字段数值会影响hashcode值影响到在哈希表中的位置,致使remove方法无法找到原来的对象,但是对象在哈希表中有引用,hash对象又没有被释放。垃圾回收器发现其还有引用,又不会回收该对象。于是,内存泄漏了(内存空间使用完毕之后未回收)如果要修改,先从哈希表中删除该对象,修改后再放入哈希表。
String的hashCode算法:第一个字符转为int类型的值31+第二个字符int类型的值类推,先判断后面有没有字符在31
String和StringBuffer,StringBuilder的区别
字符串分两类:一类是字符串常量String;另一类是字符串变量StringBuffer
String类型其对象内部需要维护三个成员变量char[] chars,int startlndex,int length。其内容一旦声明后对象本身是不可改变的,改变的只是其内存的指向 及修改其引用
String在java里是固定长度,