1.十进制-->二进制:十进制转为二进制主要是对十进制数进行除2运算
2.二进制-->十进制:二进制乘以2的过程
3.负数的二进制表现形式:比如,-6,:其实就是6的二进制取反+1
4.十进制数转换为二进制的输出语句:
System.out.println(Integer.toBinaryString(-6));
public boolean equals(Object obj) {
return (this == obj);
}
Object 中euqals的源码如上。没有重写equals时,是直接用==判断的,而String中重写了equals方法;equals没重写时候和==一样,比较的是对象的地址,题中new 了两个对象,所以各自地址不一样,使用equals比较为false,但是string类型中的equals方法Java默认重写了,可以比较对象里的值;两个对象指向的同一个string成员变量里的值相同,所以eqauals比较也相同
AWT :是通过调用操作系统的native方法实现的,所以在Windows系统上的AWT窗口就是Windows的风格,而在Unix系统上的则是XWindow风格。AWT中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers。
也就是说,当我们利用AWT来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT
不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT
是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。
Swing :是所谓的Lightweight组件,不是通过native方法来实现的,所以Swing的窗口风格更多样化。但是,Swing里面也有heaveyweight组件。比如JWindow,Dialog,JFrame
Swing是所谓的Lightweight组件,不是通过native方法来实现的,所以Swing的窗口风格更多样化。但是,Swing里面也有heaveyweight组件。比如JWindow,Dialog,JFrame
Swing由纯Java写成,可移植性好,外观在不同平台上相同。所以Swing部件称为轻量级组件( Swing是由纯JAVA CODE所写的,因此SWING解决了JAVA因窗口类而无法跨平台的问题,使窗口功能也具有跨平台与延展性的特性,而且SWING不需占有太多系统资源,因此称为轻量级组件!!!)
AWT和Swing都是java中的包。
AWT(Abstract WindowToolkit):抽象窗口工具包,早期编写图形界面应用程序的包。
Swing :为解决 AWT存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。
AWT和Swing的实现原理不同:
AWT的图形函数与操作系统提供的图形函数有着一一对应的关系。也就是说,当我们利用 AWT构件图形用户界面的时候,实际上是在利用操作系统的图形库。
不同的操作系统其图形库的功能可能不一样,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT不得不通过牺牲功能来实现平台无关性。因此,AWT 的图形功能是各操作系统图形功能的“交集”。
因为AWT是依靠本地方法来实现功能的,所以AWT控件称为“重量级控件”。
而Swing ,不仅提供了AWT 的所有功能,还用纯粹的Java代码对AWT的功能进行了大幅度的扩充。
例如:并不是所有的操作系统都提供了对树形控件的支持, Swing则利用了AWT中所提供的基本作图方法模拟了一个树形控件。
由于 Swing是用纯粹的Java代码来实现的,因此Swing控件在各平台通用。
因为Swing不使用本地方法,故Swing控件称为“轻量级控件”。
AWT和Swing之间的区别:
1)AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。
2)AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。
在实际应用中,应该使用AWT还是Swing取决于应用程序所部署的平台类型。例如:
1)对于一个嵌入式应用,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT当然成了嵌入式Java的第一选择。
2)在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素。所以在标准版的Java中则提倡使用Swing, 也就是通过牺牲速度来实现应用程序的功能。
枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,原先的枚举类型变成对应的实体类型
枚举类 所有的枚举值都是类静态常量,在初始化时会对所有的枚举值对象进行第一次初始化。
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式Class Enum>,而E表示枚举类型的名称。枚举类型的每一个值都将映射到protected Enum(String name, int ordinal)构造函数中
简单来说就是枚举类型中的枚举值都会对应调用一次构造函数
关于容器集合类:
linkedlist类是实现了List接口,而不是继承
AbstractSet类实现Set接口
HashSet继承AbstractSet类,同时也实现set
WeakMap是js中的,java的是WeakHashMap
List,Set,Map在java.util包下都是接口
List有两个实现类:ArrayList和LinkedList
Set有两个实现类:HashSet和LinkedHashSet
AbstractSet实现了Set
.LinkedList是继承自AbstractSequentialList(抽象类,实现了List接口)的,并且实现了List接口
AbstractSet是实现了Set接口的,本身是一个抽象类。继承自AbstractCollection(抽象类,实现了Collection接口)
HashSet是继承自AbstractSet,实现了Set接口
定义在同一个包(package)内的类可以不经过import而直接相互使用
堆区:只存放类对象,线程共享;
方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;
常量区:未经 new 的常量
堆区:成员变量的引用,new 出来的变量
栈区:局部变量的引用
类中的成员变量,存放在堆区
方法中的局部变量,存放在栈区
成员变量和局部变量的区别
成员变量:
①成员变量定义在类中,在整个类中都可以被访问。
②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
③成员变量有默认初始化值。
局部变量:
①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
②局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
③局部变量没有默认初始化值
在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找。
成员变量和静态变量的区别
1、两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象被回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。
2、调用方式不同
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
3、别名不同
成员变量也称为实例变量。
静态变量也称为类变量。
4、数据存储位置不同
成员变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
成员变量、局部变量、静态变量的区别
Exception 包括 非检查性异常 RuntimeException,及其子类,即运行时的异常,运行时的异常是代码的BUG,和检查性异常,即非运行时异常,程序在编译的时候会发现的异常如: IOException之类,在处理类似文件流的时候,java强制规定必须处理可能遇到的文件流异常。
runtimeException是运行时的异常,在运行期间抛出异常的超类,程序可以选择是否try-catch处理。
其他的检查性异常(非运行时的异常,如IOException),是必须try-catch的,否则程序在编译的时候就会发现错误。
String为引用类型,如果对象为null,也就是说这个对象都不存在了,再去调用对象的相关方法,肯定会报空指针异常
&&和||具有短路的效果,在进行&&时,如果&&前的是false,那么&&后的不再执行,直接返回false,同理||也一样
| :检测ture;不具备短路功能,会检查每一个条件,表达式中只要一个ture 就整体返回true
|| :检测true;具备短路功能,一遇到true,就返回true;
&:检测false;同理上;
&&:检测false;同理上;
字符串数据和任何数据使用+都是相连接,最终都会变成字符串
转义字符:通过\ 来转变后面字母或者符号的含义
\n:换行
\b:退格
\r:按下回车键。windoes系统,回车符是由两个字符来表示\r\n
\t:制表符
short s= 4;
s = s+2; //编译失败,因为s会被提升为Int类型,运算后的结果还是Int类型,无法赋值给short类型
s+=2//编译通过,因为+=运算符给s赋值时,自动完成了强制转换
逻辑运算符:
&:只要两边的boolean表达式结果,有一个为false,则结果就是false,只有两边都为true,则结果为true。无论左边是true还是false,右边都运算
|:两边的boolean表达式结果,有一个为true,则结果就是true。两边都参与运算
^:异或,就是和|有点不一样。当true^true = false;false^false=false;两边相同,结果为false,两边结果不同,结果为true;
!:非
&&:(短路)当左边为false时,右边不运算;当左边为true时,右边才参与运算
||:(短路)当左边为true时,右边不参与运算
<<:左移,a<<n,则为a*2^n
>>:右移,与左移正好相反;最高位补什么,由原有数据的最高位值而定,如果最高位为0,那么右移后,用0补空位。如果最高位为1,右移后用1补空位
>>>:无论最高位是什么,右移动后,都用0补
一个数异或同一个数两次,结果还是那个数
重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,重写实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者两者都不同)则视为重载;重写发生在子类和父类之间,重写要求子类被重写方法与父类被重写方法由相同的返回类型,比父类被重写方法更好访问,但是不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求
抽象类(abstract class)和接口(interface)有什么异同?
抽象类和接口都不能够实例化,但是可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍需要被声明为抽象类。接口比抽象更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public、的,而接口中的成员全部都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必有抽象方法。
关于对象成员占用内存的说法中,同一个类的对象使用不同的内存段,但是静态成员共享相同的内存空间
实例方法可直接调用本类的类方法:
类方法就是静态方法。其它的就是实例方法
实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,但类方法不能访问实例变量。实例方法必须由实例对象来调用,而类方法除了可由实例对象调用外,还可以由类名直接调用。
另外,在类方法中不能使用 this 或 super。 关于类方法的使用,有如下一些限制:
1 在类方法中不能引用对象变量。
2 在类方法中不能使用super、this关键字。
3 类方法不能调用类中的对象方法。
与类方法相比,实例方法几乎没有什么限制:
1 实例方法可以引用对象变量(这是显然的),也可以引用类变量。
2 实例方法中可以使用super、this关键字。
3 实例方法中可以调用类方法。
用new创建的对象在堆区
函数中的临时变量在栈区
java中的字符串在字符串常量区
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆:存放用new产生的数据
静态域:存放在对象中用static定义的静态成员
常量池:存放常量
非RAM存储:硬盘等永久存储空间、
10个线程和2个线程的同步代码,从写代码的角度来说,两者的复杂度是相同的,因为同步代码与线程数量是相互独立的。但是同步策略的选择依赖于线程的数量,因为越多的线程意味着更大的竞争,所以你需要利用同步技术,如锁分离,这要求更复杂的代码和专业知识
sleep方法和wait方法的区别:虽然两者都是用来暂停当前运行的线程,但是sleep()实际上只是短暂停顿,因为它不会释放锁,而wait()意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁
JAVA中堆和栈的区别:JVM中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总会在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个JVM的所有线程共享
if和switch很像,具体什么场景下应用哪个语句,如果判断的具体数值不多,而是符合byte,short,int,char这四种类型,虽然两个语句都可以使用,建议使用switch语句,因为效率高。其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广
数组没有length()方法,有length属性。String 有length()方法,javascript中,获得字符串的长度是通过length属性得到的,这一点容易和java混淆
hibernate中Session的load和get方法的区别:hibernate中的session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别。
get:Session接口提供了4个重载的get方法,分别通过“持久类+主键”以及“锁选项”来获取实体对象
load:跟get调用方式基本一样,多了一个重载方法:使用“一个空的持久化累的实例+主键”来获取实体对象
打印昨天的当前时刻
import java.util.Calendar;
public class YesterdayCurrent {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE,-1);
System.out.println(cal.getTime());
}
}
在Java8中,可以用下面的代码实现相同的功能:
package day1;
import java.time.LocalDateTime;
class YesterdayCurrent {
public static void main(String[] args) {
LocalDateTime today = LocalDateTime.now();
LocalDateTime yesterday = today.minusDays(1);
System.out.println(today);
System.out.println(yesterday);
}
}
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调的方法
JDBC进行事务处理:Connection提供了事务处理的方法。通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显示提交事务;如果在事务处理过程中法神异常则通过rollback()进行事务回滚。除此之外,从JDBC3.0之后还引入了Savepoint(保存点)的概念,允许通过代码设置保存点并让事务回滚到制定的保存点。
好地方