首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

《Core Java 2》读书笔记(二)

1,防御性编程。必要时应当考虑采取保护性拷贝的手段来保护内部的私有数据,先来看下面这个例子: 复制代码 pubic final class Period { private final Date start; private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) throw new IllegalArgumentException(start + "after " + end); this.start = start; this.end = end; } public Date getStart() { return start; } public Date getEnd() { return end; } } 复制代码 这个类存在两个不安全的地方,首先来看第一个攻击代码 Date start = new Date(); Date end = new Date(); Period p = new Period(start, end); end.setYear(78);//改变p的内部数据! 这是因为外部和内部引用了同样的数据,为了解决这个问题,应当修改Period的构造函数: 复制代码 public Period(Date start, Date end) { this.start = new Date(start.getTime()); this.end = new Date(end.getTime()); if (start.compareTo(end) > 0) throw new IllegalArgumentException(start + "after " + end); } 复制代码 这样内部的私有数据就与外部对象指向不同,则不会被外部改变 再来看第二个攻击代码: Date start = new Date(); Date end = new Date(); Period p = new Period(start, end); p.getEnd().setYear(78);//改变p的内部数据! 这很显然是由于公有方法暴露了内部私有数据,我们可以只返回内部私有数据的只读版本(即其一份拷贝) 复制代码 public Date getStart() { return (Date)start.clone(); } public Date getEnd() { return (Date)end.clone(); } 复制代码 2,读到上面这个例子,我想起来了下面这样的代码片段 复制代码 public class Suit { private final String name; private static int nextOrdinal = 0; private final int ordinal = nextOrdinal++; private Suit(String name) { this.name = name; } public String toString() { return name; } public int compareTo(Object o) { return o } public static final Suit CLUBS = new Suit("Clubs"); public static final Suit DIAMONDS = new Suit("diamonds"); public static final Suit HEARTS = new Suit("hearts"); public static final Suit SPADES = new Suit("spades"); private static final Suit[] PRIVATE_VALUES = {CLUBS,DIAMONDS,HEARTS,SPADES}; public static final List VALUES = Collections.unmodifiedList(Arrays.asList(PRIVATE_VALUES)); } 复制代码 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/09/28/1575645.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

java日期加减法的实现

感觉用Calendar做日期加减比较好用。 所以需要先获取到Calendar对象 获取当前calendar Calendar cd = Calendar.getInstance(); //日加7天 cd.add(Calendar.DAY_OF_WEEK,7); 根据日期获取calendar Calendar cd = Calendar.getInstance(); Date d = new Date(); cd.setTime(d); cd.add(Calendar.DAY_OF_WEEK,7); 根据字符串获取 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date d = Df.parse("2014-02-19"); Calendar cd = Calendar.getInstance(); Cd.setTime(d); cd.add(Calendar.DAY_OF_WEEK,7); 日期加法 cd.add(Calendar.DAY_OF_WEEK,7); 日期减法 cd.add(Calendar.DAY_OF_WEEK,7); 归根结底Calendar对象的获得是通过字符串和日期、日历的互转得到的。 日期的加减是通过Calendar实现的。 日期的格式化是通过DateFormat实现的。 从日期字符串到日期类的解析是通过DateFormat实现的。 所以DateFormater是一个很重要的类,实现了日期对象和日期串的互转。 本文转自博客园zhyiwww的博客,原文链接:http://www.blogjava.net/zhyiwww/,如需转载请自行联系原博主。

优秀的个人博客,低调大师

JAVA之二叉查找树

一:二叉树的概念: 二叉树指的是每个节点最多只能有两个子树的有序树。通常左边的子树被称为“左子树”,右边的子树被称为“右子树”。由此可见,二叉树仍然是树,只是一种特殊的树。 二叉树的每个节点最多只有两棵子树(不存在大于2的节点)。二叉树有左、右之分,不能颠倒。 树和二叉树的两个重要区别如下: 1.树中节点的最大度数没有限制,而二叉树节点的最大度数为2,也就是说,二叉树的节点最大度数为2。 2.无序树的节点无左右之分,而二叉树的节点有左右之分,也就是说二叉树是有序树。 满二叉树: 一棵深度为K的二叉树,如果它包含了2^K - 1个节点,就把这棵二叉树称为满二叉树。满二叉树的特点是,每一层上的节点数都是最大节点数,即各层节点数分别为1,2,4,8,16,32,……,2^(K-1) 。 完全二叉树: 如果一棵二叉树除最后一层外,其余所有的节点都是满的,并且最后一层或者是满的,或者仅在右边缺少若干连续的节点,则此二叉树就是完全二叉树。 区别:满二叉树是一种特殊的完全二叉树。当完全二叉树最后一层的所有节点都是满的情况下,这棵完全二叉树就变成了满二叉树。 二:实现二叉树的基本操作: 首先定义我们的节点类: 1 package mytree; 2 3 public class Node { 4 int value;//值域 5 Node left;//左子节点 6 Node right;//右子节点 7 public Node(int value) { 8 this.value=value; 9 } 10 @Override 11 public String toString() { 12 return String.valueOf(value); 13 } 14 15 public void display(){ 16 System.out.print(this.value+"\t"); 17 } 18 19 } 定义我们的方法类: 1 public class BinaryTree { 2 private Node root = null; 3 4 public BinaryTree(int value) { 5 root = new Node(value); 6 root.left = null; 7 root.right = null; 8 } 9 } 1.实现添加节点: 第一种: 1 public String insert(int value) { // 插入 2 String error = null;//错误 3 Node now = new Node(value);//创建要插入的节点 4 Node curr = root;//获取到根节点 5 if (curr == null) {//如果根节点为空 6 curr = now;//就把要插入的节点作为根节点 7 } else { 8 while (true) { 9 Node parent = null;//先创建一个临时存放节点 10 if (curr.value > value) {//如过当前节点>要插入的节点,就把节点插入到左子节点 11 parent = curr;//把主节点赋值给他 12 curr = curr.left;//获取到左子节点 13 if (curr == null) {//如果左子节点为空的话 14 parent.left = now;//插入 15 break; 16 } 17 } else if (curr.value < value) { 18 parent = curr; 19 curr = curr.right; 20 if (curr == null) { 21 parent.right = now; 22 break; 23 } 24 } else { 25 error = "树里面有了相同的值:"; 26 } 27 } 28 } 29 return error; 30 } 第二种递归添加: 1 /* 2 * 插入递归调用实现 3 * 4 * */ 5 public Node insert2(Node node, int data) { 6 if (node == null) { 7 node = new Node(data); 8 } else { 9 if (data <= node.value) { 10 node.left = insert2(node.left, data); 11 } else { 12 node.right = insert2(node.right, data); 13 } 14 } 15 return (node); 16 } 17 2.定义一个直接返回整个二叉树的方法: 1 public Node getrootNode(){//返回整个二叉树 2 return root; 3 } 3.定义一个遍历节点的方法(中序遍历): 1 /** 2 * //中序遍历(递归): 3 * 1、调用自身来遍历节点的左子树 4 * 2、去取得当前节点 5 * 3、调用自身来遍历节点的右子树 6 */ 7 public void inOrderTraverse(Node node) { 8 if (node == null) 9 return ; 10 inOrderTraverse(node.left); 11 node.display(); 12 inOrderTraverse(node.right); 13 } 14 4.我们创建一个测试类看看我们的方法是不是写的都是正确的: 1 package mytree; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 BinaryTree b=new BinaryTree(12); 8 b.insert(10);//普通插入方法 9 Node no=b.getrootNode();//获取到二叉树对象 10 b.insert2(no, 20);//通过递归插入 11 no=b.getrootNode(); 12 b.inOrderTraverse(no);//中序遍历 13 } 14 } 运行为: 看来写的添加节点与遍历节点都是可以的; 5.前序遍历: 1 /*前序遍历 2 * 访问节点 3 * 访问自身来遍历左子树 4 * 访问自身来遍历右子树 5 * */ 6 public void PreOrderTraverse(Node node) { 7 if (node == null) 8 return; 9 inOrderTraverse(node.left); 10 node.display(); 11 inOrderTraverse(node.right); 12 } 6.后序遍历: 1 /*后序遍历 2 * 3 * 访问自身来遍历左子树 4 * 访问自身来遍历右子树 5 * 访问节点 6 * */ 7 public void nexOrderTraverse(Node node) { 8 if (node == null) 9 return; 10 inOrderTraverse(node.left); 11 inOrderTraverse(node.right); 12 node.display(); 13 } 7.得到最小值:(其实也就是一直遍历左子树直到空) 1 public int getMinValue() { 2 Node current = root; 3 while (true) { 4 if (current.left== null) 5 return current.value; 6 7 current = current.left; 8 } 9 } 8.得到最大值:(其实也就是一直遍历右子树直到空) 1 2 public int getMaxValue() { 3 Node current = root; 4 while (true) { 5 if (current.right== null) 6 return current.value; 7 8 current = current.right; 9 } 10 } 临时有事,查找删除再整理; 欢迎大家一起说出自己的想法。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册