jdk1.7新特性

本文详细介绍了JDK1.7版本中引入的多项新特性,包括数字下划线支持、二进制八进制十六进制表示、ThreadLocalRandom并发生成随机数、改进的switch语句、泛型实例化类型自动推断、异常捕获、资源自动关闭、文件系统改变监听以及文件夹递归遍历等,并通过实例展示了如何在实际开发中应用这些特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         最近研究学习了jdk1.7中新增加的特性,首先需要更换jdk版本,配置环境变量,这样折腾之后,java-version发现是jdk1.7的版本,可是我用eclipse开发的时候,却总是出现语法编译出错。奇了个怪了,不管更换编译时用的jdk还是新建工程时候选择jdk1.7都是不行的,最后重新下载64位的eclipse,后来自然就ok了,看来是之前eclipse的问题。下面一一介绍jdk1.7中的新增特性:

第一:数字允许使用下划线,需要注意的是只能将下划线放置到数字之间

/**
 * 数字允许使用下划线,需要注意的是只能将下划线放置到数字之间
 */
int number = 100_00_00;
System.out.println(number);
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 	3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
第二:直接支持:二进制,八进制,十六进制表示
/**
 * 二进制,八进制,十六进制表示
 */
int binaryNumber = 0b011;//这里表示2进制
System.out.println(binaryNumber);
int eightNumber = 022;//这里表示8进制,转换成十进制是18
System.out.println(eightNumber);
int sixTeenNumber = 0x14;//这里表示16进制,转换成十进制是20
System.out.println(sixTeenNumber);
第三:ThreadLocalRandom并发生成随机数,线程安全

 ThreadLocalRandom localRandom = ThreadLocalRandom.current();
  localRandom.nextDouble();
第四:switch语句允许使用字符串

/**
* switch语句允许使用字符串
 */
String name = "xiaoming";
switch (name) {
<span style="white-space:pre">	</span>case "xiaohong":
	     <span style="white-space:pre">	</span>System.out.println("your name is :"+name);
	<span style="white-space:pre">	</span>break;
	case "xiaoming":
		System.out.println("your name is :"+name);
		break;
	default:
		break;
}
第五:泛型实例化类型自动推断

/**
* 泛型实例化类型自动推断
* Map<String, List<String>> myMap = new HashMap<String, List<String>>();
*/
List<String>list = new ArrayList<>();
Map<String,List<String>>map = new HashMap<>();
第六:Jdk7允许捕获多个异常,注意此时cath中的参数ex是final类型的

/**
 * Jdk7允许捕获多个异常,注意此时cath中的参数ex是final类型的
 */
File file = new File("/local/jdk7/");
try {
	Reader reader = new InputStreamReader(new FileInputStream(file));
	reader.read();
} catch (NullPointerException | IOException ex) {
	ex.printStackTrace();
}

第六:try-with-resources,可以自动关闭相关的资源

/**
 * try-with-resources,可以自动关闭相关的资源
 * (该资源实现了AutoCloseable接口,jdk7为绝大部分资源对象都实现了这个接口)
 * @throws FileNotFoundException 
 */
public String readLine(String filePath) throws IOException {
	try (BufferedReader reader = new BufferedReader(new FileReader(new File(filePath)))) {
		return reader.readLine();
	}
}
第七:WatchService监听文件系统的改变,这里我写了一个方法,传入磁盘下的一个路径,即可监听该路径下文件的改变,删除等。

/**
 * WatchService监听文件系统的改变
 */
public static void testWatchService(Path watchPath) {
	try {
		WatchService watchService = FileSystems.getDefault().newWatchService();
		watchPath.register(watchService,StandardWatchEventKinds.ENTRY_CREATE,
				StandardWatchEventKinds.ENTRY_DELETE,
				StandardWatchEventKinds.ENTRY_MODIFY);

		while(true){  
			WatchKey key = watchService.take();  
			for(WatchEvent<?> event : key.pollEvents()){  
				WatchEvent.Kind kind = event.kind();  

				if(kind == StandardWatchEventKinds.OVERFLOW){//事件可能lost or discarded  
					continue;  
				}  

				WatchEvent<Path> e = (WatchEvent<Path>)event;  
				Path fileName = e.context();  

				System.out.printf("Event %s has happened,which fileName is %s%n"  
						,kind.name(),fileName);  
			}  
			if(!key.reset()){  
				break;  
			}  
		}  

	} catch (IOException | InterruptedException e) {
		e.printStackTrace();
	}
}
然后再main方法中这样调用:

testWatchService(Paths.get("d:","haha"));

这里我是监听的d:/haha这个文件夹中内容的变化,如下图:

第八:FileVisitor递归调用文件夹:

/**
 * 递归调用文件夹
 */
public static void diGuiDirectory(Path directPath) {
	try {
		Files.walkFileTree(directPath,new FileVisitor<Path>() {

			public void find(Path path) {
				System.out.printf("访问-%s:%s%n",(Files.isDirectory(path)?"目录":"文件"),path.getFileName());
			}

			@Override
			public FileVisitResult preVisitDirectory(Path dir,
				<span style="white-space:pre">	</span>BasicFileAttributes attrs) throws IOException {
				// TODO Auto-generated method stub
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFile(Path file,
					BasicFileAttributes attrs) throws IOException {
				// TODO Auto-generated method stub
				find(file);
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFileFailed(Path file,
					IOException exc) throws IOException {
				// TODO Auto-generated method stub
				System.out.println("error:"+exc);  
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult postVisitDirectory(Path dir,
					IOException exc) throws IOException {
				// TODO Auto-generated method stub
				find(dir);
				return FileVisitResult.CONTINUE;
			}
		});
	} catch (IOException e) {
		e.printStackTrace();
	}
}
这里我查询刚才新建的haha文件夹下的文件diGuiDirectory(Paths.get("d:","haha"));
此时,控制台打印如下语句:

访问-文件:test.txt
访问-目录:sdf
访问-文件:test.txt
访问-目录:haha


另外在网上还看到诸如下面这些新特性,这些特性,我不能判断其是否是正确的,反正在我的jdk1.7版本上测试时不成立的。不知道有没有人和我遇到同样的问题,最后又是怎么决绝的。

新增一些取环境信息的工具方法

File System.getJavaIoTempDir() // IO临时文件夹

File System.getJavaHomeDir() // JRE的安装目录

File System.getUserHomeDir() // 当前用户目录

File System.getUserDir() // 启动java进程时所在的目录5

Boolean类型反转,空指针安全,参与位运算

Boolean Booleans.negate(Boolean booleanObj)

True => False , False => True, Null => Null

boolean Booleans.and(boolean[] array)

boolean Booleans.or(boolean[] array)

boolean Booleans.xor(boolean[] array)

boolean Booleans.and(Boolean[] array)

boolean Booleans.or(Boolean[] array)

boolean Booleans.xor(Boolean[] array)

安全的加减乘除 
int Math.safeToInt(long value)

int Math.safeNegate(int value)

long Math.safeSubtract(long value1, int value2)

long Math.safeSubtract(long value1, long value2)

int Math.safeMultiply(int value1, int value2)

long Math.safeMultiply(long value1, int value2)

long Math.safeMultiply(long value1, long value2)

long Math.safeNegate(long value)

int Math.safeAdd(int value1, int value2)

long Math.safeAdd(long value1, int value2)

long Math.safeAdd(long value1, long value2)

int Math.safeSubtract(int value1, int value2)

语法上支持集合,而不一定是数组 

Java代码:

final List<Integer> piDigits = [ 1,2,3,4,5,8 ]; 













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值