1、在数据库中数据一般是以字符串的形式存放的,但在实际操作时,需要对其进行数值运算,所以经常需要用封装类型(对象类型)来进行数据类型的转化:
String yk = "123";
int intYk = Integer.valueOf(yk);
float floatYk = Float.valueOf(yk);
2、int的封装类是Integer,byte是Byte,char是Character,其他的封装类都跟基本数据类型拼写方式一样。
3、类型运算报错:
short yk = 1;
yk = yk + 1;
报错:yk + 1后得到的结果是int型的,但是用的是short型的yk接收,数值范围由大变小了,所以会反生错误;但是 yk += 1 是对的
4、数组中加入的数据是对数据的引用:只是在数组中加入了数据的地址。
5、Integer与int的区别:
- integer是封装类,其中包含了int基本数据类型和针对int的一些操作;而int是基本数据类型
- Integer变量必须实例化后才能使用,而int变量不需要
- Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
- Integer的默认值是null,int的默认值是0
6、java虚拟机中栈、堆、常量池:
- 栈:存放栈帧,栈帧中存放:局部变量表、动态链接、方法返回地址、操作数栈。在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 (栈中的变量指向堆内存中的变量,这就是Java中的指针)
- 堆:堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
- 方法区:类的元数据(元数据并不是类的Class对象!Class对象是加载的最终产品,类的方法代码,变量名,方法名,访问权限,返回值等都是在方法区的)存在方法区的!常量池也在方法区中。
- 常量池:常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用
- 静态域:存放对象中用static定义的静态成员
7、字符串操作:
String yk = "abc";
String yk = new String("abc");
- 第一行是在常量池中为abc分配了内存,第二行是在堆中为abc分配了内存。
- 在常量池中存放两个相同的数据时,java为了优化内存,两个数据指针引用的是同一个常量池中的数据;但在堆中new两个数据值一样的字符串时,堆不会将其合并为一个。所以在比较数据地址时注意这一点。
String yk = "a" + "b" + "c";
- 一共创建了5个对象:a、b、c、ab和abc
String c = 'a';
String d = c + 'bc';
String e = 'a' + 'bc';
- c是常量
- d是变量:在进行运算时,引用的c是一个变量,所以d是变量
- e是常量:因为‘a’ 和‘bc’ 都是常量
8、java:toString方法:
java在打印数据时(print方法),会自动调用该数据的toString方法(object类所具有的方法),所以在自定义类时,一般都要重写其toString方法,否则输出的是该对象的地址。
9、StringBuffer与StringBuilder可变字符串:
StringBuffer是线程安全的,但性能低于StringBuilder;StringBuilder是线程不安全的。
10、String yk = new String("abc"); 创建了几个对象?
- 创建了两个:一个是堆中的abc;另一个是yk,指向abc
11、由于线程还未将它操作后的变量对应的值回写到主存而导致其他线程不能看到该变量的最新值的问题,称为可见性问题。
11、java 中 IO 流分为几种?
- 按功能来分:输入流(input)、输出流(output)。
- 按类型来分:字节流和字符流。
- 字节流和字符流的区别是:字节流按 8 位传输字节为单位输入输出数据,字符流按 16 位传输字符为单位输入输出数据。(汉字一般都是用字符流进行操作,防止乱码)
12、java容器类:collection和map:
- collection:一组"对立"的元素,通常这些元素都服从某种规则
1) List必须保持元素特定的顺序
2) Set不能有重复元素
3) Queue保持一个队列(先进后出)的顺序 - Map:一组成对的"键值对"对象
13、协程、线程、进程:
- 进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信机制实现通信。由于进程比较重量级、占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
- 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
- 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器、上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
14、Get请求和Post请求的区别:
- 注意Get请求比Post请求效率高,Post请求需要服务器返回100再发送数据处理,Get请求直接是通过URL。
- post一般用于向服务器提交数据,get一般用于向服务器获取数据
- get请求携带的数据直接追加在URL后面;但是post可以放在请求体中,相对安全一些
15、说下重载(overload)和覆盖(override)的差别。
- 这个也会经常问,重载是多态的一种体现,表现形式是方法同名但参数不同,而覆盖是子类方法覆盖掉父类方法。
- 子类覆盖父类方法的两大局限,子类方法不能缩小父类方法的访问权限,而且,子类方法不能抛出比父类方法更多的异常。
16、构造函数能否被覆盖,能否被重载?
- 构造函数能重载,但不能覆盖。
17、静态变量和实例变量的区别?
-
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。每创建一个实例对象,就会为实例变量分配一片内存空间,实例变量之间是互不影响的。
-
静态变量不属于某个实例对象,是属于整个类。只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,并且可以被使用了。无论创建多少个实例对象,永远都只分配一个静态变量 。
-
实例变量必须创建对象后,才可以通过这个对象来使用;静态变量则可以直接使用类名来引用(如果实例对象存在,也可以通过实例对象来引用)。
网友评论