解析演示:
1.静态内部类才可以声明静态方法
2.静态方法不可以使用非静态变量
3.抽象方法不可以有函数体
参考答案:选DE. 1、ThreadLocal的类声明: public class ThreadLocal<T> 可以看出ThreadLocal并没有继承自Thread,也没有实现Runnable接口。所以AB都不对。 2、ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。 所以ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立,C选项错。 由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问, 变量被彻底封闭在每个访问的线程中。所以E对。 3、ThreadLocal中定义了一个哈希表用于为每个线程都提供一个变量的副本: 所以D对。
public class ThreadLocal<T> {
/**
* ThreadLocals rely on per-thread linear-probe hash maps attached
* to each thread (Thread.threadLocals and
* inheritableThreadLocals). The ThreadLocal objects act as keys,
* searched via threadLocalHashCode. This is a custom hash code
* (useful only within ThreadLocalMaps) that eliminates collisions
* in the common case where consecutively constructed ThreadLocals
* are used by the same threads, while remaining well-behaved in
* less common cases.
*/
private final int threadLocalHashCode = nextHashCode();
/**
* The next hash code to be given out. Updated atomically. Starts at
* zero.
*/
private static AtomicInteger nextHashCode =
new AtomicInteger();
static class ThreadLocalMap {
/**
* The entries in this hash map extend WeakReference, using
* its main ref field as the key (which is always a
* ThreadLocal object). Note that null keys (i.e. entry.get()
* == null) mean that the key is no longer referenced, so the
* entry can be expunged from table. Such entries are referred to
* as "stale entries" in the code that follows.
*/
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
/**
* The initial capacity -- MUST be a power of two.
*/
private static final int INITIAL_CAPACITY = 16;
/**
* The table, resized as necessary.
* table.length MUST always be a power of two.
*/
private Entry[] table;
File类的一下常用方法和说明
1.访问文件名相关方法:
- String getName(); 返回此File对象所表示的文件名和路径名(如果是路径,则返回最后一级子路径名)。
- String getPath(); 返回此File对象所对应的路径名。
- File getAbsolutePath(); 返回此File对象所对应的绝对路径名。
- String getParent(); 返回此File对象所对应目录(最后一级子目录)的父路径名。
- boolean renameTo(File newName); 重命名此File对象所对应的文件或目录,如果重命名成功,则返回true:否则返回false.(A)
2.文件检测相关方法
- boolean exists(); 判断File对象所对应的文件或目录是否存在。
- boolean canWrite(); 判断File对象所对应的目录或文件是否可写。
- boolean canRead(); 判断File对象所对应的目录或文件是否可读。
- boolean isFile(); 判断File对象所对应的是否是文件,而不是目录。
- boolean isDirectory(); 判断File对象所对应的是否是目录,而不是文件。
- boolean isAbsolute(); 判断File对象所对应的文件或目录是否是绝对路径。该方法消除了不同平台的差异,可以直接判断File对象是否为绝对路径。在UNIX/Linux/BSD等系统上,如果路径名开头是一条斜线(/),则表明该File对象对应一个绝对路径;在Windows等系统上,如果路径开头是盘符,则说明它是绝对路径。
3.获取常规文件信息
- long lastModified(); 返回文件最后修改时间。
- long length(); 返回文件内容的长度。
4.文件操作相关的方法
- boolean createNewFile(); 当此File对象所对应的文件不存在时,该方法将新建的一个该File对象所指定的新文件,如果创建成功则返回true;否则返回false.(C)
- boolean delete(); 删除File对象所对应的文件或路径。
- static File CreateTempFile(String prefix,String suffix);在默认的临时文件目录创建一个临时空文件,使用给定前缀、系统生成的随机数和给定后缀作为文件名。这是一个静态方法,可以直接通过File来调用。preFix参数必须至少是3个字节长。建议前缀使用一个短的、有意义的字符串。建议前缀使用一个短的、有意义的字符串,比如”hjb“ 或”main”. suffix参数可以为null,在这种情况下,将使用默认的后缀”.tmp”.
- static File CreateTempFile(String prefix,String suffix,File directory);在directory所指定的目录中创建一个临时空文件,使用给定前缀、系统生成的随机数和给定后缀作为文件名。这是一个静态方法,可以直接通过File来调用。
- void deleteOnExit(); 注册一个删除钩子,指定当Java虚拟机退出时,删除File对象随对应的文件和目录。
5.目录操作相关方法(D)
- boolean mkdir(); 试图创建一个File对象所对应的目录,如果创建成功,则返回true;否则返回false. 调用该方法时File对象必须对应一个路径,而不是一个文件。
- String[] list(); 列出File对象的所有子文件名和路径名,返回String数组。
- File[] listFiles(); 列出File对象的所有子文件和路径,返回File数组。
- static File[] listRoots(); 列出系统所有的根路径。这是一个静态方法,可以直接通过File类来调用。
- File类使用详解_file:-CSDN博客