java基础笔试面试(2)

notify()是Thread的方法吗?
是,notify()在Object类中定义,由于Object是所有类的父类,所有类都有notify()方法,当然Thread类也有

用简短的代码实现字符串"s tr i n g" 到 “s tr i ng"转换(即将多个空格转换为一个空格)
String str = “s tr i n g”.replaceAll(” +", " ");

数组有没有length()方法? 字符串有没有length()方法? 集合有没有length()方法?
数组求长度用length属性
字符串求长度用length()方法
集合求长度用size()方法
例子:
String[] strings = {“aaa”,“bbb”,“ccc”};
String string = “aaabbbccc”;
List list = new ArrayList();
list.add(1);

System.out.println(“String[].length=”+strings.length);
System.out.println(“String.length()=”+string.length());
System.out.println(“List.size()=”+list.size());

下面哪些是Thread类的方法(多选)
A:start()
B:run()
C:exit()
D:getPriority()
答案:ABD
start()是启动线程的方法;run()是线程执行的代码;getPriority()获取线程的优先级

new一个ArrayList的代码,如果一次要往ArrayList里添加1000个数据,如何优化能够提高性能?
ArrayList的默认构造函数是创建一个容量为10的列表,因为ArrayList是使用数组实现的,当超过ArrayList现有容量的时候,会自动创建一个新的数组来保存数据,性能比较低。可以调用这个构造函数ArrayList list = new ArrayList(1000)创建一个初始容量为1000的列表,避免重新“扩容”。

下面程序的运行结果是什么?
String str1 = “rupeng.com”;
String str2 = “rupeng”+new String(".com");
String str3 = “rupeng”+".com";
System.out.println(str1str2); //false
System.out.println(str1
str3); //true
解释:java中是比较是否是同一个对象;new String(".com")就会创建一个新的对象,和"rupeng"相加会产生新的字符串对象。所以str1str2为false
String str3 = “rupeng”+".com";会被编译器优化为String str3 = “rupeng.com”;字符串常量池的存在,str3和str1共用同一个字符串对象,所以str1==str3为true

下列关于集合类描述错误的是?
A:ArrayList和LinkedList均实现了List接口
B:ArrayList的访问速度比LinkedList快;
C:添加和删除元素时,ArrayList表现更佳;
D:HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
答案:C
“访问速度”指的是遍历的速度,ArrayList由于内部是用数组保存的,所以遍历速度比用节点链接的LinkedList遍历速度快;因此B是对的;
ArrayList由于内部是用数组保存的,当添加、删除元素的时候需要重新构建数组,所以添加、删除元素效率比LinkedList低;

获得一个类的类对象有哪些方式?

  • 方法1:类型.class,例如:String.class
  • 方法2:对象.getClass(),例如:“hello”.getClass()
  • 方法3:Class.forName(),例如:Class.forName(“java.lang.String”)

如何通过反射创建对象?

  • 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()
  • 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);

如何通过反射调用对象的方法?
String str = “hello”;
Method m = str.getClass().getMethod(“toUpperCase”);
System.out.println(m.invoke(str));

欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的?
A:ArrayList myList=new Object();
B:List myList=new ArrayList();
C:ArrayList myList=new List();
D:List myList=new List();
答案:B
接口类型的变量可以指向实现了这个接口的变量的对象

对于import java.util,以下那种说法是错误的?
A:Vector 类属于 java.util 包
B:Vector 类放在某个目录的 java/util/ 目录下
C:Vector 类放在 java.util 文件中
D:Vector 类是 Sun 公司的产品
答案:C

34、在一个线程中sleep(1000)方法,将使得该线程在多少时间后获得对CPU的控制(假设睡眠过程中不会有其他事件唤醒该线程)?
A:正好 1000 毫秒
B:1000 毫秒不到
C:=>1000 毫秒
D:不一定
答案:C
sleep不是精准的,休息的时间只会多、不会少。

多线程有几种实现方法,都是什么?
同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。
同步的实现方面有两种,分别是synchronized关键字、wait()方法与notify()方法

下面哪些接口直接继承自Collection接口?(多选题)
A:List
B:Map
C:Set
D:Iterator
答案:AC

Java的集合框架中重要的接口java.util.Collection定义了许多方法。选项中哪个方法不是Collection接口所定义的?
A:boolean containsAll(Collection c)
B: compareTo(Object obj)
C: int size()
D: boolean remove(Object obj)
答案:B
compareTo是Comparable接口定义的方法

下列数据结构中,按“先进后出”原则组织数据的是?
A:链表LinkedList
B:栈Stack
C:队列Queue
D:集合HashSet
答案:B
栈Stack是先入后出;队列Queue是先入先出;

Thread.sleep()方法的作用是?
A: 使所有线程挂起
B: 使托管虚拟机挂起
C: 使当前线程挂起
D: 仅挂起同步方法
答案:C

40、当使用客户端套接字Socket创建对象时,需要指定?
A: 服务器端口和文件
B: 服务器地址和文件
C: 服务器主机名称和端口
D: 服务器名称和文件
答案:C

41、如何根据类名创建类实例,并调用类的一个方法。
解析:
要使用反射。
假设Person类定义如下:
class Person
{
public void sayHello(String name)
{
System.out.println(name+“你好”);
}
}
主体代码如下(不考虑异常):
public class Main {
public static void main(String[] args) throws Exception {
String className = “a3.Person”;
String methodName=“sayHello”;

	Class clz = Class.forName(className);
	Object newPerson = clz.newInstance();
	Method method = clz.getMethod(methodName, String.class);
	method.invoke(newPerson, "rupeng");
}

}

42、(安纳西游戏面试题)玩家信息:姓名(name)、财富(money)、性别(sex);
1)定义一个玩家信息类;
2)假设有一个玩家类List,请根据财富(从多到少)对玩家进行排序输出玩家名字;

解析:
1)Player 类
class Player {
private String name;
private int money;
private boolean sex;

public Player(String name, int money, boolean sex) {
	super();
	this.name = name;
	this.money = money;
	this.sex = sex;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getMoney() {
	return money;
}

public void setMoney(int money) {
	this.money = money;
}

public boolean isSex() {
	return sex;
}

public void setSex(boolean sex) {
	this.sex = sex;
}

}
2)排序代码:
List list = new ArrayList<>();
list.add(new Player(“张三”, 300, true));
list.add(new Player(“李四”, 200, true));
list.add(new Player(“王五”, 500, true));

list.sort(new Comparator() {
public int compare(Player o1, Player o2) {
return o1.getMoney()-o2.getMoney();
};
});

for(Player p : list)
{
System.out.println(p.getName());
}

2、用最高效的方式计算2乘以8的积?
解析:
2 << 3
位移运算(也称为移位运算)是计算机速度最快的运算

GC是什么?为什么要有GC?Java的垃圾回收可以马上回收内存吗?有什么方法通知虚拟机进行垃圾回收?
GC(Garbage Collection) 是指垃圾回收,对于Java来说,就是回收内存中无用的数据、对象等。
Java有多套规则可以判断一个对象是否是垃圾,是否应该被回收。主要规则是:当没有任何引用指向一个对象的时候,这个对象就可以被回收了。
Java中有专门的线程负责垃圾回收,不需要程序员自己控制回收过程,以便让程序员专注于业务逻辑代码,而不用考虑数据回收等繁琐问题。
此外Java中提供了System.gc() 方法来通知JVM尽快回收,但也不是立马回收,JVM会选择合适的时机进行回收。

Java中会存在内存泄露吗?
内存泄露指的是:没用的内存不被回收而导致的内存浪费。虽然说GC会帮我们释放无用对象占用的内存,但是GC只会释放没有任何引用的对象,如果一个对象已经没用了,但是由于我们代码的问题导致整个对象一直被引用,它占据的内存就迟迟不能被回收,这种情况也属于内存泄露。

oracle中数据库存储过程的关键字是什么?
procedure

SQL语句中delete与truncate的区别?
都可删除表中数据
delete只会删除表中记录,属于DML(数据操纵)语言,受事务控制,可回滚,后面可跟where子句。
truncate会先删除整个表结构(表中数据自然就被删除了)然后重建表结构,这时除了表中记录之外,其他附属数据也会被删除。属于DDL(数据定义)语言,不受事务控制,不可回滚,后面不可跟where子句。
另外,delete会执行触发器,truncate不会执行触发器;truncate执行速度比delete快。

mysql和oracle分页上有什么区别?
mysql使用limit关键字进行分页,如:select * from students limit 0,10

oracle借助rownum伪列进行分页,如:
select * from (select rownum r,ename ,sal from emp where rownum <=10) where r >=1

oracle常用的函数有哪些?
to_char、to_number、to_date 、LOWER 、UPPER、 SUBSTR 、REPLACE、 TRIM 、ROUND 、NVL等

12、下列不是InputStream子类的是(单选)
A:压缩输入流ZipInputStream
B:对象输入流ObjectInputStream
C:字符输入流CharInputStream
D:输入流FileInputStream
答案:C
根本没有CharInputStream这么一个类,字符流一般使用InputStreamReader

13、在java中,要获取ResultSet类型变量rs中的数据,必须执行的语句是
A:rs.next()
B:rs.previous()
C:rs.getNext()
D:rs.getPrevious()
答案:A

14、编写一个方法,对输入的以逗号做分割的一串数据进行顺序排序,例如对5,35,6,2,98,3,67进行升序排列;
import java.util.Arrays;
import java.util.Comparator;
public class Main2 {
public static void main(String[] args) {
String s = “5,35,6,2,98,3,67”;
String[] strs = s.split(",");
Arrays.sort(strs,new Comparator() {
@Override
public int compare(String o1, String o2) {
int i1 = Integer.parseInt(o1);
int i2 = Integer.parseInt(o2);
return i1-i2;
}
});
for(String item : strs)
{
System.out.println(item);
}
}
}

15、有语句 String s = “rupeng”,以下操作哪个是错误的(多选)
A:int i = s.length();
B:int i =s.length;
C:s>>>=3;
D:String ts = s.trim();
答案:BC
解析:
字符串的长度用length()方法,而不是length,因此B是错的。

是位运算,只针对数字类型,因此C是错误的;

16、下列关于Java语言的特点,描述错误的是
A:Java是跨平台的编程语言
B:Java支持分布式计算
C:Java是面向过程的编程语言
D:Java支持多线程
答案:C
解析:
“跨平台”指的是可以在Windows、Linux、Unix等操作系统下运行;
Java是面向对象的编程语言;

17、有序整形数组a[]={ 2, 5, 10, 11, 19, 50, 51 },用二分查找法找出整数n在数组中的位置,找不到则返回-2
解析:
static int binarySearch(int[] a,int n) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (n == a[middle]) {
return middle;
} else if (n < a[middle]) {
high = middle - 1;
} else {
low = middle + 1;
}
}
return -2;
}

调用方式:
System.out.println(binarySearch(a,3));
System.out.println(binarySearch(a,10));
System.out.println(binarySearch(a,19));

18、写一个冒泡排序算法对int数组进行排序
解析:
注:工作中很少自己写排序算法,但是面试时候有时候会考,因此还是需要掌握一种排序算法的。网上可以找关于“冒泡排序”算法的介绍资料,如果不理解“冒泡排序”算法就背过来就行。
public static void Sort(int[] myArray)
{
for (int j = 1; j < myArray.Length; j++)
{
for (int i = 0; i < myArray.Length - 1; i++)
{
// 如果 myArray[i] > myArray[i+1] ,则 myArray[i] 上浮一位
if (myArray[i] > myArray[i + 1])
{
int temp = myArray[i];
myArray[i] = myArray[i + 1];
myArray[i + 1] = temp;
}
}
}
}

19、用过BigDecimal类吗?
解析:
double、float进行小数运算是有精度损失的,如果想进行精确运算,要使用BigDecimal类,用法详细介绍,看这个文章:http://www.cnblogs.com/chenssy/archive/2012/09/09/2677279.html

GC线程是否为守护线程? 是

volatile关键字是否能保证线程安全?
答案:不能。volatile保护的是变量安全。主要的功能是保护变量不被主线程和子线程反复修改造成读写错误。不能保证多线程的执行有序性。而最彻底的同步要保证有序性要使用synchronized。

不通过构造函数也能创建对象吗?
无论是通过new还是通过反射创建对象都会调用构造函数,只有根据对象序列化的数据反序列出对象的时候是不调用构造函数的;

23、下面的程序能正常运行吗?
public class NULL
{
public static void haha()
{
System.out.println(“haha”);
}
public static void main(String[] args)
{
((NULL)null).haha();
}
}
解析:
答案:可以。
haha是静态方法,因此不需要对象,因此不会报NullPointerException

24、下列哪种异常是检查异常?(单选题)
A:NullPointerException
B:ClassCastException
C:FileNotFoundException
D:IndexOutOfBoundsException
答案:C

25、
对于下面的代码运行之后foo的值是什么?
int index=1;
boolean[] test=new boolean[3];
boolean foo = test[index];
A:0
B:null
C:false
D:true
答案:C
解析:
boolean数组元素默认值是false,int数组元素默认值是0,对象数组元素默认值是null

26、对于下面的代码运行之后foo的值是什么?
int index=1;
Boolean[] test=new Boolean[3];
Boolean foo = test[index];
A:0
B:null
C:false
D:true
答案:B
解析:
boolean数组元素默认值是false,int数组元素默认值是0,对象数组元素默认值是null
boolean是原始数据类型;Boolean是包装类,Boolean数组元素默认值是null

27、String、StringBuffer、StringBuilder的相同和不同是什么?
解析:
1)String是不可变的;StringBuffer、StringBuilder是可变的;
2)String连接的时候会产生临时字符串对象;StringBuffer、StringBuilder不会产生临时字符串对象。当进行大量字符串拼接的时候要用tringBuffer或者StringBuilder;
3)String是不可变的,因此是线程安全的;StringBuffer也是线程安全的,StringBuilder不是线程安全的。

1、2都好记。3经常混淆StringBuilder和StringBuffer,我们平时开发的时候都用StringBuilder,因为大部分都不是多线程环境,必须要线程安全,所以能够帮我们记忆“用的多的StringBuilder线程不安全,用的少的StringBuffer线程安全”。

28、创建一个流对象,下面哪个代码是错误的?
A:new BufferedWriter(new FileWriter(“a.txt”));
B:new BufferedReader(new FileInputStream(“a.txt”));
C:new GZIPOutputStream(new FileOutputStream(“a.txt”));
D:new ObjectInputStream(new FileInputStream(“a.txt”));
答案:B
解析:
BufferedReader是负责逐行读取的,需要借助于InputStreamReader实现逐字符读取,B应该改成new BufferedReader(new InputStreamReader(new FileInputStream(“a.txt”)))

29、以下代码运行输出是
public class Demo {
public int add(int a, int b) {
try {
return a + b;
} catch (Exception e) {
System.out.print(“catch语句块”);
} finally {
System.out.print(“finally语句块”);
}
return 0;
}
public static void main(String[] args) {
Demo demo = new Demo();
System.out.print(“和是:” + demo.add(9, 34));
}
}
A:编译错误
B:finally语句块和是:43
C:和是:43finally语句块
D:catch语句块和是:43
答案:B

30、以下程序的执行结果是什么?
public class Test {
public int div(int a, int b) {
try {
return a / b;
} catch (Exception e) {
System.out.println(“Exception”);
} catch (NullPointerException e) {
System.out.println(“NullPointerException”);
} catch (ArithmeticException e) {
System.out.println(“ArithmeticException”);
} finally {
System.out.println(“finally”);
}
return 0;
}
public static void main(String[] args) {
Test demo = new Test();
System.out.println(“商是” + demo.div(9, 0));
}
}

A:Exception finally 商是:0
B:ArithmeticException finally 商是:0
C:finally 商是:0
D:编译报错
答案:D
解析:
NullPointerException、ArithmeticException等异常都是继承自Exception的,已经catch住Exception了,这样NullPointerException、ArithmeticException等异常都会被
catch (Exception e) {
System.out.println(“Exception”);
}

catch住了,后面的
catch (NullPointerException e) {
System.out.println(“NullPointerException”);
}
等都属于“不可达代码”、属于无意义的代码,因此编译不通过。

31、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
解析:
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。

32、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
解析:
不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。

36、在Java中,关于HashMap类的描述,以下错误的是?(单选题)
A:HashMap使用键值得形式保存数据
B:HashMap 能够保证其中元素的顺序
C: HashMap允许将null用作键
D:HashMap允许将null用作值
答案:B

37、以下对JDBC事务描述错误的是?
A:JDBC事务属于JAVA事务的一种
B:JDBC事务属于容器事务类型
C: JDBC事务可以保证操作的完整性和一致性
D:JDBC事务是由Connection发起的,并由Connection控制
答案:B
解析:
Tomcat等服务器通过JNDI等提供了容器事务,不需要程序员写代码控制事务。但是JDBC的事务是需要程序员编写代码的,因此JDBC事务不属于容器事务。

38、以下描述正确的是?
A:CallableStatement是PreparedStatement的父接口
B:PreparedStatement是CallableStatement的父接口
C:CallableStatement是Statement的子接口
D:PreparedStatement是Statement的父接口
答案:B

39、要删除book表中书籍(bookName)是”java”的记录,以下代码正确的是?
String sql=”delete from book where bookName=?”;
PreparedStatement pst=con.preparedStatement(sql);


pst.execute();
A: pst.setString(1,”java”);
B:pst.setString(0,”java”);
C:pst.setInt(0,”java”);
D:以上选项都不正确
答案:A
解析:
JDBC中参数的序号是从1开始的。

40、获取ResutlSet对象rst的第一行数据,以下正确的是?
A:rst.hashNext();
B:rst.next();
C:rst.first();
D: rst.nextRow();
答案:B

41、以下可以正确获取结果集的有?(多选题)
A: Statement sta=con.createStatement(); ResultSet rst=sta.executeQuery(“select * from book”);
B:Statement sta=con.createStatement(“select * from book”); ResultSet rst=sta.executeQuery();
C:PreparedStatement pst=con.preparedStatement(); ResultSet rst=pst.executeQuery(“select * from book”);
D:PreparedStatement pst=con.preparedStatement(“select * from book”); ResultSet rst=pst.executeQuery();
答案:AD

42、MVC属于JavaWeb哪种开发方式?
A:Model1
B:Model2
C:Model3
D:Model4
答案:B
解析:
Model1是JSP+JavaBean;Model2是JSP+Servlet+JavaBean;

43、Session对象的哪个方法用于设置会话的超时时间?
A:session.setMaxInactiveInterval(30)
B:session.setMaxTime(30)
C:session.getMaxInactiveInterval()
D:session.setAttribute(“time”,30)
答案:A

44、在JavaEE中属于Web层的组件是?(单选题)
A:HTML
B:EJB
C:Applet
D:JSP
答案:D
解析:
HTML是通用的网页技术,不属于JavaEE的一部分;EJB是应用服务器开发技术;Applet是已经过时的开发小窗口程序的技术;JSP才是做web开发的;

48、如下代码
10. public Object m() {
11. Object o = new Float(3.14F);
12. Object [] oa = new Object[1];
13. oa[0] = o;
14. o = null;
15. oa[0] = null;
16. System.out.println(“hell”);
17. }
当Float对象在第11行被创建后, 什么时候能够被垃圾回收?

A:13 行以后
B:14 行以后
C:15 行以后
D:16 行以后
答案:C
解析:
当一个对象没有任何引用的时候就可以被回收了。oa[0] = o;是引用了o当前所指向的对象。

49、下面关于垃圾收集的说法正确的是?
A:一旦一个对象成为垃圾,就立刻被收集掉
B:对象内存空间被收集掉之后,会执行该对象的 finalize 方法
C: finalize 方法和 C++ 的析构函数是完全一回事情
D:一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此。
答案:D
解析:
A、GC会选择合适的时机进行对象内存的回收;
B、对象的finalize是在对象内存会回收的时候执行,而不是“之后”。我们平时开发的时候不会写finalize方法,能够通过面试就可以了;
C、大家都没学过C++,记住不对就行了,别管为什么;
D、线程是操作系统进行资源的管理,和普通对象不一样;

50、JDK中的java.exe和javac.exe分别是做什么的?
A:java解释器;java编译器;
B:java编译器;java解释器;
C:Java 文档生成器;java编译器;
D:Java 文档生成器;java解释器;
答案:A

51、JSP中如何利用ServletContext和ServletConfig对象获得初始化参数?
解析:
String psw = config.getInitParameter(“psw”);
ServletContext ss = config.getServletContext();
String ppp = ss.getInitParameter(“name”);

52、编写一个连接mysql数据库,查询并且打印T_Users表的代码。
解析:
这是JDBC的基本代码,必须能在纸上把主体代码写出来!
Class.forName(driver);
Connection conn = DriverManager.getConnection(url,name,psw);
PreparedStatement pstat = null;
ResultSet res =null;
String sql = “select * from users”;
pstat = conn.prepareStatement(sql);
res = pstat.executeQuery();
while(res.next())
{
String name = res.getString(“name”);
}

53、能够向文件输入逻辑型数据的类是?
A:DataOutputStream
B:FileWriter
C:OutputStream
D:FileOutputStream
答案:A
解析:
DataOutputStream可以直接写int、String、double等,它会帮我们将这些数据转换为字节存储;

54、JDBC中创建SQL语句对象可能产生异常,此异常是?
A:SQLWaring
B:SQLException
C:DataTruncation
D:IOException
答案:B

55、下列语句哪一个正确?
A: Java程序经编译后会产生machine code
B: Java程序经编译后会产生byte code
C: Java程序经编译后会产生DLL
D: 都不正确
答案:B
解析:
machine code是“机器码”,只有C这样的语言才会生成机器码,Java生成的.class是“字节码(byte code)”

56、编译并运行以下程序,以下描述哪个选项是正确的
class A{
protected boolean equals(){
return super.equals();
}
}
A: 编译通过运行无异常
B: 编译通过但运行时出错
C: 行2出错,不能成功编译
D: 不能成功编译,行3出错
答案:D
解析:
Object类没有equals()方法 只有equals(Object obj)方法。所以super.equals();出错

57、有源文件Test.java,请问用命令行怎么编译?怎么运行编译后的class?
A:1) javac Test.java 2)java Test
B:1)java Test.java 2)java Test.class
C:1)java Test 2) javac Test
D:1)javac Test 2)java Test.class
答案:A
解析:
javac.exe是编译工具,把源代码A.java编译成字节码文件A.class,java.exe是运行A.class的解释器;
javac.exe编译的时候要带上java的全文件名;java.exe是运行字节码文件用的程序,不用也不能带上.class文件名,只要写类名即可。

58、对一个java源文件 aaa.java,编辑保存后但未编译,在其所在目录下执行 java aaa,则接着会出现什么?
A: 程序正常执行并显示
B: 无任何显示
C: Exception in thread “main” java.lang.NoClassDefFoundError: aaa
D: error: cannot read: aaa.java
答案:C
解析:
java aaa表示运行aaa这个类,由于还没有根据aaa.java编译成aaa.class,所以会报错NoClassDefFoundError(类定义没找到)

59、"try-catch"块可能会跟哪一个关键字?
A:finally
B:final
C:finish
D:finalize
答案:A

60、编译一个定义了5个类和18个方法的Java源代码文件,编译该源代码文件时会产生几个字节码文件?
A:1
B:23
C:5
D:18
答案:C
解析:
一个类对应一个.class文件;

61、Java编程所必须的默认引用包为?
A: java.lang包
B: java.sys包
C: java.util包
D:都不是
答案:A
解析:
Integer、String等这些基本的类都定义在java.lang下

62、不可变对象(Immutable object)总是?
A: 线程安全
B: 可序列化
C: 多态的
D: 节省内存
答案:A
线程安全问题就是多个线程修改同一个对象的状态引起的。不可变对象是状态不可变的对象,因此是线程安全的

编码题:设计4个线程,其中两个线程每次对i增加1,另外两个线程每次对i减少1。
package com.rupeng;
public class TestThread {
public static void main(String[] args) {
Resource resource = new Resource();// 指定资源 方便共享
for (int i = 0; i < 2; i++) {
Thread incThread = new Thread(new Increment(resource));
incThread.start();
Thread decThread = new Thread(new Decrement(resource));
decThread.start();
}
}
}

class Resource {
private int i;

public int getI() {
    return i;
}

public synchronized void inc() {
    i++;
}

public synchronized void dec() {
    i--;
}

}

class Increment implements Runnable {
private Resource resource;

public Increment(Resource resource) {
    this.resource = resource;
}

@Override
public void run() {
    while (true) {
        this.resource.inc();
    }
}

}

class Decrement implements Runnable {
private Resource resource;

public Decrement(Resource resource) {
    this.resource = resource;
}

@Override
public void run() {
    while (true) {
        this.resource.dec();
    }
}

}

17、编码题:有一个子线程和一个主线程,子线程先对i自增10次,然后主线程对i自增100此;接着又回到子线程对i自增10此…如此循环50次。
package com.rupeng;
public class TestThread2 {
public static int time = 50;
//刚开始 让子线程走
public static void main(String[] args) {
Resource1 resource1 = new Resource1();
MainThread main = new MainThread(resource1);
SubThread sub = new SubThread(resource1);
Thread mainThread = new Thread(main);
Thread subThread = new Thread(sub);
mainThread.start();
subThread.start();
}
}
class Resource1 {
boolean flag = false;
int i ;
}
class MainThread implements Runnable{
private Resource1 resource1;
public MainThread(Resource1 resource1){
this.resource1 = resource1;
}
@Override
public void run() {
while(TestThread2.time > 0){
synchronized (resource1) {
if(!resource1.flag){
try {
resource1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0;j<100;j++){
resource1.i++;
System.out.println(“main”+resource1.i);
}
TestThread2.time–;
resource1.flag = false;
resource1.notify();
}
}
}
}
class SubThread implements Runnable{
private Resource1 resource1;
public SubThread(Resource1 resource1){
this.resource1 = resource1;
}
@Override
public void run() {
synchronized (resource1) {
while(true){
if(resource1.flag){
try {
resource1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<10;i++){
resource1.i++;
System.out.println(“sub”+resource1.i++);
}
TestThread2.time–;
resource1.flag = true;
resource1.notify();
}
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值