1. 成员内部类:定义在类的里面,方法的外面,就称为成员内部类,使用的多一些,在类里面的,生命周期要长一些
2. 局部内部类:定义在方法的里面,就称为局部内部类,局部内部类使用的不多,因为它定义在方法里面,方法结束了,那么这个内部类也就结束了,生命周期比较短。
1. 内部类可以直接访问外部类的成员,包括私有的也可以访问
2. 外类类要访问内部类的成员,必须要通过实例化来进行访问
2.数组和集合的区别
一、数组声明了它容纳的元素的类型,而集合不声明。
二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。
三、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。
四、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。
3.ArrayList和LinkedList的区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
(这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于 LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList.)
4. set集合中数据特点?遍历集合的方式有?
唯一,并且无序,不能存储重复的数据,并且存入的顺序和取出的顺序不是一致的。
1. 普通的for循环,可以把循环变量i作业下标来使用,支持在循环集合的同时,还可以对集合中的元素进行增删改查操作
2. 迭代器:使用迭代器遍历集合的同时,不能直接操作原集合数据,只能使用自身的方法来对集合中的数据进行操作
3. 增强for循环,遍历:只能够遍历集合中的元素,遍历的同时不能对它进行remove和add操作
它里面存储的也是Object类型的数据,键和值的类型都是Object类型,键是唯一的,值是不唯一的(值是可以重复的)
存储进来的数据,键是无序的,键也是唯一的。
键如果重复了,就会出现后来的值把前面的值覆盖,相当于是修改的作用。
6.hashtable和hashmap的区别:
1. 线程不同,一个线程安全(hashtable),一个线程不安全(hashmap)
2. hashtable,不可以null键null值,而hashmap是支持null键null值的。
3. hashmap使用的频率要更多一些。
1、随机访问能力
8. ArrayList和Vector底层为数组结构,它们都允许直接按序号索引元素,访问数据的速度非常快
9. LinkedList底层为双向链表的结构,但是链表的存储方式与数组的连续存储方式相比,内存的利用率更高,访问数据相对于ArrayList低
10. 2、插入、删除数据效率
11. ArrayList和Vector插入和删除元素要涉及到数组元素移动等内存的操作,所以效率比较低下
12. LinkedList插入数据时只需要记录本项的前后项即可,速度非常快
13. 3、遍历数据效率
14. ArrayList>Vector>LinkedList
15. 4、线程安全/非安全
16. ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
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));
}
}