1. 成员内部类:定义在类的里面,方法的外面,就称为成员内部类,使用的多一些,在类里面的,生命周期要长一些
2. 局部内部类:定义在方法的里面,就称为局部内部类,局部内部类使用的不多,因为它定义在方法里面,方法结束了,那么这个内部类也就结束了,生命周期比较短。
1. 内部类可以直接访问外部类的成员,包括私有的也可以访问
2. 外类类要访问内部类的成员,必须要通过实例化来进行访问
2. Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
12,-11
3.按值传递和按引用传递的区别?
值传递:方法调用时,实际参数把它的值的副本传递给对应的形式参数,此时形参接收到的其实只是实参值的一个拷贝,所以在方法内对形参做任何操作都不会影响实参
· 引用传递:当参数是对象的时候,其实传递的对象的地址值,所以实参的地址值传给形参后,在方法内对形参进行操作会直接影响真实内容
4. throw和throws的区别
throws:
1)用在方法声明后面,跟的是异常类名。
2)可以跟多个类名,用逗号隔开
3)表示抛出异常由该方法的调用者来处理。
throw:
1)在方法体内,跟的是异常对象名。
2)只能抛出一个异常对象名
3)表示抛出异常由该方法体内语句处理。
5. String、StringBuffer、StringBuilder 的区别?
线程安全方面:String和StringBuilder都是线程不安全的,但是StringBuffer是线程安全的。
String是字符串常量,而StringBuffer和StringBuilder都是字符串变量,说白了就是,当String字符串对象一旦创建成功,就不会改变,但是StringBuffer和StringBuilder是可以修改的
在执行效率上:或者说是执行速度,在这方面运行速度快慢为:StringBuilder> StringBuffer(他是synchronized进行修饰的) > String(因为每一次创建的String对象都是不可以变的)
6. 数组和集合的区别
一、数组声明了它容纳的元素的类型,而集合不声明。
二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。
三、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。
四、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。
7. ArrayList和LinkedList的区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
(这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于 LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList.)
8. 在Java中,如何跳出当前的多重嵌套循环
一、标号方式
在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号break语句,即可跳出外层循环。例如:
ok:
for(inti=0;i<10;i++) {
for(intj=0;j<10;j++) {
System.out.println(“i=” + i + “,j=” + j);
if(j== 5) break ok;
}
}
二、break跳出当前循环,通过内部跳出条件控制跳出外部循环
for(inti=0;i<4;i++){
for(intj=0;j<5;j++){
System.out.println("i="+i+";j="+j);
if(j==3){
i=4;
break;
}
}
}
三、抛出异常也可以跳出多重循环
通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,
它里面存储的也是Object类型的数据,键和值的类型都是Object类型,键是唯一的,值是不唯一的(值是可以重复的)
存储进来的数据,键是无序的,键也是唯一的。
键如果重复了,就会出现后来的值把前面的值覆盖,相当于是修改的作用。
10.在 Queue 中 poll() 和 remove() 的区别是什么?
poll()和remove()都将移除并且返回对头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。
11.hashTable和hashMap的区别:
1. 线程不同,一个线程安全(hashtable),一个线程不安全(hashmap)
2. hashtable,不可以null键null值,而hashmap是支持null键null值的。
3. hashmap使用的频率要更多一些。
12.说出ArrayList,Vector, LinkedList的存储性能和特性
1、随机访问能力
ArrayList和Vector底层为数组结构,它们都允许直接按序号索引元素,访问数据的速度非常快
LinkedList底层为双向链表的结构,但是链表的存储方式与数组的连续存储方式相比,内存的利用率更高,访问数据相对于ArrayList低
2、插入、删除数据效率
ArrayList和Vector插入和删除元素要涉及到数组元素移动等内存的操作,所以效率比较低下
LinkedList插入数据时只需要记录本项的前后项即可,速度非常快
3、遍历数据效率
ArrayList>Vector>LinkedList
4、线程安全/非安全
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
二.编程题
题目一:需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。
package com.yueqian.day15TreeSet;
import java.util.Scanner;
import java.util.TreeSet;
class Student{
private String name;
private int ChineseScore;
private int MathScore;
private int EnglishScore;
public Student(){}
public Student(String name, int chineseScore, int mathScore, intenglishScore) {
this.name = name;
ChineseScore = chineseScore;
MathScore = mathScore;
EnglishScore = englishScore;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getChineseScore() {
return ChineseScore;
}
public void setChineseScore(int chineseScore) {
ChineseScore = chineseScore;
}
public int getMathScore() {
return MathScore;
}
public void setMathScore(int mathScore) {
MathScore = mathScore;
}
public int getEnglishScore() {
return EnglishScore;
}
//计算总分
public int getCount(){
return ChineseScore+MathScore+EnglishScore;
}
public void setEnglishScore(int englishScore) {
EnglishScore = englishScore;
}
@Override
public String toString() {
return "Student{" +
"name='" + name +'\'' +
", ChineseScore=" +ChineseScore +
", MathScore=" +MathScore +
", EnglishScore=" +EnglishScore + '\''+",Count="+getCount()+
'}';
}
}
public class hw_1 {
public static void main(String[] args) {
/**
* 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),
* 按照总分从高到低输出到控制台。
*/
//取消重复录入机制,允许总分相同
TreeSet<Student> stu=new TreeSet<>((o1,o2)->{
if (o1.getName().equals(o2.getName()) &&o1.getChineseScore()==o2.getChineseScore()&&
o1.getMathScore()==o2.getMathScore()&&o1.getEnglishScore()==o2.getEnglishScore()){
return 0;
}
if (o1.getCount()>o2.getCount()){
return -1;
}else
return 1;
});
System.out.println("请录入五名学生成绩:");
Scanner sc=new Scanner(System.in);
while (stu.size()<5){
Student s=new Student();
System.out.print("请输入第"+(stu.size()+1)+"个学生姓名:");
s.setName(sc.next());
System.out.print("请输入第"+(stu.size()+1)+"个学生语文成绩:");
s.setChineseScore(sc.nextInt());
System.out.print("请输入第"+(stu.size()+1)+"个学生数学成绩:");
s.setMathScore(sc.nextInt());
System.out.print("请输入第"+(stu.size()+1)+"个学生英语成绩:");
s.setEnglishScore(sc.nextInt());
int FirstSize=stu.size();
stu.add(s);
int endSize=stu.size();
if (FirstSize==endSize){
System.out.println("重复成绩录入失败,请重新录入第"+(FirstSize+1)+"学生成绩");
}
}
stu.forEach(System.out::println);
}
}
public class MapTest {
public static void main(String[] args) {
Map<String,Double> map = new HashMap<String,Double>();
//1.添加数据
System.out.println("1.添加数据");
map.put("Tom",1200.0);
map.put("Jack",1800.0);
map.put("Rose",500.0);
map.put("Mike",400.0);
map.put("Sale",2100.0);
map.forEach((s, d) -> System.out.println("姓名:"+s+",工资:"+d));
//2.获取所有的员工姓名
System.out.println("2.获取所有的员工姓名");
Set<String> keySet = map.keySet();
keySet.forEach(System.out::println);
//3.列出所有员工姓名及其工资
System.out.println("3.列出所有员工姓名及其工资");
for (String s : keySet) {
System.out.println("姓名:"+s+",工资:"+map.get(s));
}
//4.删除名叫Tom的员工信息
System.out.println("4.删除名叫Tom的员工信息");
map.remove("Tom");
map.forEach((s, d) -> System.out.println("姓名:"+s+",工资:"+d));
//5.输出Jack的工资,并将其工资加1000元(通过取值实现)
System.out.println("5.输出Jack的工资,并将其工资加1000元(通过取值实现)");
double wages = map.get("Jack");
map.put("Jack",wages+1000);
System.out.println(wages+"---"+map.get("Jack"));
//6.将所有工资低于1000元的员工的工资上涨20%(通过取值实现)
System.out.println("6.将所有工资低于1000元的员工的工资上涨20%(通过取值实现)");
Set<Map.Entry<String, Double>> entries = map.entrySet();
for (Map.Entry<String, Double> entry : entries) {
if ( entry.getValue()<1000){
map.put(entry.getKey(),entry.getValue()*1.2);
}
}
map.forEach((s, d) -> System.out.println("姓名:"+s+",工资:"+d));
}
}
题目三:学生表student有主键id、以及姓名name列
学生分数表score有主键id、分数result、外键学科courseId、外键学生studentId列。
1)请写sql查询score表中所有姓林的学生的记录。
Select * fromscore where name like ’林%’
2)学科表course有主键Id、以及学科名name列
请写sql查询学生名字等于林安的所有科目成绩,并按照学生主键、科目主键排序,结果格式为:
学生主键 学生姓名 科目名 分数
SELECT st.id '学生主键',st.name '学生姓名',c.name '科目名',sc.result '分数' FROM student st LEFT JOIN score sc ONsc.studentId=st.id LEFT JOIN course c ON c.id=sc.courseId WHERE st.`name`='林安'
3)请算出每个科目的平均分数,结果根据科目id降序排序。结果格式如下:
科目平均分数
SELECT c.name '科目',AVG(resule)'平均成绩' FROM score s,course c
WHEREs.`courseId`=c.`id`
GROUP BYc.`name` ORDER BY c.id DESC