天天看点

Java基础知识点Basic Java Programming总结总结

Basic Java Programming总结

1.在Java中,产生一个对象的时候,最终是否一定会调用该类中的构造方法?

不一定。当反序列化创建对象时就不会调用构造方法

注意:需要了解反序列化知识点。

99%的情况产生对象时调用构造器,而有1%的情况就是反序列化创建对象,无需调用构造器。

2.基本数据类型和引用数据类型的核心区别。

基本数据类型变量直接存储在栈上;引用数据类型变量,首先要在栈上给其引用分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。

注意:存储位置的差异是它们的核心差异。

3.以下代码运行是否有错,如果没有报错,结果是什么?如果报错应该怎么改?

package exam;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

public class Test {
public static void main(String[] args) {
	List<Person> persons = new ArrayList<>();
	person.add(new Person());
	person.add(new Person());
	person.add(new Person());
	person.add(new Person());
	
	FileOutputStream fos = new FileOutputStream("src/obj.txt");
	ObjectOutputStream oos = new ObjectOutputStream(fos);
	oos.writeObject(persons);
	oos.flush();
	oos.close();
	System.out.println("保存成功");
}
class Person{
}
}

           

答:报错。当容器被序列化时,容器里面的数据也要被序列化。因此需要将Person类实现序列化接口。

注意:需要了解序列化知识。

  • 序列化:

    将对象变成字节序列

    只有实现了序列化接口的类所产生的对象才能够被序列化

  • 反序列化:

    将字符序列恢复成对象

4.类A中有非静态方法x,类B中有非静态方法y,请问在x方法和y方法上直接使用synchronized关键字分别修饰这两个方法,在多线程环境下,这两个方法x和y,是否可以实现线程同步的效果?如果不可以,请说明原因,并简单说明如果修改可以让它们实现线程同步的效果。

不可以,当synchronized修饰非静态方法时,锁对象为this,因此不可以实现同步,将同步方法换成同步代码块并且使用同一个锁对象。

注意:需要了解线程安全代码加锁知识。

5.List、Map、Set 三个接口,存取元素时,各有什么特点?

List 以特定次序来持有元素,可有重复元素。

Set 无法拥有重复元素,内部排序。

Map 保存key-value 值,value 可多值。

  • 通俗化:

    List集合能够存放有序可重复的数据

    Set集合存放无序不可重复的数据

    Map集合一次能够存两列数据,并且key不可重复

    Map集合中 entrySet返回的是Entry的Set集合(写键值对的Set集合也可以)。

注意:需要了解List、Map、Set知识点。

首先,List 与 Set 具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,叫 Collection。

Set 里面不允许有重复的元素,Set 集合的add 方法有一个 boolean 的返回值,当集合中没有某个元素,此时 add 方法可成功加入该元素时,则返回 true,当集合含有与某个元素 equals 相等的元素时,此时 add 方法无法加入该元素,返回结果为 false。Set 取元素时,没法说取第几个,只能以 Iterator 接口取得所

有的元素,再逐一遍历各个元素。

List 表示有先后顺序的集合。当我们多次调用add(Obj e)方法时,按先来后到的顺序排序。有时候,也可以插队,即调用 add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进 List 中,每调用一次 add 方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被 add 多次时,即相当于集合中有多个索引指向了这个对象。List 除了可以以 Iterator 接口取得所有的元素,再逐一遍历各个元素之外,还可以调用 get(index i)来明确说明取第几个。

Map 与 List 和 Set 不同,它是双列的集合,其中有 put 方法,定义如下:put(obj key,objvalue),每次存储时,要存储一对 key/value,不能存储重复的 key,这个重复的规则也是按 equals 比较相等。取则可以根据 key 获得相应的 value,即 get(Object key)返回值为 key 所对应的 value。另外,也可以获得所有的 key 的结合,还可以获得所有的 value的结合,还可以获得 key 和 value 组合成的 Map.Entry 对象的集合。

6.请问以下代码无论运行多少次一定是“test11…”打印在前,“test22…”打印在后吗?

public static void main(String[] args) {
		Thread t1 = new Thread() {
			@Override
			public void run() {
				System.out.println("test1..");
			}
		};
		Thread t2 = new Thread() {
			@Override
			public void run() {
				System.out.println("test1..");
			}
		};
		
		t1.run();
		t2.run();
	}
           

答:一定是,因为没有启动线程,而是调用了线程里面得run方法,属于方法的调用。

注意:细心看程序是start启动线程还是调用run方法。

7.抽象方法是否可以为静态的?

不可以,因为如果可以,那么就可以通过类名去调用,而抽象方法没有方法体无法去执行该抽象方法 。

或:

抽象方法就是用来被子类重写的,而静态方法不能够被重写,所以冲突。

注意:需要了解抽象方法知识。

8.获取一个类类型的Class对象的方式有哪些?基本数据类型是否可以获取其Class对象?

  • Class.forName(“全类名”);

    类名.class

    对象名.getClass();

  • 基本数据类型可以获取Class对象,方式为: 基本数据类型.class

注意:需要了解反射知识点。

9.Java中的泛型的上限和下限是什么意思?使用List接口声明局部变量的方式举例说明。

List<? extends Object> list = new ArrayList<>();

泛型只能为 Object或者Object的子类

向上限:

List<? super String> list = new ArrayList<>();

泛型只能为:String以及String的父类

注意:需要了解泛型通配符:向上限定、向下限定知识点。

10.抽象类与接口的区别是什么?抽象类与接口是否都有构造器?

  • 抽象类:

    抽象类中可以拥有抽象方,法也可以拥有非抽象方法;

    抽象类中可以拥有普通变量,也可以拥有常量;

    抽象类中可以拥有自己的构造器。

  • 接口:

    接口里面所有方法都是抽象方法;

    接口里面所有变量都是静态常量;

    接口没有构造器。

  • 抽象类有构造器,接口没有

    因为类与类是继承关系,当创建子类对象时会调用父类中的构造器。

    而类与接口是实现关系,当创建该类对象时会调用该类的父类的构造器。

注意:需要了解抽象类与接口知识点。

11.数组扩容

int[] arr = {1,2,3,5};
int[] obj = new int[arr.length * 2 + 1];
System.arraycopy(arr, 0, obj, 0, arr.length);
arr = obj;
           

注意:了解数组知识点。

12.以下代码执行结果。

package excise;
class A {
	public A() {
		System.out.println(getName());
	}
	public String getName() {
		return "lisi";
	}
	
}
public class Test3 extends A {
	public Test3() {
		System.out.println(getName());
	}
	public String getName() {
		return "wangwu";
	}
	public static void main(String[] args) {
		new Test3();
	}
}

           

wangwu

wangwu

注意:子类执行方法时首先找父类中的构造方法,再看构造方法是否被子类重写,若重写执行重写后的方法。

13.int a = 15;int b = 3;怎么能把变量a和变量b的值进行交换?(要求不使用第三个变量)

一:

a = a ^ b;
	b = a ^ b;
	a = a ^ b;
           

二:

a = a + b;
	b = a - b;
	a = a – b;
           

注意:注意读题,题目中要求不使用第三个变量。还有一种使用第三个变量的交换方法,但题目不适用。

int temp = a;
a = b;
b = temp;
           

14.Unix操作环境下编译和运行两个类。要求两个类一个一个编译,最后运行主类。

/src和/bin目录

vim src/Student.java

vim src/StudentTest.java

这两个类都是com.test包下面的类

javac -d ./bin ./src/Student.java
javac -d ./bin -classpath ./bin/ ./src/StudentTest.java
java -cp ./bin com.test.StudentTest
           

注意:-classpath。

15.以下代码编译运行结果是什么?

public void test() throws Exception {
		synchronized (getClass()) {
			for (int i = 0; i < 100; i++) {
				if (i == 10) {
					wait();
				}
			}
		}
	}
           

运行抛出异常

锁对象为字节码对象,而wait()方法的调用是this

注意:需要了解线程知识点。

16.下列程序在1处是否会有异常,如果没有输出什么?是否会运行到2处,输出什么?为什么?

package excise;

import java.util.ArrayList;
import java.util.List;

public class Test5 {
	public static void main(String[] args) {
		List list = new ArrayList();
		test2(list);
		System.out.println(list.size());//1处
		test3(list);
		System.out.println(list.size());//2处
	}
	public static void test2(List list) {
		list = null;
	}
	public static void test3(List list) {
		list.add("aaaa");
	}
}
           

1处没有异常,输出结果为0

可以运行到2处,结果为1

因为方法的传递为引用传递,传递的是地址,对地址操作就是对堆里面的内存进行操作。

注意:方法的传递。

17.定义一个类Person,将多个Person对象存入TreeS儿童中,此时有几种方式可以对集合中的对象进行排序?如果是把这些对象存放到List集合中,又该如何排序?

将Person存入TreeSet排序有两种方式:

一是自然排序,实现Comparable

二是在创建TreeSet时传入一个比较器

List本身是有序的,按照放入先后顺序去进行排序

注意:需要了解TreeSet排序和List排序知识点。

总结

这些是第一阶段还未完全掌握的知识点,总结一下仔细复习,多多练习。