JavaSE基础知识点 二(5.14)

6 篇文章 0 订阅

1.Java中的Static

link

2.String,StringBuffer,StringBulider的区别

String、StringBuffer、StringBuilder
String : final修饰,所以是不可变的,即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。
StringBuilder : 它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比StringBuffer 要高。

3.什么是内部类?有什么用?

内部类( Inner Class ):就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
内部类的主要作用如下
1.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2.内部类的方法可以直接访问外部类的所有数据,包括私有的数据
3.内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
内部类可分为以下几种:

1.成员内部类在这里插入图片描述
运行结果:
在这里插入图片描述

2.静态内部类

1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问

2、
如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员

3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();

样例:

//外部类
public class HelloWorld {
    
    // 外部类中的静态变量score
    private static int score = 84;
    
    // 创建静态内部类
	public  static class SInner {
        // 内部类中的变量score
        int score = 91;
        
		public void show() {
			System.out.println("访问外部类中的score:" + HelloWorld.score   );//访问外部类中的score就要使用对应public的内部类的类型
			System.out.println("访问内部类中的score:" + score);//访问内部类中的score可以直接调用
		}
	}

	// 测试静态内部类
	public static void main(String[] args) {
		// 直接创建内部类的对象
        
        SInner si=new SInner();
        // 调用show方法
		si.show();
	}
}

3.方法内部类:

方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。

在这里插入图片描述
一定要注意哦:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。

4.匿名内部类:是内部类的一种特殊情况。它只有一个实例,而且没有引用。所以,一般在能用内部类实现,但是实例只用一次的情况下使用它(可以减少资源开销)

4.Files的常用方法都有哪些?

创建:
createNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false。
mkdir() 在指定位置创建一个单级文件夹。
mkdirs() 在指定位置创建一个多级文件夹。
删除:
delete()
判断:
exists() 文件或文件夹是否存在。
isFile() 是否是一个文件,如果不存在,则始终为false。
isDirectory() 是否是一个目录,如果不存在,则始终为false。
isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
获取:
getName() 获取文件或文件夹的名称,不包含上级路径。

5.Java中的容器有哪些
Collection:
在这里插入图片描述
Map:
在这里插入图片描述
6.List,Set,Map的比较

在这里插入图片描述

List(列表)
 List的元素以线性方式存储,可以存放重复对象,List主要有以下两个实现类:
ArrayList : 长度可变的数组,可以对元素进行随机的访问,向ArrayList中插入与删除元素的速度慢。
JDK8 中ArrayList扩容的实现是通过grow()方法里使用语句
newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍扩容)计算容量,
然后调用Arrays.copyof()方法进行对原数组进行复制。
LinkedList: 采用链表数据结构,插入和删除速度快,但访问速度慢。

Set(集合)
  Set中的对象不按特定(HashCode)的方式排序,并且没有重复对象,Set主要有以下两个实现类:
HashSet: HashSet按照哈希算法来存取集合中的对象,存取速度比较快。
当HashSet中的元素个数超过数组大小*loadFactor(默认值为0.75)时,
就会进行近似两倍扩容(newCapacity = (oldCapacity << 1) + 1)。
TreeSet:TreeSet实现了SortedSet接口,能够对集合中的对象进行排序。

Map(映射)
Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一个键对象和值对象。Map主要有以下两个实现类:
HashMap:HashMap基于散列表实现,其插入和查询<K,V>的开销是固定的,可以通过构造器设置容量和负载因子来调整容器的性能。
LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得<K,V>的顺序是其插入次序, 或者是最近最少使用(LRU)的次序。
TreeMap:TreeMap基于红黑树实现。查看<K,V>时,它们会被排序。TreeMap是唯一的带有subMap()方法的Map,subMap()可以返回一个子树。

7.HashMap 和 Hashtable 有什么区别?

Hashtable是早期Java类库提供的一个哈希表实现,本身是线程安全的,不支持null键和值。由于线程安全导致的性能开销,所以已经很少被推荐使用。

HashMap是应用更加广泛的哈希表实现,行为上大致与Hashtable一致,主要区别在于HashMap不是线程安全的,且支持null键和值等。通常情况下,HashMap进行put或者get操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选。

8.如何决定使用 HashMap 还是 TreeMap?

Map使用情况原因
HashMap查询基于散列表实现(推荐作为常规Map使用)
TreeMap增加、快速创建基于红黑树实现

9.如何实现数组和 List 之间的转换?
link

List转数组:
List.toArray()方法;
数组转List:
Arrays.asList()方法

10.Array 和 ArrayList 有何区别?

1、存储内容比较:
Array 数组可以包含基本类型和对象类型,
ArrayList却只能包含对象类型。
Array 数组在存放的时候一定是同种类型的元素。ArrayList 就不一定了 。

2、空间大小比较: Array 数组的空间大小是固定的,所以需要事前确定合适的空间大小。
ArrayList的空间是动态增长的,而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。

3.方法上的比较: ArrayList方法上比 Array更多样化,比如添加全部 addAll()、删除全部 removeAll()、返回迭代器 iterator() 等。

11.哪些集合类是线程安全的?

Vector:就比Arraylist多了个同步化机制(线程安全)。

Hashtable:就比Hashmap多了个线程安全。

ConcurrentHashMap:是一种高效但是线程安全的集合。

Stack:栈,也是线程安全的,继承于Vector。

enumeration:枚举,相当于迭代器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值